静态方法的方法内部类是什么时候加载?
静态方法的方法内部类和其他方法的内部类一样,也不能用static修饰。
静态方法和静态属性(包括静态内部类)都是随着类一起加载、不必等实例化;
非静态方法则是需要实例化之后才可用。
静态方法的方法内部类是什么时候加载?类加载的时候,还是实例化的时候?
正在回答
同学你好,这边去请教了一下老师,得到如下回复:
静态方法的内部类是在第一次使用的时候加载。
程序示例1:
验证静态方法的内部类在未被使用的时候,不会被加载:
class Man{ static public void test(){ class Woman{ { System.out.println("内部类被加载"); } public Woman() { System.out.println("构造方法被执行"); } } // Woman woman = new Woman(); } public static void main(String[] args) { System.out.println("程序开始"); Man.test(); } }
结果只输出了“程序开始”。
程序示例2:
class Man{ static public void test(){ class Woman{ { System.out.println("内部类被加载"); } public Woman() { System.out.println("构造方法被执行"); } } Woman woman = new Woman(); } public static void main(String[] args) { System.out.println("程序开始"); Man.test(); } }
和程序1的区别是将注释取消,程序运行结果是:
事实上,内部类(不论是静态内部类还是非静态内部类)都是在第一次使用时才会被加载,并不会因为这个类在静态方法中而有所不同。
在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。广泛意义上的内部类一般来说包括这四种:成员内部类、局部内部类、匿名内部类和静态内部类。
同学想问的应该是,为什么在方法内,无法创建静态的内部类,那我们就先看一下方法的普通(非静态)内部类——局部内部类:局部内部类是定义在一个方法里面的类,局部内部类的访问仅限于方法内,例如:
class Man{ public Man(){ } public People getWoman(){ class Woman extends People{ //局部内部类 int age =0; } return new Woman(); } }
而如果把这里的Woman类前面加上static,编译器会报错:Modifier "static" not allowed here. 这说明无法在方法内创建静态内部类。
下面我们看一下正常的静态内部类:
class Outter { public Outter() { } static class Inner { public Inner() { } } }
静态内部类也是定义在另一个类里面的类(而不是方法内),只不过在类的前面多了一个关键字static。静态内部类是不需要依赖于外部类的,这点和类的静态成员属性有点类似,并且它不能使用外部类的非static成员变量或者方法,这点很好理解,因为在没有外部类的对象的情况下,可以创建静态内部类的对象,如果允许访问外部类的非static成员就会产生矛盾,因为外部类的非static成员必须依附于具体的对象。
到这里我们就可以理解了,为什么在方法内部不允许创建静态内部类?最主要是因为方法内的内部类的作用域仅限于方法内部,不能在方法外生效,而static的作用却恰恰是让该类全局生效,这就和方法内部类的作用范围冲突了。另外,由于静态内部类的创建是不依附于外部类的,所以如果方法内部有静态内部类,那么在创建该静态内部类的时候势必和该方法相关,该方法需要依赖具体的外部类对象,这也和“没有外部类的对象的情况下,可以创建静态内部类的对象”的规则矛盾了,所以,在方法内,语法规定无法创建静态的内部类。
祝学习愉快~
- 参与学习 人
- 提交作业 9393 份
- 解答问题 16556 个
综合就业常年第一,编程排行常年霸榜,无需脱产即可学习,北上广深月薪过万 无论你是未就业的学生还是想转行的在职人员,不需要基础,只要你有梦想,想高薪
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星