服务器之家

服务器之家 > 正文

Java构造器使用方法及注意事项

时间:2020-12-08 13:41     来源/作者:jianshu

Java构造器使用方法及注意事项

超类的构造器在子类的构造器运行之前运行,也就是说,在创建对象时,先运行超类中的构造器,然后再运行子类中的构造器,此时,如果在执行超类构造器的时候,构造器执行了可覆盖的方法,那么就会去调用子类中的该方法,而此时子类还未被实例化,此时就有可能出问题。

以一个例子说明:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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();
}
@Override
public void override() {
System.out.println(date);
}
@Override
protected 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,其中定义一个成员变量 age=10,并且在构造器中调用了 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,创建对象的时候,实例变量有两种类型,前面是声明类型,后面是实际类型

?
1
Super sub = new Sub();

sub 的声明类型为 Super,实际类型为 Sub。

当调用成员变量的时候,会先在声明类型中寻找该变量,如果该变量存在,则使用声明类型中的变量值,如果不存在,则在实际类型中去寻找该变量。

而调用方法的话,优先在子类中寻找对应方法,如果子类中不存在,再调用父类中方法。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持,如有疑问请留言,本站还有很多java 的文章,欢迎大家搜索参阅!

原文链接:http://www.jianshu.com/p/b917ba29aa3b

标签:

相关文章

热门资讯

2022年最旺的微信头像大全 微信头像2022年最新版图片
2022年最旺的微信头像大全 微信头像2022年最新版图片 2022-01-10
蜘蛛侠3英雄无归3正片免费播放 蜘蛛侠3在线观看免费高清完整
蜘蛛侠3英雄无归3正片免费播放 蜘蛛侠3在线观看免费高清完整 2021-08-24
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
暖暖日本高清免费中文 暖暖在线观看免费完整版韩国
暖暖日本高清免费中文 暖暖在线观看免费完整版韩国 2021-05-08
返回顶部