欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

纠结了很久的一个问题, 内部类和静态内部类在使用上有啥区别

程序员文章站 2024-02-10 13:17:10
...

文章目录

历史信息

  • Java中的内部类是在Jdk1.1版本之后增加的,内部类是Java语言中一个比较重要的概念,如果能把内部类运用好,那么会明显增强Java程序的灵活性。
  • 内部类无论是静态还是非静态, 本质上都是写在内部的一个类, 比如下面代码
public class Demo {
    
    class Test {
        
    }
}

对比

  • 我们都知道Java的类是有封装性的, 比如我们将一个属性或者方法写成是private修饰的, 那么只能在类的内部进行使用, 外部是无法使用的
  • 所以, 内部类是可以访问私有属性和私有方法的, 但是要清楚静态和非静态对私有的字段访问还是有差距的, 后面讲到哈~

第一,内部类可以访问其所在类的属性(包括所在类的私有属性)

public class Demo {
    
    private static String name = "bike"; //外部类的私有静态变量
    private int age = 10;    //外部类的私有属性

    private void play() {   //外部类的私有方法
        System.out.println("play");
    }

    class Stu {   //内部类
        
        int age = 20;
        public void print() {
            System.out.println(age);  //20
            System.out.println(this.age);   //20
            //通过外部类名加this可以访问外部类的所有属性和方法
            System.out.println(Demo.this.age);   //10
            Demo.this.play();  //外部类的play方法
            Stu stu = Demo.this.new Stu();  //初始化内部类实例
            System.out.println(Demo.name);   //访问外部类的私有静态变量
        }
    }

第二, 可以在方法体内定义一个内部类,方法体内的内部类可以完成一个基于虚方法形式的回调操作,看一个例子:

    private Stu play() {   //外部类的私有方法
        System.out.println("play");
        class Tea extends Stu {
            @Override
            public void print() {
                super.print();
                System.out.println("我是Tea执行的");
            }
        }
        return new Tea();
    }

第三, 内部类不能定义static元素,看一个例子:
纠结了很久的一个问题, 内部类和静态内部类在使用上有啥区别
第四, 内部类可以多嵌套,看一个例子:
也就是说内部类里可以有内部类

第五, 实例化一个内部类需要先实例化外部类

    public static void main(String[] args) {
        //实例化一个非静态内部类的时候需要先实例化外部类, 也就是需要实例化俩个对象
        Stu stu = new Demo().new Stu();
    }
  • 对于静态内部类, 其实我们都知道一个类的静态属性字段, 都会在这个类在加载的时候就加载出来, 随着类对象一起出生, 将他们存放在方法区中, 所以本质上来说内部类还是属于实例的, 所以在实例化内部类的时候需要先实例化外部类, 而静态内部类就是属于类的, 那么他严格来说已经不算是一个完全的内部类
  • 所以对于静态内部类, 他除了是写在内部类的位置上, 可以访问外部类静态的的私有属性和字段, 其余和外部类没有任何区别
  • 也就是说静态内部类是一个还是比较高级的*类

第一, 静态内部类可以有静态属性和方法, 当然也可以有普通的

    static class Per {
        static String name = "listen";
        int age = 30;
        
        public static void print() {
            System.out.println(name);
        }
    }

第二, 静态类可以访问外部类的私有静态变量, 普通属性不能访问了

    static class Per {
        static String name = "listen";
        int age = 30;

        public static void print() {
            System.out.println(name);
            //静态内部类访问外部类的私有静态属性
            System.out.println(Demo.name);
            //静态内部类访问外部类的普通属性  
            System.out.println(Demo.this.age);  //报错了
        }
    }

第三, 实例化一个静态内部类只需要实例化一个对象

    public static void main(String[] args) {
    
        Demo.Per per = new Demo.Per();
    }