1.内部类的作用与使用场合
2.内部类的分类
3.非静态内部类
4.静态内部类
5.匿名内部类
1.内部类的作用与使用场合
2.内部类的分类
3.非静态内部类
i. 非静态内部类必须寄存在一个外部类对象里。因此,如果有一个非静态内部类对象那么一定存在对应的外部类对象。非静态内部类对象单独属于外部类的某个对象。
ii. 非静态内部类可以直接访问外部类的成员,但是外部类不能直接访问非静态内部类成员。
iii. 非静态内部类不能有静态方法、静态属性和静态初始化块。
iv. 外部类的静态方法、静态代码块不能访问非静态内部类,包括不能使用非静态内部类定义变量、创建实例。
v. 成员变量访问要点:
1.内部类里方法的局部变量:变量名。
2.内部类属性:this.变量名。
3.外部类属性:外部类名.this.变量名。
class Outer{
private int age = 10;
class Inner{ // 定义内部类
int age =20; // 内部类的成员变量
public void show(){
int age = 30; // 内部类方法里的局部变量
System.out.println("内部类方法里的局部变量age:"+age);
System.out.println("内部类的成员变量age:"+this.age);
System.out.println("外部类的成员变量age:"+Outer.this.age);
}
}
}
public class TestInnerClass {
public static void main(String[] args) {
Outer.Inner inner = new Outer().new Inner(); // 外部类以外的地方使用非静态内部类
inner.show();
}
}
输出结果:
内部类方法里的局部变量age:30
内部类的成员变量age:20
外部类的成员变量age:10
4.静态内部类
4.1 定义方式
static class ClassName{
//类体
}
4.2 注意事项
- 当一个静态内部类对象存在,并不一定存在对应的外部类对象。 因此,静态内部类的实例方法不能直接访问外部类的实例方法。
- 静态内部类看做外部类的一个静态成员。 因此,外部类的方法中可以通过:“静态内部类.名字”的方式访问静态内部类的静态成员,通过 new 静态内部类()访问静态内部类的实例。
class Outer2{
static class Inner{
int age = 20;
}
public void fun1() {
Inner inner1 = new Inner();
System.out.println(inner1.age);
}
}
public class TestStaticInnerClass {
public static void main(String[] args) {
Outer2 o2 = new Outer2();
o2.fun1();
}
}
5.匿名内部类
适合那种只需要使用一次的类。比如:键盘监听操作等等。
5.1 定义方式
new 父类构造器(实参类表)\实现接口(){
//匿名内部类类体
}
public class TestAnonymoushInnerClass {
public static void testaa(AA a){
a.aa();
}
public static void main(String[] args) {
TestAnonymoushInnerClass.testaa(new AA() { // 直接写匿名内部类
@Override
public void aa() {
System.out.println("测试匿名内部类");
}
});
}
}
interface AA{
void aa();
}
1.匿名内部类没有访问修饰符
2.匿名内部类没有构造方法。
网友评论