java抽象类实例化_抽象类能实例化吗
抽象类能实例化吗?
这个问题我想了一个晚上,看了好几篇别人的博客,但结果都各不相同,每个人有每个人的理解,后来我想明白了:
抽象类不能直接通过new去实例化一个对象,那它就是不能实例化,要获取抽象类的对象, 需要先用一个类继承抽象类, 然后去实例化子类。也可以用匿名内部类,在抽象类中创建一个匿名的子类,继承抽象类,通过特殊的语法实例化子类的对象 。(后面会细说)
现在重点来了,要研究这个问题,前提是你要了解抽象类,万变不离其宗,我们从抽象类的根源谈起 , 深化对抽象类的理解。
首先看这个例子:
package com.my.animal;//动物类
public classAnimal {
String name;//名字
String color;//颜色
publicAnimal(String name,String color){this.name =name;this.color =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方法
解决方案:(抽象类的应用场景)
我们在描述一类事物的时候,发现该种事物确实存在着某种行为,但是这种行为目前是不具体的,那么我们可以抽取这种行为的声明,但是不去实现该种行为,这时候这种行为我们称作为抽象的行为,我们就需要使用抽象类
先看下面的例子:
package com.my.animal;//动物类(抽象类)
public abstract classAnimal {
String name;//名字
String color;//颜色//构造方法
publicAnimal(String name,String color){this.name =name;this.color =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 =name;this.color =color;
}public abstract voidrun();
}classTest{public static voidmain(String[] args) {
Animal a= newAnimal();
a.run();
}
}
运行结果:
Error:(45, 20) java: com.my.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=Java_Abstract2.newIntences();
java_abstract2.a();
}
}
运行结果:
我是抽象类中的一个非抽象方法
这个故事到这就结束了,但是学习还没有停止,比如接口也是一种抽象类型,是抽象方法的集合,由此,我们是不是该联想到学习接口了呢?哈哈,学海本无底,前行莫彷徨!
此篇为本人原创,花了大概半天时间,找了不知多少相关资料整合而成,如若对你有用,记得推荐,如若哪有不当,感谢指正!
本文已独家授权给脚本之家(jb51net)公众号独家发布
java抽象类实例化_抽象类能实例化吗相关推荐
- java 抽象类构造函数_抽象类可以有构造函数吗?
是的,抽象类可以有构造函数.考虑到这一点:abstract class Product { int multiplyBy; public Product( int multiplyBy ) { thi ...
- python函数实例化_用Python实例化函数
python函数实例化 In terms of Mathematics and Computer science, currying is the approach/technique by whic ...
- 抽象类真的也可以被实例化(Java)
面试过程中,遇到这个问题.当时处于懵的状态,回答抽象类不能被实例化.当时觉得此事必有蹊跷,查询了一些资料了解到: 抽象类其实是可以被实例化的,但是它的实例化方式并不是通过普通的new方式来创建对象,而 ...
- java面向对象编程_包_继承_多态_重载和重写_抽象类_接口_this和super
目录点击跳转 包 包的命名方法 导入包中的类 系统包的介绍 **注意事项** 继承 基础知识 构造方法 **基础语法** `protected`修饰符 组合 `this`和`super`关键字 `th ...
- 创建抽象类、_【Java视频教程】day16-抽象类
抽象类的概念 抽象的产生 需求:创建类描述猫和狗: 猫:颜色:名字:品种: 吃:叫:抓老鼠: 狗:颜色:名字:品种: 吃:叫:看家: 老的实现方式: //创建类描述狗 class Dog {priva ...
- JAVA抽象类接口初始化块实验_抽象类和接口 - 逝水无痕7777的个人空间 - OSCHINA - 中文开源技术交流社区...
抽象类和接口 1.抽象类 抽象方法是只有方法签名,没有方法实现的方法.有抽象方法的类只能被定义成抽象类,抽象类可以没有抽象方法.抽象方法和抽象类必须使用abstract修饰符来定义. 抽象类不能被实例 ...
- 【Java基础系列教程】第八章 Java面向对象详解(三)_抽象类、接口、内部类、深拷贝与浅拷贝
一.JavaBean规范 1.1 什么是JavaBean JavaBeans是Java中一种特殊的类,可以将多个对象封装到一个对象(bean)中.特点是可序列化,提供无参构造器,提供getter方法和 ...
- idea实现抽象类的所有抽象方法_深入理解Java的接口和抽象类
作者简介: 工会 10年后端工作经验,主要记录分享:java学习方法.学习心得等. 内容包含Java技术.前后端.数据库.编程感悟等干货. 对于面向对象编程来说,抽象是它的一大特征之一.在Java中, ...
- 没有体现JAVA接口功能_深入浅出分析Java抽象类和接口【功能,定义,用法,区别】...
本文实例讲述了Java抽象类和接口.分享给大家供大家参考,具体如下: 对于OOP编程来说,抽象是它一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:抽象类和接口. 这两者有相似之处也有很 ...
最新文章
- 工业4.0进行时:未来协作方式的变革
- java 与 |与||的区别
- 在Jetson Xavier NX上安装pycuda报错:src/cpp/cuda.hpp:14:10: fatal error: cuda.h: No such file or directory
- 求解最长单调递增子串
- intimidated
- 数据合并设计_Excel数据管理中的那些“坑”,你踩了几个?
- vue中定义多重样式
- Docker镜像优化:从1.16GB到22.4MB,真强!
- WINX的消息分派机制(续)
- CV之FR:基于某AI公司的API接口基于人脸识别实现计算人脸相似度(计算两张人脸图片相似度进而判断否为同一个人)—利用人工智能算法判断相似度极高的国内外明星案例应用
- 不用光盘,教你一招让win10系统恢复出厂设置
- 【界面设计】针对应力强度模型使用Monte-Carlo进行可靠性仿真
- POWERDNS + LVS + LAMP + NFS + MYSQL主从读写分离
- 谈SPFA解差分约束最大值最小值的原理...
- php ppt生成图片不显示,ppt图片在word中不能正常显示,只显示为矩形框的解决方法...
- Danar程序员之家在CSDN安家落户啦
- Mint UI—loadmore—Pull down下拉刷新将下拉刷新的箭头标志更换成其他图片(图文)
- 学习笔记:CODESYS(顺序功能图SFC)
- java中的artifact啥意思_maven中的groupId和artifactId到底指的是什么
- 【P8090 [USACO22JAN] Herdle B】题解