可以将一个新类的定义放在另一个类的定义内部,这就是内部类。
内部类分为成员内部类和匿名内部类,其中成员内部类又有静态内部类和非静态内部类。
内部类的作用
- 内部类提供了更好的封装,只能让外部类直接访问,不允许同一个包中的其他类直接访问。
- 内部类可以直接访问外部类的私有属性,内部类被当成其外部类的私有成员,但外部类不能访问内部类的私有属性。
内部类的使用场合:
由于内部类提供了更好的封装特性,并可以很方便的访问外部类的属性。所以通常内部类只为外部类提供服务的情况下优先使用。
用一段代码来观察一下非静态内部类
class Person {
String name = "张三";//外部类不能访问内部类私有属性
class eyes{
void eye() {
String shape = "circle";
System.out.println(name); //内部类可以访问外部类属性
System.out.println("眼睛");
}
}
}
public class Test {
public static void main(String[] args) {
Person p = new Person();
Person.eyes eye = p.new eyes();
eye.eye();
}
}
/**
- output:
- 张三
- 眼睛
*/
列举一下非静态内部类要点:
- 非静态内部类必须寄存在一个外部类对象里,因此,如果有一个非静态内部类对象,那么一定存在一个对应的外部类对象。非静态内部类对象单独属于外部类某个对象。
- 非静态内部类可以访问外部类成员,但是外部类不能直接访问非静态内部类成员。
- 非静态内部类不能有静态属性、静态方法、静态初始化块。
- 静态成员不能访问非静态成员。外部类的静态方法、静态成员不能访问非静态内部类。
静态内部类:
class Person {
String name = "张三"; //外部类不能访问内部类私有属性
static class eyes{
void eye() {
String shape = "circle";
/*System.out.println(name); */ //静态内部类不可以可以访问外部类属性
System.out.println("眼睛");
}
}
}
public class Test {
public static void main(String[] args) {
Person.eyes p = new Person.eyes();
p.eye();
}
}
/**
* output:
* 眼睛
*/
匿名内部类一般用在时间监听方法中,这里暂时略过。