内部类可以分为四种
- 成员内部类(类内部定义的类,非static)
- 局部内部类(方法内部的类)
- 匿名内部类(抽象类的单次实现并创建实例)
- 静态内部类(类内部的static类)
成员内部类
一定要创建外部类的实例,通过外部类的实例才能创建成员内部类。 根据这个原理,就能够考虑到,内部类的实例能够访问外部类的所有属性和方法,包括private
class Outter{
private double x = 0;
public Outter(double x){
this.x = x;
}
class Inter{
public void say(){
System.out.println("x=" + x);
}
}
}
// 特点:成员内部类可以无条件的访问外部类的所有成员属性和成员方法(包括private成员和静态成员)。
// 注意:当成员内部类拥有和外部类同名的成员变量或者方法时,会发生隐藏现象,即默认情况下访问成员内部类的成员。如果要访问外部类的同名成员,需要以下面的形式进行访问:
// 外部类.this.成员变量
// 外部类.this.成员方法
// 外部使用成员内部类:
Outter outter = new Outter();
Outter.Inner inner = outter.new Inner();
局部内部类
即定义在一个方法或者一个作用域里面的类,局部内部类的访问仅限方法内或作用域内 因为局部内部类是在一个方法里面的,也就不要有public、protected、pribate、static 的修饰了。
案例:
class Person{
public Person(){
}
}
class Man{
public Man(){
}
public People getPeeson(){
class Student extends People{
int age = 0;
}
return new Student();
}
}
// 注意:局部内部类不能用public、protected、pribate、static修饰。
匿名内部类
1、使用匿名内部类时,我们必须是继承一个类或者实现一个接口,但是两者不可兼得,同时也只能继承一个类或
者实现一个接口。
2、匿名内部类中是不能定义构造函数的。
3、匿名内部类中不能存在任何的静态成员变量和静态方法。
4、匿名内部类为局部内部类,所以局部内部类的所有限制同样对匿名内部类生效。
5、匿名内部类不能是抽象的,它必须要实现继承的类或者实现的接口的所有抽象方法。
6、只能访问final型的局部变量
静态内部类
静态内部类不能访问外部类的非static变量或方法。因为静态内部类是通过外部类直接创建的,创建不需要依赖外部类的实例,所以跟踪不到非静态变量和方法。
public class Demo {
public static void main(String[] args) {
Book.Info info = new Book.Info();
info.say();
}
}
public class Book {
// 创建一个静态内部类
static class Info {
public void say() {
System.out.println("这是一个信息类");
}
}
}
注意:静态内部类不可以访问外部类的非静态资源。如要访问,必须将访问的内容定义成静态形式。
public class Book {
private static String name; // 必须将name变量定义为static类型,下面的静态内部类才可以访问
// 创建一个静态内部类
static class Info {
public void say() {
System.out.println("这是一个信息类" + name);
}
}
}