深圳网站搭建价格,网站建设 客户定位,wordpress与数据库,杭州网站制作外包这篇文章主要介绍了Java构造器使用方法及注意事项的相关资料,这里举例说明如何使用构造器及需要注意的地方#xff0c;需要的朋友可以参考下Java构造器使用方法及注意事项超类的构造器在子类的构造器运行之前运行#xff0c;也就是说#xff0c;在创建对象时#xff0c;先运…这篇文章主要介绍了Java构造器使用方法及注意事项的相关资料,这里举例说明如何使用构造器及需要注意的地方需要的朋友可以参考下Java构造器使用方法及注意事项超类的构造器在子类的构造器运行之前运行也就是说在创建对象时先运行超类中的构造器然后再运行子类中的构造器此时如果在执行超类构造器的时候构造器执行了可覆盖的方法那么就会去调用子类中的该方法而此时子类还未被实例化此时就有可能出问题。以一个例子说明public class Super {int age 10;protected void say() {System.out.println(super);}public Super() {override();}public void override() {System.out.println(super override);}}class Sub extends Super {int age 9;private final Date date;public Sub() {date new Date();}Overridepublic void override() {System.out.println(date);}Overrideprotected void say() {System.out.println(sub);}public static void main(String[] args) {Super sub new Sub();sub.override();// sub.say();// System.out.println(sub.age);}}创建两个类一个 Super.java其中定义一个成员变量 age10,并且在构造器中调用了 override() 方法。Sub.java 继承了 Super.java并且在构造方法中初始化了 date。现在我们执行 main 方法控制台会打印出什么呢 是一个 date? 还是两个 date? 答案是先打印出 null然后打印出具体的 date 值。并且如果在 Sub.java 的 override 方法中调用 date 的任意方法时会出现 NPE为什么会这样呢我们知道在使用 new 来创建对象的时候会先检查该类是否继承自父类如果是则会先调用父类的构造方法该案例中在 new Sub() 时发现 Sub 是 Super 的子类于是先调用 Super 的构造方法在 Super 构造方法中发现调用了 override 方法于是又去寻找子类 Sub 是否重写了 override 方法发现该子类重写了则调用子类的 override打印出 date而此时 date 还未被初始化所以值为 null。在父类的构造方法执行完毕后再执行子类的构造方法此时 date 被初始化了所以再次调用 override 方法时则会正确打印出 date。当调用 sub.age会打印出什么呢是 10 还是 9 其实是打印出 10创建对象的时候实例变量有两种类型前面是声明类型后面是实际类型Super sub new Sub();sub 的声明类型为 Super实际类型为 Sub。当调用成员变量的时候会先在声明类型中寻找该变量如果该变量存在则使用声明类型中的变量值如果不存在则在实际类型中去寻找该变量。而调用方法的话优先在子类中寻找对应方法如果子类中不存在再调用父类中方法。