java内部类使用_java内部类的使用

本文详细介绍了Java中的内部类,包括如何在外部创建内部类对象,静态内部类的特性,非静态内部类不能定义非静态属性和方法的原因,以及内部类的继承和匿名内部类的使用。强调了内部类的访问权限控制和在代码组织中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

话不多说直接走起

1.怎么直接在外部 创建 内部类呢?

public classDemo {public static voidmain(String[] args) {

Outer.Innerin=new Outer().newInner();in.show();

}

}classOuter{int a=3;public classInner{voidshow() {

System.out.println("a="+a);

}

}public voidmethod() {newInner().show();

}

}

要创建 Inner 对象 需要先创建 Outer 对象 因为 Inner类相当于是作为 Outer 类的一个属性存在

然后再创建内部对象。这样写可能比较奇怪,然而它就是需要这样创建的。

内部类可以直接使用 外部类的属性或者方法的,不管外部类属性和方法的权限是什么。

2.静态内部类的创建

public classDemo {public static voidmain(String[] args) {

Outer.Innerin=newOuter.Inner();in.show();

}

}classOuter{private static int a=3;public static classInner{voidshow() {

System.out.println("a="+a);

}

}public voidmethod() {newInner().show();

}

}

此时静态内部类相当于作为外部类的静态属性存在,他是随着外部类的加载而加载的

3.非静态内部类不能定义非静态的属性或者方法

public classDemo {public static voidmain(String[] args) {

Outer.Inner.show();}

}classOuter{private static int a=3;classInner{static voidshow() {

System.out.println("a="+a);

}

}public voidmethod() {newInner().show();

}

}

如上 Inner 类 里面是不能成功定义 show 方法的

这是为什么呢?

因为此时内部类Inner相当于是作为 外部类的 成员属性存在的

假如我们可以定义成功。

只有 创建Outer实例的时候 内部类才会进行加载。

而如果我们直接这样 Outer.Inner.show(); 调用内部类的静态方法的时候

此时因为没有 创建 Outer 对象 所以内部类 Inner 在内存中是不存在的,

更别说是这个类里面的方法了,所以非静态内部类是不能定义静态方法或者属性的。

但是 如果定义的变量是 final 的,这是可以的。

public classDemo {public static voidmain(String[] args) {new Outer().newInner().show();

}

}classOuter{private static int a=3;classInner{static final int b=4;voidshow() {

System.out.println("a="+a);

}

}public voidmethod() {newInner().show();

}

}

上述 内部类中的变量 b 是可以定义成功的。

这又是为什么呢?

因为我们看到的是 定义了一个常量,然后用常量,打印的时候,打印这个常量,

但是真实是在编译完成之后,里面使用到的常量是直接替换成对应的值得,

所以,以下 对应的地方是直接替换成 数字 4 而不是常量对应的数字 4

voidshow() {

System.out.println("a="+4);

}

我们这样书写,只是为了代码的可读性而已。

4.内部类的继承

public classDemo {public static voidmain(String[] args) {

Outer outer=newOuter();

outer.method();

}

}interfaceFather{voidshow();

}classOuter{private classInner implements Father{static final int b=4;public voidshow() {

System.out.println("a="+b);

}

}public voidmethod() {

Inner aFather= newInner();

aFather.show();

}

}

5.内部类继承的简化形式 (匿名内部类)

如果只是用到了 接口中的方法,根本就不需要创建子类对象的引用,只需要引用父类就可以了

public classDemo {public static voidmain(String[] args) {

Outer outer=newOuter();

outer.method();

}

}interfaceFather{voidshow();

}classOuter{private classInner implements Father{static final int b=4;public voidshow() {

System.out.println("a="+b);

}

}public voidmethod() {

Father aFather= newInner();

aFather.show();

}

}

可以进一步简化,内部类的名字已经没有意义了

public classDemo {public static voidmain(String[] args) {

Outer outer=newOuter();

outer.method();

}

}interfaceFather{voidshow();

}classOuter{public voidmethod() {

Father aFather= newFather() {static final int b=4;public voidshow() {

System.out.println("a="+b);

}

};

aFather.show();

}

}

这就是匿名内部类的使用

如果接口里面的方法只有一个的话,而且只调用一次的话,完全可以进一步简化(可以使用匿名对象)

public classDemo {public static voidmain(String[] args) {

Outer outer=newOuter();

outer.method();

}

}interfaceFather{voidshow();

}classOuter{public voidmethod() {newFather() {static final int b=4;public voidshow() {

System.out.println("a="+b);

}

}.show();

}

}

提醒:

内部类的定义就是为了控制他的访问权限的,一般定义内部类就是为了不让

外部对他进行访问的,所以最好使用 private 来修饰内部类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值