题目:找出含有ATypeName的代码段,将起改写成完整的程序,然后编译,运行。
含有ATypeName的代码段在书本25面,是以下两句代码:
class ATypeName {/* Class body goes here */}
ATypeName a = new ATypeName();
根据昨天所学,一个java程序想要运行,必须有一个main。
代码如下:
public class ATypeName {
public static void main(String[] args) {
ATypeName a = new ATypeName();
}
}
不过,当笔者尝试用另一种写法时,却出错了
public class test2_3 {
public static void main(String[] args) {
ATypeName A = new ATypeName();
}
class ATypeName {
}
}
编译器报错:无法从静态上下文中引用非静态方法this
我们知道,程序运行先加载的是所有静态对象,而main又是所有静态对象里第一个被加载的,由于ATypeName()对象属于test2_3()对象,此时
test2_3()对象还未实例化,自然找不到它的内部类ATypeName()。要想解决这个问题,有两种方法,一种是给ATypeName()加上static。这时程序就能顺利运行。另一种就是先实例化test2_3()对象,再实例化ATypeName(),代码如下:
ATypeName A = new test2_3().new ATypeName();
同样的道理,静态方法中同样不能调用非静态方法和非静态变量,要想调用,要先实例对应的类再调用。
这里因为涉及到内部类的问题,所以显的有些复杂,关于内部类暂不深究。
以上。