1.成员内部类
内部类:指的是一个类中还有一个类,成为内部类
定义:
class Outer {
class Inner {
// 定义了一个Inner Class
}
}
注意:
①.内部类不能单独存在,必须依赖一个Outer Class;
②.内部类可以访问外围类的private方法和字段,因为内部类也属于外围类的一部分,可以访问外围类的方法、字段;
③.内部类中自己带有this.指向自己,访问外围的方法是就需要依赖Outer.this去访问。
④.除了静态内部类,其他内部类不可以使用外围类的static方法及字段。除非将static变量加上final修饰。(原因:static的变量是可以直接通过类名.调用,加入调用内部类的static变量,而内部类需要外部类的实例化进行调用,所以,若是除了非静态的内部类使用外围类的static变量,则会违背了static的定义)
内部类的实例化:内部类不是独立存在的,所以实例化内部类的时候,必须依赖外部类
格式:
Outer.Innner in = outer.new Innner();
例如:
public class Main {
public static void main(String[] args) {
Outer outer = new Outer("Nested"); // 实例化一个Outer
Outer.Inner inner = outer.new Inner(); // 实例化一个Inner
inner.hello();
}
}
class Outer {
private String name;
Outer(String name) {
this.name = name;
}
class Inner {
void hello() {
System.out.println("Hello, " + Outer.this.name);
}
}
}
2.静态内部类
静态内部类具有static的特性,不同于非静态内部类,静态内部类是一个独立的类,因此不可以使用Outer.this,可以不依赖于外围类,不需要外围类实例化就可以进行调用,并且具有外围类的private类型的static的字段及方法。
例如:
public class Main {
public static void main(String[] args) {
Outer.StaticNested sn = new Outer.StaticNested();
sn.hello();
}
}
class Outer {
private static String NAME = "OUTER";
private String name;
Outer(String name) {
this.name = name;
}
static class StaticNested {
void hello() {
System.out.println("Hello, " + Outer.NAME);
}
}
}
3.匿名类
匿名类:就是没有名字的类,在方法内部,重写父类或接口方法
格式:
Runnable r = new Runnable() {
// 实现必要的抽象方法...
};
例如:
重写父类:
//父类 Animal
public class Animal {
public void bellow() {
//动物吼叫的类型
System.out.println("动物吼叫");
}
}
class Demo {
public static void main(String[] args) {
Demo demo = new Demo();
demo.getDogBellow(new Animal(){//匿名内部类,重写父类方法。当然接口也是一样
@Override
public void bellow() {
System.out.println("狗 汪汪汪。。。。");
}
});
}
public void getDogBellow(Animal animal){
animal.bellow();
}
}
重写接口
public class Main {
public static void main(String[] args) {
Outer outer = new Outer("Nested");
outer.asyncHello();
}
}
class Outer {
private String name;
Outer(String name) {
this.name = name;
}
void asyncHello() {
Runnable r = new Runnable() {
@Override
public void run() {
System.out.println("Hello, " + Outer.this.name);
}
};
new Thread(r).start();
}
}