目录
一、什么是内部类
将一个类A定义在另一个类B里面,里面的那个类A就称为内部类(InnerClass ) ,类B则称为外部类(OuterClass )
二、为什么需要内部类
具体来说,当一个事物A的内部,还有一个部分需要一个完整的结构B进行描述,而这个内部的完整的结构B又只为外部事物A提供服务,不在其他地方单独使用,那么整个内部的完整结构B最好使用内部类。
总的来说,遵循高内聚、低耦合的面向对象开发原则。
三、内部类的分类
3.1、成员内部类
- 成员内部类作为类的成员的角色 :
- 和外部类不同,Inner class还可以声明为private或protected;
- 可以调用外部类的结构。(注意:在静态内部类中不能使用外部类的非静态成员)
- Inner class 可以声明为static的,但此时就不能再使用外层类的非static的成员变量;
- 成员内部类作为类的角色 :
- 可以在内部定义属性、方法、构造器等结构
- 可以继承自己的想要继承的父类,实现自己想要实现的父接口们,和外部类的父类和父接口无关
- 可以声明为abstract类 ,因此可以被其它的内部类继承
- 可以声明为final的,表示不能被继承
- 编译以后生成OuterClass$InnerClass.class字节码文件(也适用于局部内部类)
java
public class OuterClass {
public static void main(String[] args) {
//创建静态成员内部类对象
Person.Cat cat = new Person.Cat();
cat.method();
//创建非静态成员内部类对象
Person person = new Person();
Person.Bird bird = person.new Bird();
bird.method();
bird.method2("形参名");
bird.method1();
}
}
//外部类
class Person{
String name = "外部类";
//静态成员内部类
static class Cat{
public void method(){
System.out.println("静态成员内部类创建成功");
}
}
//非静态成员内部类
class Bird{
String name = "内部类";
public void method(){
System.out.println("非静态成员内部类创建成功");
}
public void method2(String name){
System.out.println("调用形参的name:" + name);
System.out.println("调用内部类属性的name:" + this.name);
System.out.println("调用外部类属性的name:" + Person.this.name);
}
public void method1(){
method();
Person.this.method();
}
}
public void method(){
System.out.println("正在吃饭。。。");
}
}
3.2、局部内部类
java
class A{
public Comparable method(){
//非匿名局部内部类
// class MyComparable implements Comparable{
// @Override
// public int compareTo(Object o) {
// return 0;
// }
// }
// return new MyComparable();
//非匿名内部类
// Comparable<Object> comparable = new Comparable<>() {
// @Override
// public int compareTo(Object o) {
// return 0;
// }
// };
// return comparable;
//匿名内部类
return new Comparable() {
@Override
public int compareTo(Object o) {
return 0;
}
};
}
}
四、练习
java
public class InnerObjTest {
public static void main(String[] args) {
Inner inner = new Inner();
inner.method();
}
}
class Inner{
public void method(){
//匿名内部类
new Object(){
//定义方法
public void test(){
System.out.println("hello word");
}
}.test();
}
}