主页

java内部类

java内部类

内部类

一般的类都是定义在顶层,位于一个包中,可以称为顶层类。

内部类则是指定义在另一个类里面的类。我们将包含了内部类的这个类称为外部类。

内部类在定义成员时,比顶层类多了一些限制。

有三种内部类:

嵌入类:当类前面有static 修饰时,称为嵌入类。嵌入类只能和外部类的成员并列,不能定义在方法中。

内部成员类:如果类和外部类的成员是并列定义的,且没有static修饰符,就称为内部成员类。

本地类:指定义在方法中的类。

类部类的设计目的是解决多重继承时不灵活的问题。具体实现方法是: 如果类B需要多重继承类 A1, A2, A3,则可以定义类B的内部类 A1' A2' A3' 分别继承这三个类。

Java允许内部类再嵌套内部类,只是一般不建议这样做。

类部类本质上可看成普通的类成员和普通的本地变量,只是变量的值是一个类而已。这些类可以在符合变量作用域规则的情况下互相访问。

类体就是一个作用域,子作用域可以访问父作用域中的变量。

 

嵌入类

[private|protected|public]? static [abstract | final]? class 嵌入类名 [extends 父类名]? [implements 接口名1[, 接口名2]*]?  {   
   [private | protected | public]? [static]? [final]? 类型名 变量名[ = 表达式1 [, 变量名[ = 表达式2 ... ]?]?]? ;
     [private | protected | public]?  类名 (类型名 参数名1 [,  类型名 参数名n]*) {  方法体 }
     [abstract]? [private | protected | public]? [static]? [final]? 类型名 方法名(类型名 参数名1 [,  类型名 参数名n]*) {  方法体 }
}
嵌入类的类名不能和外部类同名,也不能和其它成员同名。
编译后,可得到 外层类名.class 和  外层类名$.嵌入类名.class  两个class文件。
嵌入类的类体可看成一个静态方法体,只能访问外部类中的静态成员。
在外部类外部的使用:  外部类名.嵌入类名 test = new 外部类名.嵌入类名();
 

内部成员类

[private|protected|public]? [abstract | final]? class 内部成员类名 [extends 父类名]? [implements 接口名1[, 接口名2]*]?  {   
   [private | protected | public]?  [ static final | final]? 类型名 变量名[ = 表达式1 [, 变量名[ = 表达式2 ... ]?]?]? ;
     [private | protected | public]?  类名 (类型名 参数名1 [,  类型名 参数名n]*) {  方法体 }
     [abstract]? [private | protected | public]? [final]? 类型名 方法名(类型名 参数名1 [,  类型名 参数名n]*) {  方法体 }
}
其中 static final | final 表示 要么是 static final  要么是 final 
内部成员类的类名不能和外部类同名,也不能和其它成员同名。
编译后,可得到 外层类名.class 和  外层类名$.内部成员类名.class  两个class文件。
内部成员类中只允许 static final 的成员属性,不允许任何其它的 静态属性和静态方法。
内部成员类虽然不允许定义静态成员,但可能通过有静态成员的父类来拥有静态成员。
内部成员类体可看成一个实例方法体,可以访问外部类的所有成员。
在外部类外部的使用:  外部类名.内部成员类名 test = 外部类对象.new 内部成员类名();
 

本地类

[abstract | final]? class 本地类名 [extends 父类名]? [implements 接口名1[, 接口名2]*]?  {   
     [private | protected | public]?  [ static final | final]? 类型名 变量名[ = 表达式1 [, 变量名[ = 表达式2 ... ]?]?]? ;
     [private | protected | public]?  类名 (类型名 参数名1 [,  类型名 参数名n]*) {  方法体 }
     [abstract]? [private | protected | public]? [final]? 类型名 方法名(类型名 参数名1 [,  类型名 参数名n]*) {  方法体 }
}
本地类,地位基本相当于一个局部变量(基本上可以当成局部变量来用,只是这个变量的值是一个类而已)。
编译后,可得到 外层类名.class 和  外层类名$.本地类名.class  两个class文件。
内部成员类中只允许 static final 的成员属性,不允许任何其它的 静态属性和静态方法。
本地类虽然不允许定义静态成员,但可能通过有静态成员的父类来拥有静态成员。
实例方法中的本地类,可以访问外部类的所有成员,可以访问其类体的父(祖)作用域中的局部常量(不能访问任何局部变量)。
静态方法中的本地类,可以访问外部类的静态成员,可以访问其类体的父(祖)作用域中的局部常量(不能访问任何局部变量)。
 
 

内部匿名类

new [接口名 | 父类名]( [类型名 参数名1 [,  类型名 参数名n]*]? ) { 类体 }
 
注意,如果是接口实现,则不可能有参数珣列表。
匿名类可以是内部成员类(相应限制等规则也一样),也可以是本地类(相应限制等规则也一样),但不能是嵌入类(因为不可能使用static来修饰类)。
所有匿名内部类都不是必需的,一定可以被其它内部类代替,建议少使用匿名类。
 
 
 
 
 

 

posted @   平凡人就做平凡事  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
点击右上角即可分享
微信分享提示