匿名内部类:是局部内部类一种最简形式;
匿名内部类的本质:本质上一个对象,是实现了该接口,或继承了该抽象类的子类对象。
- 下面先来看普通的创建对象,再调用Anonymity类的成员方法;在抽象类或者不能创建其对象,就可以通过创建匿名内部类调用。
public class Testnull {
public static void main(String[] args) {
new Anonymity(){ //可以通过创建对象,直接调用成员方法;
@Override
public void show() {
super.show();
}
}.show();
System.out.println("--------------------------------");
Anonymity anonymity=new Anonymity(){//可以创建对象,再用本类引用接收;
@Override
public void show() {
super.show();
}
};
anonymity.show();
}
}
class Anonymity{
int num=333;
public void show(){
System.out.println("这是一个show方法!");
}
}
- 下面来看抽象类怎么在主函数中创建对象,即可以通过匿名内部类的方法实现:
public class Test {
public static void main(String[] args) {
new Demo(){//可以通过创建匿名内部类的方式,创建抽象类的对象,并重写其抽象方法;
@Override
public void show() {
System.out.println("这是个抽象show方法。");
}
@Override
public void show2() {
System.out.println("这是个抽象show2方法。");
}
}.show();//但是这样创建出来的对象,虽然能够重写抽象类中的所有的抽象方法,但是只能调用其中一个抽象方法;
System.out.println("--------------------------------------");
Demo demo= new Demo(){ // 利用多态的形式,将抽象类的引用地址指向创建出来的子类新对象;
@Override
public void show() {
System.out.println("这是个抽象show方法");
}
@Override
public void show2() {
System.out.println("这是个抽象show2方法");
}
};
demo.show(); //通过抽象父类引用,就可以调用重写过后的方法了。
demo.show2();
}
}
abstract class Demo{
public abstract void show();//抽象方法;
public abstract void show2();//抽象方法;
public void show3(){ //非抽象方法
System.out.println("这是个show3方法。");
}
}
- 同样接口类的实现也可以利用同样的方式实现对象的创建;
public class Test {
public static void main(String[] args) {
Mydemo mydemo= new Mydemo(){//利用多态的形式,接收创建出来的接口对象
@Override
public void test1() {
System.out.println("重写过后的test1方法");
}
@Override
public void test2() {
System.out.println("重写过后的test2方法");
}
};
}
}
interface Mydemo{//接口类中不允许存在非抽象方法;
public abstract void test1();
public abstract void test2();
public default void test3(){
System.out.println("这是一个test3方法");//可以通过在方法声明中加上关键字default,创建有方法体的方法
}
}