对比四种不同的内部类,从定义、初始化、访问、成员特性(静态、实例两 种)、是否有名字等方面。
时间: 2023-07-10 21:32:25 浏览: 78
四种不同的内部类包括成员内部类、局部内部类、匿名内部类和静态内部类。下面是它们的定义、初始化、访问、成员特性以及是否有名字的详细解释:
1. 成员内部类:
定义:成员内部类是在一个类中定义的另一个类,它是外部类的一个成员,可以访问外部类的所有成员变量和方法,包括私有成员变量和方法。
初始化:成员内部类只能在外部类的非静态方法中创建,或者通过外部类的对象进行创建。
访问:可以通过外部类的对象来访问成员内部类,例如:OuterClass.InnerClass inner = new OuterClass().new InnerClass(); 也可以直接在外部类中访问成员内部类,例如:InnerClass inner = new InnerClass();
成员特性:成员内部类可以访问外部类的所有成员变量和方法,包括私有成员变量和方法。它可以定义静态和非静态的成员变量和方法,但是不能定义静态的局部变量和方法。
是否有名字:有名字。
示例代码:
```
public class OuterClass {
private int outerVar;
public void outerMethod() {
InnerClass inner = new InnerClass();
inner.innerMethod();
}
public class InnerClass {
private int innerVar;
public void innerMethod() {
outerVar = 1;
System.out.println("InnerClass innerMethod");
}
}
}
```
2. 局部内部类:
定义:局部内部类是在一个方法中定义的类,它只在该方法中可见,不能被其他方法使用。
初始化:局部内部类只能在定义它的方法中创建。
访问:局部内部类只能在定义它的方法中访问。
成员特性:局部内部类只能访问方法中的 final 变量和方法的 final 参数,不能定义静态的成员变量和方法。
是否有名字:有名字。
示例代码:
```
public class OuterClass {
public void outerMethod() {
final int num = 1;
class InnerClass {
public void innerMethod() {
System.out.println("InnerClass innerMethod: " + num);
}
}
InnerClass inner = new InnerClass();
inner.innerMethod();
}
}
```
3. 匿名内部类:
定义:匿名内部类是没有名字的内部类,它是在创建对象的时候定义的,通常用于实现接口或继承类。
初始化:匿名内部类是在创建对象的时候定义的。
访问:匿名内部类只能在创建对象的地方访问。
成员特性:匿名内部类只能访问方法中的 final 变量和方法的 final 参数,不能定义静态的成员变量和方法。
是否有名字:没有名字。
示例代码:
```
public class OuterClass {
public void outerMethod() {
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("Runnable run");
}
};
runnable.run();
}
}
```
4. 静态内部类:
定义:静态内部类是在一个类中定义的另一个类,它是外部类的一个静态成员,可以直接通过外部类访问,不需要创建外部类的对象。
初始化:静态内部类可以在外部类的静态方法中创建,或者通过外部类的对象进行创建。
访问:可以直接通过外部类访问静态内部类,例如:OuterClass.StaticInnerClass inner = new OuterClass.StaticInnerClass(); 也可以在外部类中访问静态内部类,例如:StaticInnerClass inner = new StaticInnerClass();
成员特性:静态内部类不能访问外部类的非静态成员变量和方法,只能访问静态成员变量和方法,可以定义静态和非静态的成员变量和方法,但是不能定义静态的局部变量和方法。
是否有名字:有名字。
示例代码:
```
public class OuterClass {
private static int outerVar;
public static class StaticInnerClass {
private int innerVar;
public void innerMethod() {
outerVar = 1;
System.out.println("StaticInnerClass innerMethod");
}
}
}
```
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)