内部类。。

什么是内部类?

在 Java 中,可以将一个类定义在另一个类或者一个方法的内部, 前者称为内部类,后者称为外部类。内部类也是封装的一种体现。
内部类主要有:
实例内部类
静态内部类
匿名内部类
局部内部类

实例内部类

即未被 static 修饰的成员内部类。
class OuterClass{
    public int date1 = 1;

    public static int date2 = 2;

    private int date3 = 3;

    class InnerClass{
        public int date1 = 111;

        public int date4 = 4;
        public static final int date5 = 5;//编译时就确定了
        private int date6 = 6;

        public void test(){
            System.out.println("InnerClass::test()"+date5);
            System.out.println(date1);
            System.out.println(OuterClass.this.date1);
            System.out.println(date2);
            System.out.println(date3);
            System.out.println(date4);
            System.out.println(date5);
            System.out.println(date6);
        }
    }

    public void test(){
        InnerClass innerClass = new InnerClass();
        System.out.println("OuterClass::test()");

    }
}
public class Test {
    public static void main(String[] args) {
        OuterClass outerClass = new OuterClass();
        OuterClass.InnerClass innerClass = outerClass.new InnerClass();
        innerClass.test();
    }
}

对于实例内部类包含两个this。

注:

1. 外部类中的任何成员都可以在实例内部类方法中直接访问
2. 实例内部类也受 public private 等访问限定符的约束
3. 在实例内部类方法中访问同名的成员时,优先访问自己的,如果要访问外部类同名的成员,必须:外部类名称.this. 同名成员 来访问
4. 实例内部类对象必须在先有外部类对象前提下才能创建
5. 实例内部类的非静态方法中包含了一个指向外部类对象的引用
6. 外部类中不能直接访问实例内部类中的成员,如果要访问必须先要创建内部类的对象。
内部类的字节码文件名称:

静态内部类

static修饰的内部成员类称为静态内部类。

class Out{
    public int date1 = 1;
    public static int date2 = 2;
    private int date3 = 3;

    static class InnerClass{
        public int date4 = 4;
        public static int date5 = 5;
        private int date6 = 6;

        public void test(){
            Out out = new Out();
            System.out.println("InnerClass::test()");
            System.out.println(out.date1);
            System.out.println(date2);
            System.out.println(out.date3);
            System.out.println(date4);
            System.out.println(date5);
            System.out.println(date6);
        }
    }

    public void test(){
        System.out.println("Out::test()");
    }
}
public class Test {
    public static void main(String[] args) {
        Out.InnerClass innerClass = new Out.InnerClass();
        innerClass.test();
    }
}

相较于实例内部类优点:不需要有外部类对象的引用,可直接引用

注:

1. 在静态内部类中只能访问外部类中的静态成员
2. 创建静态内部类对象时,不需要先创建外部类对象

匿名内部类

interface IA{
    void test();
}

public class Test {
    public static void main(String[] args) {
        IA a = new IA(){

            @Override
            public void test() {
                System.out.println("这是重写的接口的方法!");
            }
        };
        a.test();

         new IA(){

            @Override
            public void test() {
                System.out.println("这是重写的接口的方法!");
            }
        }.test();
    }
}

相当于,有一个类实现了IA接口,重写了test方法。

局部内部类

几乎不用!!!

public class Test2 {
    public void func(){
        class AA{
            public int a;

        }

        AA aa = new AA();
    }
}
注:
1. 局部内部类只能在所定义的方法体内部使用
2. 不能被 public static 等修饰符修饰
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值