Java 内部类

内部类是定义在其他类内部的类,内部类所在的类称为宿主类。

通过内部类的定义,可以把一些相关的类放在一起。

由于内部类只能被他的宿主类使用,所以通过内部类的使用可以很好的控制类的可见性。

内部类分为两大类:静态内部类和非静态内部类。

非静态内部类可以调用宿主类的所有变量和方法。

静态内部类是用 static 修饰的,静态内部类不能直接访问其宿主类中非静态的成员,必须通过对象来访问,但是可以直接访问宿主类中静态的成员。

对于宿主类访问内部类的成员变量,静态内部类的静态变量可以直接用 “类名.变量名” 来调用,对于静态内部类的非静态变量则要生成他的对象,利用对象来访问。非静态内部类中不包含静态变量,所以必须用非静态内部类的对象来访问。

多少个类就会生成多少个 class 文件,例如:Tiger 类编译会生成三个 .class 文件,Tiger.class   Tiger$Inside.class   Tiger$Run.class

public class Tiger {
    String name = "tiger";
    static int age = 15;
    
    void testRun() {
        // 宿主类通过对象访问非静态内部类
        Run r = new Run();
        // 宿主类通过对象访问静态内部类中非静态成员
        Inside in = new Inside();
        r.run();
        in.eat();
        // 宿主类可以直接用"类名.变量名"来调用静态内部类的静态变量
        System.out.println(Inside.food);
    }
    
    void breath() {
        System.out.println("老虎用肺呼吸");
    }
    
    static void sleep() {
        System.out.println("sleeping");
    }
    // 非静态内部类
    class Run {
        void run() {
            // 非静态内部类可以调用宿主类中的变量和方法
            System.out.println(name);
            System.out.println(age);
            breath();
            sleep();
            System.out.println("running");
        }
    }
    // 静态内部类
    static class Inside {
        static String food = "beef";
        void eat() {
            // 静态内部类必须通过对象来调用宿主类的非静态的变量和方法
            Tiger t = new Tiger();
            System.out.println(t.name);
            t.breath();
            // 静态内部类可以调用宿主类中静态的变量和方法
            System.out.println(age);
            sleep();
            System.out.println("running");
        }
    }
}

public class Test {
    public static void main(String[] args) {
        Tiger tiger = new Tiger();
        tiger.testRun();
    }
} 

内部类的对象的创建对于静态内部类和非静态内部类也不相同。

public class Test {
    public static void main(String[] args) {
        Tiger tiger = new Tiger();
//        tiger.testRun();
        
        // 创建非静态内部类对象
        Tiger.Run t1 = new Tiger().new Run();
        // 创建静态内部类对象
        Tiger.Inside t2 = new Tiger.Inside();
        
        t1.run();
        t2.eat();
    }
}

 局部内部类

内部类不仅可以在类中定义,也可以在方法中定义,当定义在方法中时,叫做局部内部类。

public class Test {
    void in() {
        class InTest {
            // 构造方法
            public InTest() {
                System.out.println("局部内部类测试");
            }
        }
        // 调用构造方法
        new InTest();
    }
    
    public static void main(String[] args) {
        Test test = new Test();
        test.in();
    }
}

匿名内部类

匿名内部类就是没有类名的内部类。匿名内部类省去了类的名字,直接构造对象,利用它可以很方便地在需要的时候构造一些只是当前需要的对象。

public class Test {    
    class Study
    {
        int n;
        // 构造方法
        public Study(int i) {
            n=i;
        }
    }
    
    Study getStudy() {
        return new Study(5) {
            int n = 5;
        };
    }
    
    public static void main(String[] args) {
        Test test = new Test();
        System.out.println(test.getStudy().n);
    }
}
原文地址:https://www.cnblogs.com/lialong1st/p/10288361.html