内部类
将一个类定义在另一个类的里面,对里面那个类就称为内部类(嵌套类)
访问特点:
1.内部类可以直接访问外部类中的成员,包括私有成员。(因为内部类持有了外部类的引用,Outer.this.num)
2。而外部类要访问内部类中的成员必须要建立内部类的对象
Outer out = new Outer();
out.method();
用于类的设计
分析事物时,发现这个东西里面还有个东西,而且里面这个东西还访问外面这个东西的内容,这就得用内部类来描述,例如数据结构中栈,队列,树的设计,就是由一大堆节点构成的,所以还需一个内部节点类。
class Outer{
private num = 1;
class inner{
void show(){
System.out.println(num);
}
public void method(){
Inner in = new Inner();
in.show();
}
}
}
内部类是外部类的成员就可以被成员修饰符所修饰public private static
//直接访问外部类中内部类的成员
Outer.Inner in = new Outer().new Inner();
in.show();
- 静态内部类
如果是静态内部类,外部类加载,内部类就存在
//访问静态内部类,相当于一个外部类
Outer.Inner in = new Outer.Inner();//注意静态类无法访问非静态成员,需将上面那个num修饰成static
in.show();
如果内部类中定义了静态成员,该内部类也是静态的
局部类
在局部类访问局部变量,得在局部变量前加一个final(常量)
匿名内部类(没有类名字)(就是new子类对象)
就是一个子类对象,但是这个子类是匿名的
简写需要前提:内部类必须继承或者实现一个外部类或者接口
- 格式
new 父类or接口(){
//子类内容代码
}
class Outer{
int num = 4;
new Demo(){ //就是new一个Demo子类对象,只有子类可以覆盖父类的方法
void show(){ //覆盖Demo的方法
System.out.println(num); //也可以也别的方法
}
}.show(); //调用show方法,这个对象有点胖o
}
abstract class Demo{
void show();
}
可见直接new个子类对象和子类覆盖方法一起完成 ,方便!!
给匿名类对象加个名字,用多态
Demo in = new Demo(){ //这样就可以用这个对象名字访问多种类中的方法,不用再写这么长了
void show(){
};
}