Java常见疑难问题-类14


44. 请使用引用类型调用静态方法
public class Null {
public static void greet() {
System.out.println(“Hello world!”);
}

public static void main(String[] args) {
((Null) null).greet();
}
}
上面程序运行时不会打印NullPointerException异常,而是输出”Hello world!”,关键原因是:
调用静态方法时将忽略前面的调用对象或表达示,只与对象或表达式计算结果的类型有关。

在调用静态方法时,一定要使用类去调用,或是静态导入后直接使用。
45. 循环中的不能声明局部变量
for (int i = 0; i Object o ; //!! 不能通过

for (int i = 0; i Object o = new Object(); //!! 不能通过

一个本地变量声明看起来像是一条语句,但是从技术上来说不是。

语言规范不允许一个本地变量声明语句作为一条语句在for、while或do循环中重复执
行。

一个本地变量声明作为一条语句只能直接出现在一个语句块中(一个语句块是由一对花 括
号以及包含在这对花括号中的语句和声明构成的):
for (int i = 0; i Object o = new Object(); // 编译OK
}
46. 内部类反射
public class Outer {
public class Inner {
public String toString() {
return “Hello world”;
}
}
public void getInner() {
try {
// 普通方式创建内部类实例
System.out.println(new Outer().new Inner());// Hello world
//!! 反射创建内部类,抛.lang.InstantiationException:Outer$Inner
System.out.println(Inner.class.newInstance());
} catch (Exception e) {
}
}
public static void main(String[] args) {
new Outer().getInner();
}
}
上面因为构造内部类时外部类实例不存在而抛

一个非静态的嵌套类的构造器,在的时候会将一个隐藏的参数作为它的第一个参数,这
个参数表示它的直接外围实例。如果使用反射创建内部类,则要传递个隐藏参数的唯一方法
就是使用.lang.reflect.Constructor:
Constructor c = Inner.class.getConstructor(Outer.class);//获取带参数的内部类构造函数
System.out.println(c.newInstance(Outer.this));//反射时还需传进外围类

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

赞赏

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

上一篇
下一篇

相关文章

在线留言

你必须 登录后 才能留言!

在线客服
在线客服 X

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

智乐兔官微