Java常见疑难问题-类13


41. instanceof与转型
System.out.println(null instanceof String);//false
System.out.println(new Object() instanceof String);//false
//能通过
System.out.println((Object) new Date() instanceof String);//false
//!!程序不具有实际意义,但时不能通过
//!!System.out.println(new Date() instanceof String);
//!!运行时抛ClassCastException,这个程序没有任何意义,但可以
//!!System.out.println((Date) new Object());

null可以表示任何引用类型,但是instanceof操作符被定义为在其左操作数为null时返回
false。

如果instanceof告诉你一个对象引用是某个特定类型的实例,那么你就可以将其转型为该类
型,并调用该类型的方法,而不用担心会抛出ClassCastException或NullPointerException异
常。

instanceof操作符有这样的要求:左操作数要是一个对象的或引用,右操作数是一个引用类
型,并且这两个操作数的类型是要父子关系(左是右的子类,或右是左的子类都行),否则
时就会出错。
42. 父类构造器调用已重写的方法
public class P {
private int x, y;
private String name;

P(int x, int y) {
this.x = x;
this.y = y;
// 这里实质上是调用子类被重写的方法
name = makeName();
}

protected String makeName() {
return “[” + x + “,” + y + “]”;
}

public String toString() {
return name;
}

}

class S extends P {
private String color;

S(int x, int y, String color) {
super(x, y);
this.color = color;
}

protected String makeName() {
return super.makeName() + “:” + color;
}

public static void main(String[] args) {
System.out.println(new S(1, 2, “red”));// [1,2]:null
}
}
在一个构造器调用一个已经被其子类重写了的方法时,可能会出:如果子类重写的方法
要访问的子类的域还未初始化,因为这种方式被调用的方法总是在实例初始化之前执行。要
想避免这个,就千万不要在父类构造器中调用已重写的方法。
43. 静态域与静态块的初始顺序
public class T {
public static int i = prt();
public static int y = 1;
public static int prt() {
return y;
}

public static void main(String[] args) {
System.out.println(T.i);// 0
}
}
上面的结果不是1,而是0,为什么?

类初始化是按照静态域或静态块在中出现的顺序去执行这些静态初始器的(即谁先定
义,就先初始化谁),上现程序中由于i先于y声明,所以先初始化i,但由于i初始化时需
要由y来决定,此时y又未初始化,实为初始前的值0,所以i的最后结果为0。

声明: 除非转自他站(如有侵权,请联系处理)外,本文采用 BY-NC-SA 协议进行授权 | 智乐兔
转载请注明:转自《Java常见疑难问题-类13
本文地址:https://www.zhiletu.com/archives-246.html
关注公众号:智乐兔

赞赏

wechat pay微信赞赏alipay pay支付宝赞赏

上一篇
下一篇

相关文章

在线留言

你必须 登录后 才能留言!

在线客服
在线客服 X

售前: 点击这里给我发消息
售后: 点击这里给我发消息

智乐兔官微