内部类

1 内部类

1.1 概述

(1) 什么是内部类?

将一个类A定义在另一个类B里面,A称为内部类,B称为外部类

【案例】

public class Outer {
    
    //成员内部类
    class Inner{
        
    }
    
    
    public void methodOne(){
        
        //局部内部类
        class Inner1{
        }
        
    }
    
}

(2) 内部类有哪些形式?

根据内部类声明的位置,可分为

成员内部类 静态成员内部类
非静态成员内部类
局部内部类 有名字的局部内部类
匿名内部类

 

2 静态成员内部类

【案例1】

public class Outer {
    private int three;
    private static int four;

    // 静态成员内部类
    // 静态成员内部类可以声明静态成员,也可以声明普通成员
    // 静态成员内部类不能访问外部类的普通成员,只能访问外部类的静态成员
    // 内部类可以访问外部类的私有成员
    public static class Inner{
        private int one;
        private static int two;

        public void methodOne(){
            System.out.println(one);
            System.out.println(two);
            // System.out.println(three);   ×
            System.out.println(four);
            // methodThree();               ×
            methodFour();
        }

        public static void methodTwo(){
            // System.out.println(one);     ×
            System.out.println(two);
            // System.out.println(three);   ×
            System.out.println(four);
            // methodThree();               ×
            methodFour();
        }
    }

    public void methodThree(){
        Inner.two = 200;
        Inner.methodTwo();
        // 在外部类类体内创建内部类对象
        // 在外部类类体内,内部类就是一个正常的类
        Inner inner = new Inner();
        inner.one = 100;
        inner.methodOne();
    }

    public static void methodFour(){

    }

}

【案例2】

public class TestOuter {
    public static void main(String[] args) {
        // 在外部类类体外表示内部类,必须使用外部类类名.内部类类名
        // 在外部类类体外,静态成员内部类可以直接创建内部类对象,不需要先创建外部类对象
        Outer.Inner inner = new Outer.Inner();
        inner.methodOne();
    }
}

 

2 普通成员内部类

【案例1】

public class Outer2 {
    private int three;
    private static int four;

    public void methodOne(){
        int five = 100;
        // 局部内部类
        // 局部内部类只能声明普通成员不能声明静态成员
        class Inner2{
            private int one;
            // private static int two;

            public void methodOne(){
                System.out.println(one);
                System.out.println(three);
                System.out.println(four);
                System.out.println(five);
            }
        }

        Inner2 inner2 = new Inner2();
    }

    public void methodTwo(){
       // Inner2 inner2 = new Inner2();
    }

}

【案例2】

public class TestOuter1 {
    public static void main(String[] args) {
        // 普通成员内部类在外部类类体创建内部类对象必须先创建外部类对象
        // 再由外部类对象创建内部类对象
        // Outer1.Inner1 inner1 = new Outer1().Inner1();
        Outer1 outer1 = new Outer1();
        Outer1.Inner1 inner1 = outer1.new Inner1();

        Outer1.Inner1 inner2 = new Outer1().new Inner1();
    }
}

 

3 局部内部类

【案例】

public class Outer2 {
    private int three;
    private static int four;

    public void methodOne(){
        int five = 100;
        // 局部内部类
        // 局部内部类只能声明普通成员不能声明静态成员
        class Inner2{
            private int one;
            // private static int two;      ×

            public void methodOne(){
                System.out.println(one);
                System.out.println(three);
                System.out.println(four);
                System.out.println(five);
            }
        }

        Inner2 inner2 = new Inner2();
    }

    public void methodTwo(){
       // Inner2 inner2 = new Inner2();     ×
    }

}



4 匿名内部类

【案例1】接口 MyInnerOne

public interface MyInnerOne {
    public void methodOne();
}

【案例2】

public class TestMyInnerOne {
    public static void main(String[] args) {
        // 匿名内部类作为接口的实现类出现
        // 阶段1
        MyInnerOne mio = new MyInnerOne(){
            @Override
            public void methodOne() {
                System.out.println("in methodOne1()~~~~~~~~~~~~~~~~~~~~");
            }
        };
        mio.methodOne();

        // 阶段2
        new MyInnerOne(){
            @Override
            public void methodOne() {
                System.out.println("in methodOne2()~~~~~~~~~~~~~~~~~~~~");
            }
        }.methodOne();

        // 阶段3
        MyInnerOne mio1 = new MyInnerOne() {
            @Override
            public void methodOne() {
                System.out.println("in methodOne3()~~~~~~~~~~~~~~~~~~~~");
            }
        };
        test(mio1);

        // 阶段4
        test(new MyInnerOne(){
            @Override
            public void methodOne() {
                System.out.println("in methodOne4()~~~~~~~~~~~~~~~~~~~~");
            }
        });
    }

    public static void test(MyInnerOne mio){
        mio.methodOne();
    }
}

运行结果:

in methodOne1()~~~~~~~~~~~~~~~~~~~~
in methodOne2()~~~~~~~~~~~~~~~~~~~~
in methodOne3()~~~~~~~~~~~~~~~~~~~~
in methodOne4()~~~~~~~~~~~~~~~~~~~~

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @   白森  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
历史上的今天:
2022-05-13 电商数据仓库系统
点击右上角即可分享
微信分享提示