java抽象类实例化_抽象类能实例化吗
抽象类能实例化吗?
这个问题我想了⼀个晚上,看了好⼏篇别⼈的博客,但结果都各不相同,每个⼈有每个⼈的理解,后来我想明⽩了:
抽象类不能直接通过new去实例化⼀个对象,那它就是不能实例化,要获取抽象类的对象, 需要先⽤⼀个类继承抽象类, 然后去实例化⼦类。也可以⽤匿名内部类,在抽象类中创建⼀个匿名的⼦类,继承抽象类,通过特殊的语法实例化⼦类的对象 。(后⾯会细说)
现在重点来了,要研究这个问题,前提是你要了解抽象类,万变不离其宗,我们从抽象类的根源谈起 , 深化对抽象类的理解。
⾸先看这个例⼦:
animal;//动物类
public classAnimal {
String name;//名字
String color;//颜⾊
publicAnimal(String name,String color){this.name =lor =color;
}public voidrun(){
System.out.println(name+"四条腿跑的很快!!!");
}
}//狗类继承动物类
classDog extends Animal{publicDog(String name,String color){
实例化类和实例化对象super(name,color);
}
}//鱼类继承动物类
classFish extends Animal{publicFish(String name, String color) {
super(name, color);
}
}classTest{public static voidmain(String[] args) {
Dog dog= new Dog("哈巴狗","⽩⾊");
dog.run();
Fish fish= new Fish("锦鲤","红⾊");
fish.run();
}
}
运⾏结果:
哈巴狗四条腿跑的很快!!!
锦鲤四条腿跑的很快!!!
是不是发现问题了,鱼怎么能⽤腿跑呢,难道是原始鱼?哈哈,开玩笑的,这个问题如何解决,估计⼤家马上想到了,在⼦类中重写⽗类的run⽅法不就⾏了,对,确实这样就可以解决,但是⼤家想过没有,我们是如何发现这个问题的?是不是编译运⾏之后才看到的,当然,也有⼤佬能不编译运⾏就能看到,不抬杠啊,意思是说有发现不了这个问题的风险,对别⼈可能⽆所谓,但对我们程序员来说,这种低级错误还是不犯的好,程序员应该有更⾼的追求,岂能在这被绊倒,我们要把这种风险降为零,那该如何做呢?不急,⼼急吃不了热⾖腐,且看我慢慢分析:
⽬前存在的问题:
1.动物类的run⽅法描述的不正确
2.没有强制要⼦类⼀定要重写⽗类的run⽅法
解决⽅案:(抽象类的应⽤场景)
我们在描述⼀类事物的时候,发现该种事物确实存在着某种⾏为,但是这种⾏为⽬前是不具体的,那么我们可以抽取这种⾏为的声明,但是不去实现该种⾏为,这时候这种⾏为我们称作为抽象的⾏为,我们就需要使⽤抽象类
先看下⾯的例⼦:
animal;//动物类(抽象类)
public abstract classAnimal {
String name;//名字
String color;//颜⾊//构造⽅法
publicAnimal(String name,String color){this.name =lor =color;
}
//⾮抽象⽅法
public void eat(){
System.out.println(name+"吃东西!!!");
}//抽象⽅法
public abstract voidrun();
}classDog extends Animal{publicDog(String name,String color){
super(name,color);
}
@Overridepublic voidrun() {
System.out.println(name+"四条腿跑得快!!");
}
}classFish extends Animal{publicFish(String name, String color) {
super(name, color);
}
@Overridepublic voidrun() {
System.out.println(name+"摇摇尾巴游啊游!!");
}
}classTest{public static voidmain(String[] args) {
Dog dog= new Dog("哈巴狗","⽩⾊");
dog.run();
Fish fish= new Fish("锦鲤","红⾊");
fish.run();
}
}
运⾏结果:
哈巴狗四条腿跑得快!!
锦鲤摇摇尾巴游啊游!!
这个问题解决了,那还有⼀个问题就是:抽象类能实例化对象吗?
看这个例⼦就知道了:
public abstract classAnimal {
String name;
String color;publicAnimal(String name,String color){this.name =lor =color;
}public abstract voidrun();
}classTest{public static voidmain(String[] args) {
Animal a= newAnimal();
a.run();
}
}
运⾏结果:
Error:(45, 20) java: animal.Animal是抽象的; ⽆法实例化
抽象类注意的细节:
1.如果⼀个函数没有⽅法体,那么该函数必须要使⽤abstract修饰,把该函数修饰成抽象的函数。
2.如果⼀个类出现了抽象的函数,那么该类也必须使⽤abstract修饰。
3.如果⼀个⾮抽象类继承了抽象类,那么必须要把抽象类的所有抽象⽅法全部实现。
4.抽象类可以存在抽象⽅法,也可以存在⾮抽象⽅法,还可以不存在抽象⽅法,但是这样没任何意义,Java是不写废话的。
5.抽象类是不能实例化对象的
6.抽象类是存在构造函数的,其构造函数是提供给⼦类创建对象的时候初始化⽗类的属性的。
疑问:为什么抽象类不能实例化对象?
因为抽象类是存在抽象⽅法的,如果能让抽象类创建对象的话,那么使⽤抽象类的对象调⽤抽象⽅法是没有任何意义的。疑问排解了,故事结束了?不,学海本⽆底,我们来点扩展,就是开头提到的如何⽤匿名内部类去实例化⼦类对象。
看下⾯的例⼦:
package Practice_Anything;public abstract classJava_Abstract2 {public voida(){
System.out.println("我是抽象类中的⼀个⾮抽象⽅法");
}public staticJava_Abstract2 newIntences(){return newJava_Abstract2(){
};
}
}classTest2{public static voidmain(String[] args) {
Java_Abstract2 java_abstract2=wIntences();
java_abstract2.a();
}
}
运⾏结果:
我是抽象类中的⼀个⾮抽象⽅法
这个故事到这就结束了,但是学习还没有停⽌,⽐如接⼝也是⼀种抽象类型,是抽象⽅法的集合,由此,我们是不是该联想到学习接⼝了呢?哈哈,学海本⽆底,前⾏莫彷徨!
此篇为本⼈原创,花了⼤概半天时间,了不知多少相关资料整合⽽成,如若对你有⽤,记得推荐,如若哪有不当,感谢指正!
本⽂已独家授权给脚本之家(jb51net)独家发布
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论