JAVA内部类

一:成员内部类

package test;

public class Test4 {
    private String a;
    public static int i = 9;
    public int si = 9;

    public void say() {
        // 外部类直接new 内部类访问内部类XX
        getT().sayT();
    }

    public T getT() {
        return new T();
    }

    public static void main(String[] args) {
        //new Test4().say();
        //创建成员内部类对象

        //第一种方法
        Test4 test4 = new Test4();
        T t =test4.getT();

        //第二种方法
        T t1 = new Test4().new T();
    }

    public class T {
        private String a;
        public int si = 10;

        public void sayT() {
            // 如果外部类与内部类有相同的成员变量和方法,使用外部
            // 类.this.XX 访问外部类XX
            System.out.println(Test4.this.si);
        }
    }
}

再说说修饰符:
这里写图片描述
两个极端的,public不用说,无论在哪儿,随便访问。private只能在类的内部访问,但是其他地方也是可以访问的,比如一个对象的属性为private,可以开放一个接口供外部引用,也就是setter,getter。protected除了外部包,其余都能访问,default只能在内以及本包访问。虽然protected不能在外部包访问,但是可以在中间加一个类继承有protected属性以及方法的类,然后类再继承这个类就可以访问了。

二:局部内部类
局部内部类是定义在一个方法或者一个作用域里面的类

package test;

public class LocalInner {
    private String a = "1";
    private static int t = 12;
    private final String b = "haha";

    public void getInfo() {
        String b = "ha";
        class Inner {
            private String a = "nidaye";

            public void show() {
                System.out.println(a);
                System.out.println(LocalInner.this.a);
                System.out.println(b);
                System.out.println(LocalInner.this.b);
                System.out.println(t);
            }
        }
        new Inner().show();
    }

    public static void main(String[] args) {
        new LocalInner().getInfo();
    }
}

三:匿名内部类
匿名内部类也就是没有名字的内部类

正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写

但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口

如果一个接口实现只使用一次,可以使用匿名内部类
interface Person {
    public void eat();
}

public class Demo {
    public static void main(String[] args) {
        Person p = new Person() {
            public void eat() {
                System.out.println("eat something");
            }
        };
        p.eat();
    }
}
而不用新建一个实现类然后再实例化实现类。
最常用的情况就是在多线程的实现上,因为要实现多线程必须继承Thread类或是继承Runnable接口

四:静态内部类
就是在成员内部类前加上static,在静态内部类不能访问外部内非static的变量和方法。并且静态内部类在第一次被引用时被加载,而且其加载过程是线程安全的(实现线程安全),所以用来实现单例模式最合适。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值