Java 类继承与静态/非静态成员调用

问:下面程序代码段的执行结果是什么?
        public class Base {
            public static String s = "static_base";
            public String m = "base";

            public static void staticTest() {
                System.out.println("base static: " + s);
            }
        }
        public class Child extends Base {
            public static String s = "child_base";
            public String m = "child";

            public static void staticTest() {
                System.out.println("child static: " + s);
            }
        }
        public static void main (String[]args ){
            Child c = new Child();
            Base b = c;
            System.out.println(b.s);
            System.out.println(b.m);
            b.staticTest();
            System.out.println(c.s);
            System.out.println(c.m);
            c.staticTest();
        }

答:输出结果如下。

static_base
base
base static: static_base
child_base
child
child static: child_base

可以看到,上面代码段当通过 b 访问时,访问的是 Base 的变量和方法,当通过 c 访问时,访问的是 Child 的变量和方法,这就是所谓的静态绑定,即访问绑定到变量的静态类型,静态绑定在程序编译阶段即可决定,而动态绑定则要等到程序运行时,实例变量、静态变量、静态方法、private 方法都是静态绑定。

继承重名是允许的,重名后实质有两个变量或者方法。(继承重名,比如说子类和父类都有一个 A 方法或者 B 变量。)

  • 对于 private 变量和方法,他们只能在类内被访问,访问的也永远是当前类(即子类中访问子类的,父类中访问父类的),仅仅是名字相同而已,没有任何关系;

  • 对于 public 变量和方法要看如何访问它,在类内部访问的是当前类的,单子类可以通过 super 明确指定访问父类的,在类外则要看访问变量的静态类型,静态类型是父类,则访问父类的变量和方法,静态类型是子类,则访问子类的变量和方法。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一、继承 当两个事物之间存在一定的所属关系,即就像孩子从父母那里得到遗传基因一样,当然,java要遗传的更完美,这...
    玉圣阅读 1,135评论 0 2
  • 一、Java 简介 Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计...
    子非鱼_t_阅读 4,716评论 1 44
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 35,143评论 18 399
  • 人心惶惶,爱情在每个人心中都有定论,冷暖自知。 但是不可不说的是,爱情失了血色呢? 都在被裹挟前行,一堆人推推搡搡...
    罗嫚阅读 378评论 2 6
  • 一 晚饭时,哥哥送来几只活螃蟹,说:今儿就蒸了吧,趁还活着,不然不好吃了。 于是拿起蒸锅,放上水。我妈拿手直接提着...
    ylf立方米阅读 304评论 0 0

友情链接更多精彩内容