作者有话要说:
最近在重新回顾JavaSE部分的知识,在学习抽象类的时候,我们都知道抽象类是不可实例化的,当时不知道怎么的就将下面的部分(Test.java中的代码)敲出来了,就让我产生了疑问,总感觉抽象类可以进行实例化,通过查阅相关的资料,解决了这个疑问,如果有什么不对的地方,请见谅,并希望你及时留言我将进行改正。
让我产生疑问的下面项目中序号3部分的代码:
一.项目结构
1.项目结构:
2.Animal.java
3.Test.java
运行情况:
产生疑惑:
从Test.java
中我们可以看到Animal抽象类
可以像对象一样去使用难道抽象类真的实例化吗?
二.实例化对象,匿名内部类,多态
解决这个问题你需要搞懂三个问题:
2.1 什么是实例化对象
实例化的过程,是通过对应的
构造方法(有参/无参构造)
对对应的对象进行初始化,从而创建该对象。
语法结构如下:
类名 对象名=new 类名();
2.2 什么是匿名内部类
当我要去使用某个
抽象类
/接口
的时候我需要做的就是写一个子类来继承该抽象类
/实现该接口
,然后通过在子类中重写对应的方法,在外部通过实例化该子类,再调用相应的方法,从而实现了对该抽象类
/接口
的使用,匿名内部类
就是不用去写这个抽象类/接口的子类,直接创建该子类,并重写相应的方法,从而实现了对该抽象类
/接口
的使用。
语法结构如下:
java
new 父类名或者接口名(){
//相应的方法重写
}
该部分相关学习链接:
Java中内部类详解—匿名内部类
接口和抽象类有什么区别?(备注看第2,3回复)
2.3 什么是多态
在子父类中(继承关系),子类重写父类相关的方法,父类引用指向子类对象:
Animal animal= new Dog();
条件下,一个类具有多个形态,根据对象的不同执行的动作也会不同(方法),比如父类Animal,有二个子类Dog,Cat,二个子类都重写了Animal的eat()方法,当父类指向Dog对象的时候Animal animal= new Dog();
,执行的就是Dog的eat()【狗吃骨头】,当父类指向Cat对象的时候Animal animal= new Cat();
执行的就是Cat的eat()【猫吃鱼】。
向上转型:父类 对象名=new 子类();
向下转型【强制类型转换】:子类 对象名=(子类)new 父类();
该部分相关学习链接:
菜鸟教程多态性
JAVA的多态用几句话能直观的解释一下吗?
java方法的多态性理解
三.回答抽象类是否可被实例化
回答上面的问题:
抽象类不能被实例化,只能被子类化!
首先先分析一下Test.java中代码:
右面部分:创建Animal的匿名内部类(创建的是Animal的子类)
左面部分:Animal的子类对象向上转型为父类对象(多态的使用)
答:从实例化对象的角度出发,上面部分的代码并没有进行对象的实例化,不满足对象实例化的语法(类名 对象名=new 类名();)上面部分代码只是通过匿名内部类创建了一个Animal抽象类的子类,然后通过多态向上转型为Animal对象。
该部分相关学习链接:
关于抽象类无法实例化,但是可以使用“new“来实例的疑问