内部类

1、为什么java的非静态内部类中不能有static属性,却能有static final属性?

package Thread01;
public class Test01 {
    public class Inner{
        //static int a=1;
        final static int b=1;
    }
}

java类加载顺序,首先加载类,执行static变量初始化,接下来执行对象的创建。我们可以把内部类Inner看成外部类的非静态成员,它的初始化必须在外部类对象创建后以后进行,要加载内部类必须在实例化外部类之后完成 ,但是java虚拟机要求所有的静态变量必须在对象创建之前完成,这样便产生了矛盾。所以非静态内部类不能有静态属性或者方法。而java常量放在内存中常量池,它的机制与变量是不同的,编译时,加载常量是不需要加载类的,所以就没有上面那种矛盾。
2、为什么成员内部类可以用static修饰,而局部内部类不可以?
因为局部变量不可以用static修饰,内部类可以简化看成具有独特属性的变量,局部内部类,那是局部变量。而 static修饰的是类变量,作用于整个类空间,局部变量是有作用范围的,不能出了范围还能有效,所以也就不能用static修饰了。
3、为什么静态方法中不能new内部类的实体对象?
因为1.内部类可以访问外部类的成员变量。2.对象创建完成后对象的成员变量才会被分配空间。3.main的静态方法执行时可以不存在外部类,不创建实体对象。4.内部类能访问成员变量意味着一定存在外部类实体对象因为3和4矛盾。所以在静态方法中不能new内部类的实体对象。
遇到这种问题可以两种方法解决:

package Thread01;

public class Test02 {
    public static void main(String[] args) {
        final Inner inner = new Inner();//final修饰
        new Thread(new Runnable() {
            @Override
            public void run() {
                inner.show("yangcheng");
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                inner.show("jackma");
            }
        }).start();
    }
    static class Inner {//static修饰内部类
        public void show(String name) {
            while (true) {
                for (int i = 0; i < name.length(); i++) {
                    System.out.print(name.charAt(i));
                }
                System.out.println();
            }
        }
    }
}
package Thread01;

public class Test03 {
    public static void main(String[] args) {
        new Test03().init();//创建一个外部类实例
    }
    public void init(){//创建一个外部类的非static方法
        final Inner inner=new Inner();//final修饰
        new Thread(){
            @Override
            public void run() {
                inner.show("好好学习!");
            }

        }.start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                inner.show("天天向上!");
            }
        }).start();
    }

    class Inner {
        public void show(String name) {
            while (true) {
                for (int i = 0; i < name.length(); i++) {
                    System.out.print(name.charAt(i));
                }
                System.out.println();
            }
        }
    }
}

4、方法中的内部类(局部内部类)为什么不能访问局部变量?但是可以访问final修饰的常量,
方法中的内部类的生命周期和方法中的局部变量是不一样的,方法中的内部类是也是一个类,是存储在堆中,也只有当对该类的引用消失时,方法中的内部类才会消亡。而方法的局部变量是存储在堆栈中的,当调用结束时就会退栈,即在内存中这个属性就消失了。也就是说,方法中的内部类的生命周期超过了方法中局部变量的生命周期,方法中的内部类可能会调用到已经消失的属性,因此方法中的内部类不能访问方法中的局部变量。
解决方法就是在局部变量前加修饰符final,此时局部变量就会存在堆中,生命周期跟工程的生命周期是一样的,此时内部类就可以访问方法中的局部变量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值