代码如下所示,TestEX是非静态类,而它的主方法是静态的,TestEX类中含有两个内部类,两个内部类也是非静态的,内部类中的方法同样也是非静态的。
问题是:在静态的主方法中,实例化了内部类,为什么就可以调用非静态了呢?
哪个圈绕不出来了,求帮助!
public class TestEX{
public class IntegerException extends Exception {
String message;
public IntegerException(int m) {
message = "age " + m +" is wrong!";
}
public String toString() {
return message;
}
}
public class People {
private int age;
void setAge(int age) throws IntegerException {
if (age >= 160 || age <= 0) {
throw new IntegerException(age);
}
else {
this.age = age;
}
}
int getAge() {
System.out.println("age " + age + " is right!");
return age;
}
}
public static void main(String[] args) {
TestEX.People wang = new TestEX().new People();
TestEX.People zhang = new TestEX().new People();
try{
wang.setAge(180);
System.out.println(wang.getAge());
}catch(IntegerException e){
System.out.println(e.toString());
}
try{
zhang.setAge(37);
System.out.println(zhang.getAge());
}catch (IntegerException e) {
System.out.println(e.toString());
}
}
}
静态方法中不能调用非静态方法,原因是因为静态方法没有this指向实例。所以不能有非静态方法。
如果是实例.非静态方法,这有明确的this指向。所以这不是“静态方法中不能调用非静态方法”所描述的意思。
TestEX.People wang = new TestEX().new People();
也许是new TestEx() 时候创建新的引用了吧
改成 this.new People() 这样应该就访问不了
我是刚学不久哈,说错了别怪我哟 (●'◡'●)
非静态的就是需要实例了。既然你已经实例化了内部类,内部类的方法就都可以调用了。
因为实例化了内部类,能不能调用非静态方法不取决于它是不是内部类,也不管它的外部类是不是静态的,只要它本身被实例化就可以。
一个类A静态方法M,那么调用A的静态方法M,一般都是使用A.M()。
一个类A非静态方法m,那么调用方法m,只能先实例化一个A对象a,并通过a去调用方法m(),比如 A a = new A(); a.m();
(静态方法、非静态方法,当然都是存在作用域的,以上的内容是假定作用域都是可用的。)