Java中类的内部成员之五: 内部类
@[toc]
内部类这个东西不常用,做了解
初步理解
- 当一个事物的内部,还有一个部分需要一个完整的结构进行描述,而这个内 部的完整的结构又只为外部事物提供服务,那么整个内部的完整结构最好使用内部类。
- 在Java中,允许一个类的定义位于另一个类的内部,前者称为内部类,后者称为外部类。
- Inner class一般用在定义它的类或语句块之内,在外部引用它时必须给出完 整的名称。(Inner class的名字不能与包含它的外部类类名相同)
- 分类:
- 成员内部类:(static成员内部类和非static成员内部类)
- 局部内部类:(不谈修饰符)、匿名内部类
内部类的分类
成员内部类(静态、非静态) vs 局部内部类(方法内、代码块内、构造器内)
package day3.InterClass;
//内部类的分类:成员内部类(静态、非静态) vs 局部内部类(方法内、代码块内、构造器内)
public class InterClassTest {
}
class Person {
//静态成员内部类
static class dog {
}
//非静态成员内部类
class bird {
}
//局部内部类(方法里)
public void goTo() {
class AA {
}
}
//局部内部类(代码块里)
{
class BB {
}
}
//局部内部类(构造器里)
public Person() {
class CC {
}
}
}
成员内部类
- 作为外部类的成员
- 调用外部类的结构(属性、方法等等)
- 可以被static修饰
- 可以被四种不同的权限修饰符修饰
- 作为一个类:
- 类内可以定义属性、方法、构造器等
- 可以用final修饰,表示此类不能被继承了,不使用final就可以继承
- 可以被abstract修饰,表明这个类不能被实例化
附加
- 如何实例化成员内部类的对象?
//创建dog实例(静态成员内部类)
Person.dog dog = new Person.dog();
//创建bird实例(非静态的成员内部类)
// Person.bird bird=new Person.bird();//这里不能像上面那样子写了,因为这个bird是一个非静态内部类
Person p = new Person();
Person.bird bird=p.new bird();
- 如何在成员内部类中去区分调用外部类的结构?
(bird是Person类的内部类,这里只放部分代码,详细看注释)
class bird {
String name;
public bird(){
}
public void sing(){
System.out.println("鸟唱歌");
}
public void display(String name){//当有重名的时候就需要这么去调用,如果不重名就直接输入就可以
System.out.println(name);//方法的形参
System.out.println(this.name);//内部类的属性
System.out.println(Person.this.name);//外部类的属性
}
}