lass Demo1_NoNameInnerClass {
public static void main(String[] args) {
Outer o = new Outer();
o.method();
}
}
/*
* A:匿名内部类
* 就是内部类的简化写法。
* B:前提:存在一个类或者接口
* 这里的类可以是具体类也可以是抽象类。
* C:格式:
*
new 类名或者接口名(){
重写方法;
}
* D:本质是什么呢?
* 是一个继承了该类或者实现了该接口的子类匿名对象。
* E:案例演示
* 按照要求来一个匿名内部类
*/
interface Inter {
public void print();
}
abstract class Animal {
abstract void eat();
abstract void sleep();
}
class Outer {
class Inner implements Inter {
public void print() {
System.out.println("print");
}
}
//创建Animal的子类
class Dog extends Animal {
public void eat(){
System.out.println("狗吃骨头。。。");
}
public void sleep(){
System.out.println("狗睡觉。。。");
}
}
public void method(){
//Inner i = new Inner();
//i.print();
//new Inner().print();
//Inter i = new Inner(); //父类引用指向子类对象
//想使用Inter 接口的实现类对象
//new Inter();这样是不可以的,为啥?因为Inter是接口,里面有抽象方法
new Inter(){//这里虽然是new 接口,但是和上面不一样,后面有一对{},"{}"里面是对于接口Inter中抽象方法的重写,只不过重写后没有单独起一个类名,直接用原来的接口名
public void print() {
System.out.println("print");
}
}.print();//是匿名内部类对象
//对于抽象类也是一样
new Inter() { //实现Inter接口
public void print() { //重写抽象方法
System.out.println("print");
}
}.print();
//Dog d = new Dog();
//d.eat();
/*new Animal(){
public void eat(){
System.out.println("狗吃骨头。。。");
}
}//创建Animal类的子类对象,但是子类没有类名*/
/*new Animal(){
public void eat(){
System.out.println("狗吃牛骨头。。。");
}
}.eat();*/
Animal a = new Animal(){//父类引用指向子类对象(匿名内部类的子类对象)
public void eat(){
System.out.println("狗吃牛骨头。。。");
}
public void sleep(){
System.out.println("狗睡觉。。。");
}
public void lookHome(){
System.out.println("狗看家。。。。。");
}
};
a.eat();
a.sleep();
//a.lookHome();//父类不能调用子类特有的方法
} |
|