类的五大成员:属性、方法、构造器、代码块、内部类,内部类的最大特点是可以直接访问私有属性,并且可以体现类与类之间的包含关系。
//基本语法
class Outer { //外部类
class Inner { //内部类
}
}
class Other { //外部其他类
}
//匿名内部类的语法
new 类或接口(参数列表) {
类体;
};
四种内部类 | 局部内部类 | 匿名内部类 | 成员内部类 | 静态内部类 |
定义 | 定义在外部类局部位置上(比如方法内/代码块) | 定义在外部类局部位置上(比如方法内/代码块) | 定义在外部类的成员位置上 | 定义在外部类的成员位置上 |
是否有类名 | √ | × | √ | √ |
是否用static 修饰 | / | / | × | √ |
是否能访问外部类所有成员 (包含私有的) | √ | √ | √ | √(不能直接访问非静态成员) |
能否添加访问修饰符 | ×(相当于局部变量可用final修饰) | × | √(相当于成员) | √(相当于成员) |
作用域 | 仅仅在定义它的方法或代码块中 | 仅仅在定义它的方法或代码块中 | 和外部类的其他成员一样,为整个类体 | 和外部类的其他成员一样,为整个类体 |
访问方式 | 1. 局部内部类--访问-->外部类的成员:直接访问 2. 外部类--访问-->局部内部类的成员:创建对象,再访问(注意:必须在作用域内) 3. 外部其他类--不能访问-->局部内部类(因为局部内部类地位是一个局部变量) | 1. 匿名内部类--访问-->外部类的成员:直接访问 2. 外部其他类--不能访问-->局部内部类(因为匿名内部类地位是一个局部变量) | 1. 成员内部类--访问-->外部类的成员:直接访问 2. 外部类--访问-->成员内部类的成员:创建对象,再访问(注意:必须在作用域内) 3. 外部其他类--访问-->成员内部类:①先创建外部类,把内部类当作外部类的成员再创建,然后访问;②在外部类中,编写一个get方法返回内部类对象,最后在外部其他类中调用访问 | 1. 静态内部类--访问-->外部类的成员:直接访问所有静态成员 2. 外部类--访问-->静态内部类的成员:创建对象,再访问 3. 外部其他类--访问-->静态内部类:①满足访问权限下,直接访问;②在外部类中,编写一个get方法(方法静态/非静态都可)返回静态类对象,最后在外部其他类中调用访问 |
外部类和内部类的成员重名时,内部类的访问原则 | 默认遵循就近原则,访问外部类的成员使用:外部类名.this.成员 | 默认遵循就近原则,访问外部类的成员使用:外部类名.this.成员 | 默认遵循就近原 则,访问外部类的成员使用:外部类名.this.成员 | 默认遵循就近原则,访问外部类的成员使用:外部类名.成员 |