静态方法的方法内部类是什么时候加载?

静态方法的方法内部类是什么时候加载?

静态方法的方法内部类和其他方法的内部类一样,也不能用static修饰。


静态方法和静态属性(包括静态内部类)都是随着类一起加载、不必等实例化;

非静态方法则是需要实例化之后才可用。


静态方法的方法内部类是什么时候加载?类加载的时候,还是实例化的时候?

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

同学你好,这边去请教了一下老师,得到如下回复:

静态方法的内部类是在第一次使用的时候加载。

程序示例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的区别是将注释取消,程序运行结果是:

http://img1.sycdn.imooc.com//climg/5fffc13209aa8abb02120097.jpg

事实上,内部类(不论是静态内部类还是非静态内部类)都是在第一次使用时才会被加载,并不会因为这个类在静态方法中而有所不同。


在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的作用却恰恰是让该类全局生效,这就和方法内部类的作用范围冲突了。另外,由于静态内部类的创建是不依附于外部类的,所以如果方法内部有静态内部类,那么在创建该静态内部类的时候势必和该方法相关,该方法需要依赖具体的外部类对象,这也和“没有外部类的对象的情况下,可以创建静态内部类的对象”的规则矛盾了,所以,在方法内,语法规定无法创建静态的内部类。

祝学习愉快~


好帮手慕阿满 2021-01-13 16:57:51

同学你好,静态方法的方法内部类应该是在第一次使用时加载的。

祝学习愉快~

  • 提问者 慕侠8439273 #1
    那为什么静态方法的内部类不能是静态的呢
    2021-01-13 19:19:50
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师