Java - 内部类

2022-06-25  本文已影响0人  aven_kang

内部类的基本概念

截屏2022-04-15 下午4.19.58.png

内部类的作用

截屏2022-04-15 下午4.20.56.png

内部类的分类

截屏2022-04-15 下午4.23.12.png

普通(成员)内部类的格式

截屏2022-04-15 下午4.26.04.png
public class NormalOuter {

    private int cnt = 1;

    public class NormalInner {

        private int ia = 2;

        public NormalInner(){
            System.out.println("内部类的初始化");
        }

        public void show() {
            System.out.println("外部变量中cnt的数值为:" + cnt);
            System.out.println("ia =" + ia);
        }
    }

    public static void main(String[] args) {

        // 1.声明NormalOuter类型的引用指向该类型的对象
        NormalOuter normalOuter = new NormalOuter();
        // 2.声明NormalOUter类中内部类的引用指向内部类的对象
        NormalOuter.NormalInner ni = normalOuter.new NormalInner();
        // 3.调用内部类中的show方法
        ni.show();

    }
}
这部分就是如何声明及调用出内部类的流程与方法
        // 1.声明NormalOuter类型的引用指向该类型的对象
        NormalOuter normalOuter = new NormalOuter();
        // 2.声明NormalOUter类中内部类的引用指向内部类的对象
        NormalOuter.NormalInner ni = normalOuter.new NormalInner();
        // 3.调用内部类中的show方法
        ni.show();

普通内部类的使用方式

截屏2022-04-15 下午4.49.34.png
public class NormalOuter {

    private int cnt = 1;

    public class NormalInner {

        private int ia = 2;
        private int cnt = 3;

        public NormalInner(){
            System.out.println("内部类的初始化");
        }

        public void show() {
            System.out.println("外部变量中cnt的数值为:" + cnt);
            System.out.println("ia =" + ia);
        }

        public void show2(int cnt) {
            System.out.println("形参变量cnt =" + cnt); // 局部优先原则
            System.out.println("内部类中cnt =" + this.cnt);
            System.out.println("外部类中cnt =" + NormalOuter.this.cnt);
        }
    }
}

上面这段代码给我们演示了内部类与外部类参数同名时的处理方式,下面演示调用

        // 1.声明NormalOuter类型的引用指向该类型的对象
        NormalOuter normalOuter = new NormalOuter();
        // 2.声明NormalOUter类中内部类的引用指向内部类的对象
        NormalOuter.NormalInner ni = normalOuter.new NormalInner();
        ni.show2(10);

静态内部类

静态内部类的格式
截屏2022-04-15 下午4.58.55.png
public class StaticOuter {

    private int cnt = 1;
    private static int snt = 2;

    public static class StaticInner {

        private int ia = 3;

        StaticInner(){
            System.out.println("静态内部类的构造方法");
        }

        public void show() {
            System.out.println("ia =" + ia); // 3
            System.out.println("外部类中的snt =" + snt); // 2
//            System.out.println("外部类中的cnt = " + cnt); // Error:静态上下文中不能访问非晶态的成员变量,因为此时可能还没创建对象

        }
    }
}
public class StaticOuterTest {

    public static void main(String[] args) {

        StaticOuter.StaticInner ni = new StaticOuter.StaticInner();
        ni.show();
    }
}

静态内部类的使用方法

public class StaticOuter {

    private int cnt = 1;
    private static int snt = 2;

    public static void show() {
        System.out.println("我是外部类中的show方法");
    }

    public static class StaticInner {

        private int ia = 3;
        private static int snt = 4;

        StaticInner(){
            System.out.println("静态内部类的构造方法");
        }

        public void show() {
            System.out.println("ia =" + ia); // 3
            System.out.println("外部类中的snt =" + snt); // 2
//            System.out.println("外部类中的cnt = " + cnt); // Error:静态上下文中不能访问非晶态的成员变量,因为此时可能还没创建对象

        }

        public void show(int snt) {
            System.out.println("snt = "+ snt); // 就近原则
            System.out.println("内部类中的snt = "+ StaticInner.snt); // 4
            System.out.println("外部类中的snt = "+ StaticOuter.snt); // 2
            StaticOuter.show();
        }
    }
}

 StaticOuter.StaticInner ni = new StaticOuter.StaticInner();
//        ni.show();
        ni.show(5);

打印结果

静态内部类的构造方法
snt = 5
内部类中的snt = 4
外部类中的snt = 2
我是外部类中的show方法

局部内部类

局部(方法)内部类的格式
截屏2022-04-15 下午5.23.34.png
局部内部类的使用方式
截屏2022-04-15 下午5.38.43.png
public class areaOuter {

    private int cnt = 1;

    public void show() {
        // 定义一个局部变量进行测试,默认理解为final关键字修饰
        // 虽然可以省略final关键字,但建议加上
        int ic = 4;
        //定义局部内部类,只有在当前方法体的内部好使
        class AreaInner {

            private int ia = 2;
            public AreaInner(){

            }
            public void test(){
                System.out.println("ia = "+ ia); // 2
                System.out.println("cnt = " + cnt); // 1
                System.out.println("ic = "+ ic); // 4 虽然没有加final,但是默认是final的ic,因为我们没有去尝试修改这个ic,所以没报错
            }
        }

        AreaInner areaInner = new AreaInner();
        areaInner.test();

    }
}
public class areaOuterTest {

    public static void main(String[] args) {


        areaOuter area1 = new areaOuter();
        area1.show();

    }
}
上一篇 下一篇

猜你喜欢

热点阅读