关于 Java 类加载 / 初始化构造 / 继承陷阱

问:下面程序的运行结果是什么?
        public class Base {
            public Base() {
                test();
            }

            public void test() {
            }
        }
        public class Child extends Base {
            private int a = 123;

            public Child() {
            }

            public void test() {
                System.out.println(a);
            }
        }
        public static void main (String[]args ){
            Child c = new Child();
            c.test();
        }

答:输出结果如下。
0
123

原因是 Child 类直接继承于 Base 类,默认构造方法虽然没有显示调用 super 但是也会直接调用父类的默认构造函数,所以上面程序首先调用 Base.java 的 test() 方法,这时 Child 类还没有构造完毕,a 是基本数据类型且还没有被赋值,a 又为成员变量,所以默认值为 0。

在父类的构造方法中调用可被重写的方法会调用子类中重写后的方法。

因此如果在父类构造方法中调用了可被重写的方法则可能会出现意想不到的效果,大家一定要慎重使用,最好在父类构造中只调用 private 方法。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,982评论 19 139
  • 父类 static 块 1 执行 父类 静态成员staticSam1初始化 父类 静态成员staticSam2初始...
    YCix阅读 1,347评论 0 0
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,767评论 18 399
  • 20- 枚举,枚举原始值,枚举相关值,switch提取枚举关联值 Swift枚举: Swift中的枚举比OC中的枚...
    iOS_恒仔阅读 2,314评论 1 6
  • 晚饭后和老妈看剧,看到一只狗吃了巧克力(此为背景)出现了如下对话 我:这狗要死了 妈:为什么 我:因为狗不能吃巧克...
    森屿与微光阅读 935评论 0 0