内部类

内部类

概念:在Java,类中除了可以定义属性和方法外,还可以定义类,该类称为内部类,内部类所在的类称为外部类.
内部类的特性:
1.内部类与外部类经过编译后是两个独立的类
2.内部类是外部类的一个成员,因此内部类能够访问外部类的任何成员(包括私有),但是外部类不可以直接访问内部类的成员
3.内部类可以由static由public,protected,private修饰,而外部类只能由public或package修饰.
可以创建内部类对象,通过内部类对象来访问内部类成员

  • 内部类访问特点
    • a:内部类可以直接访问外部类的成员,包括私有。
    • b:外部类要访问内部类的成员,必须创建对象。
    • 外部类名.内部类名 对象名 = 外部类对象.内部类对象;

根据内部类的位置,修饰符,定义方式的不同,分为四种:
1)成员内部类;

public class InnerTest {
    private String name = "Other";
    private int count;

    public void otherSay() {
        System.out.println("outer class");
    }

    class Inner {
        private String name = "Other.inner";
        public void say() {
            //类名.this表示外部类对象
            System.out.println(InnerTest.this.name);
            //当前类
            System.out.println(this.name);
            InnerTest.this.count = 10;
            System.out.println("count=" + InnerTest.this.count);
            InnerTest.this.otherSay();
        }
    }
}

//---------------------------------------
A a = new A();
A.B b = a.new B();

2)静态内部类
3)方法内部类
在成员方法中定义的类,与局部变量类似,作用域为定义它的代码块,因此只能在定义该内部类的方法体内new

public class FunctionInner {
    private static String name = "Other2";
    private int count = 10;

    public void say() {
        String name = "say";
        //声明方法内部类
        class Inner {
            //定义成员
            public String name = "Other.Inner";

            public void say() {
                System.out.println(name);
                System.out.println(FunctionInner.name);
            }
        }
        Inner obj = new Inner();
        obj.say();
    }
}

匿名内部类

没有名称的内部类,声明内部类时就会创建一个内部类对象,声明内部类结束后,对象也随即消失,匿名内部类不能重复使用.
内部类的适用场合:不是必须的
继承:子类是父类的拓展(功能增强)
内部类:对类中的成员进一步的细分

interface A{
    public void doSomething();
}

public class B{
    public void fun(A a){
        System.out.println("B's fun");
        a.doSomething();
    }
}

public class Test{
    public static void main(String args[]){
        B b = new B();
        b.fun(new A(){
            public void doSomething(){
                System.out.println("匿名内部类");
            }
        }
    }
}
  • A:匿名内部类

    • 就是内部类的简化写法。
  • B:前提:存在一个类或者接口

    • 这里的类可以是具体类也可以是抽象类。
  • C:格式:

  • new 类名或者接口名(){
    重写方法;
    }

  • D:本质是什么呢?

    • 是一个继承了该类或者实现了该接口的子类匿名对象。