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

本文深入探讨了Java内部类的特性,包括如何访问外部类的私有属性和方法,静态与非静态内部类的区别,以及它们在实例化和多嵌套情况下的行为。静态内部类在访问权限和生命周期上与非静态内部类有所不同,并且可以直接实例化。此外,文章还展示了内部类在回调操作和访问静态变量方面的用例。
摘要由CSDN通过智能技术生成

文章目录

历史信息

  • 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();
    }
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值