欢迎光临
我们一直在努力

内部类的概念

内部类

一、概念

1. 内部类:定义在一个类内部的类。
1 // 外部类
2 class Outer{
3     // 内部类
4     class Inner{}
5 }
2. 内部类编译之后生成独立的 .class 文件,命名:外部类名$内部类名.class

3. 内部类可以直接使用外部类私有成员,从而不破坏外部类的封装性。

4. 内部类的分类:成员内部类、静态内部类、局部内部类、匿名内部类。

二、内部类的分类

1. 成员内部类:类比于实例变量【了解】
(1) 位置:定义在类以内,方法以外。
(2) 成员内部类对象的创建,必须依赖于外部类的对象而创建:
Outer o = new Outer(); // 外部类的对象
Outer.Inner i = o.new Inner(); // 内部类的对象
    (3) 外部类的当前对象:外部类类名.this

◦ 外部类类名.this.属性名 → 访问外部类的属性

◦ 外部类类名.this.成员方法名(参数); → 调用外部类的成员方法
(4) 成员内部类中不能定义静态成员(静态属性和静态方法)

2. 静态内部类:类比于静态变量【了解】
(1) 位置:定义在类以内,方法以外,同时被 static 修饰
(2) 静态内部类中可以定义实例变量,也可以定义静态变量
(3) 创建静态内部类的对象,只需要依赖于外部类的类名即可:
Outer.Inner i = new Outer.Inner();
    (4) 访问静态内部类的静态成员时,可以直接通过 外部类类名.静态内部类类名 进行访问。

◦ 外部类类名.静态内部类类名.静态属性名

◦ 外部类类名.静态内部类类名.静态方法名(实参);
(5) 静态内部类只能访问外部类的静态成员(静态属性和静态的方法)

3. 局部内部类:类比于局部变量
(1) 位置:定义在方法内部
(2) 局部内部类对象的创建,必须在定义它的方法内部创建,并且在类的定义位置后面完成对象的创建

(3) 局部内部类的方法中可以访问定义它的方法内部的局部变量,但是要求局部变量必须被 final 修饰。
注意:JDK8.0及以上版本,编译器编译时,如果检测到局部变量被局部内部类中方法访问,则默认为此局部变量前面加 final,这种技术被称为语法糖。

4. 匿名内部类:是一个特殊的局部内部类
(1) 匿名内部类的定义必须继承一个类或是实现一个接口
(2) 基于一个匿名内部类只能创建该类的一个对象,并且匿名内部类的定义和对象的创建一起完成。
(3) 语法:
接口名 引用名 = new 接口名(){
    // 接口中需要实现的方法
};
    (4) 匿名内部类的优缺点:
a. 优点:减小代码量,让编程思路连贯。
b. 缺点:可读性低。

案例1:实现接口的匿名内部类
1 interface IA{
2     void m1();
3 }
4 public class Test{
5     public static void main(String[] args){
6         IA ia = new IA(){
7             public void m1(){}
8         };
9     }
10 }
案例2:继承类的匿名内部类
1 public class Test {
2     public static void main(String[] args) {
3         MyClass mc =new MyClass(){
4             public void method(){
5                 System.out.println("子类覆盖后的方法。。。");
6             }
7         };
8         mc.method();
9     }
10 }
11 
12 class MyClass{
13     public void method(){
14         System.out.println("父类中method方法/…");
15     }
16 }

赞(0)
未经允许不得转载:171主机测评 » 内部类的概念
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址