JAVA_SE基础——43.抽象类
高手勿喷~
抽象类:当定义一个类时,常常需要定义一些方法来描述该类的行为特征,但有时这些方法的实现方式是无法确定的。例如定义Animal类时,shout()方法用于表示动物的叫声,但是针对不同的动物,叫声也是不同的,因此在shout()方法中无法准确描述动物的叫声。
针对上面的情况,Java允许在定义方法时不写方法体,不包含方法体的方法为抽象方法,抽象方法必须使用abstract关键字来修饰,格式如下:
abstract void shout(); //定义抽象方法shout()
abstract表示抽象的,是最重要的一个修饰符,可以修饰类和方法。它们分别叫抽象方法和抽象类,人们在认识事物的时候,会把具有相同特征和行为的事物归为一个抽象类。。 比如动物就是一个很抽线的概念。当得到动物的实例时,总是某个具体物种的实例。所以说,在需要某个抽象类的实例时,只能够用某个具体类的实例来代替。
抽象类的应用场景:
我们在描述一类事物的时候,发现该种事物确实存在着某种行为,
但是这种行为目前是不具体的,那么我们可以抽取这种行为 的声明,但是
不去实现该种行为,这时候这种行为我们称作为抽象的行为,我们就需要使用抽象类。
抽象类的好处: 强制要求子类一定要实现指定的方法。
抽象类要注意的细节:
1. 如果一个函数没有方法体,那么该函数必须要使用abstract修饰,把该函数修饰成抽象 的函数。。
2. 如果一个类出现了抽象的函数,那么该类也必须 使用abstract修饰。
3. 如果一个非抽象类继承了抽象类,那么必须要把抽象类的所有抽象方法全部实现。
4. 抽象类可以存在非抽象方法,也可以存在抽象的方法.
5. 抽象类可以不存在抽象方法的。
6. 抽象类是不能创建对象的。
疑问:为什么抽象类不能创建对象呢?
因为抽象类是存在抽象方法的,如果能让抽象类创建对象的话,那么使用抽象的对象
调用抽象方法是没有任何意义的。
7. 抽象类是存在构造函数的,其构造函数是提供给子类创建对象的时候初始化父类的属性的。
abstract不能与以下关键字共同修饰一个方法:
1. abstract不能与private共同修饰一个方法。
2. abstract 不能与static共同修饰一个方法。
3. abstract 不能与final共同修饰一个方法。
白话解释:说到明就是不具体的总类写成抽象类就可以了,例如有个动物园,里面有着各种各样的动物,有狗,有猫等等,,,你能让它们叫吗?它们的叫声一样吗?怎么具体让什么动物叫?
这时,就应该想到abstract关键字,用来定义抽象类。。见实例1
实例1
//定义抽象类Zoo
abstract Zoo{
//定义抽象方法shout()
abstract void shout();
}
P.S.
在定义抽象类的时候要注意,包含抽象方法的类必须声明为抽象类,但是抽象类可以不包含任何抽象方法,只需使用abstract关键字即可。。 最值得注意的是:抽象类不可以被实例化的,因为抽象类中有可能包含抽象方法,抽象方法时没有方法体的,不可以被调用。如果真的想调用抽象类定义的方法,则需要创建一个子类,在子类中将抽象类中的抽象方法进行实现。 见实例2
实例2
//定义抽象类Zoo
abstract class Zoo{
//定义抽象方法shout()
abstract void shout();
}
//定义Dog类继承抽象类Zoo
class Dog extends Zoo{
String name = "狗" ;
//实现抽象方法shout()
public void shout(){
System.out.println(name+"的叫声:汪汪汪~~~");
}
}
//定义Cat类继承抽象类Zoo
class Cat extends Zoo{
String name = "猫" ;
//实现抽象方法shout()
public void shout(){
System.out.println(name+"的叫声:喵喵喵~~~");
}
}
//定义测试类
class Demo1
{
public static void main(String[] args)
{
System.out.println("welcome to Zoo");
//创建Dog类的实例对象
Dog dog = new Dog();
//调用dog对象的shout()方法
dog.shout();
//创建Cat类的实例对象
Cat cat = new Cat();
//调用cat对象的shout()方法
cat.shout();
}
}
运行结果:
从运行结果可以看出,子类实现了父类的抽线方法后,可以正常进行实例化,并通过实例化对象调用方法。。
交流学习企鹅:654249738
JAVA_SE基础——43.抽象类的更多相关文章
- JAVA_SE基础——44.抽象类的练习
抽象类要注意的细节: 1. 如果一个函数没有方法体,那么该函数必须要使用abstract修饰,把该函数修饰成抽象 的函数..2. 如果一个类出现了抽象的函数,那么该类也必须 使用abstract修饰. ...
- JAVA_SE基础——6.标识符&关键字
学会写helloworld之后, 我们就开始来认识标识符&关键字 一.标识符 标识符是指可被用来为类.变量或方法等命名的字符序列,换言之,标识符就是用户自定义的名称来标识类.变量或方法等.更 ...
- [.net 面向对象编程基础] (15) 抽象类
[.net 面向对象编程基础] (15) 抽象类 前面我们已经使用到了虚方法(使用 Virtual修饰符)和抽象类及抽象方法(使用abstract修饰符)我们在多态一节中说到要实现类成员的重写必须定义 ...
- JAVA_SE基础——26.[深入解析]局部变量与成员变量的区别
黑马程序员入学blog ... 如果这章节很难懂的话应该返回去先看 JAVA_SE基础--10.变量的作用域 定义的位置上区别: 1. 成员变量是定义在方法之外,类之内的. 2. 局部变量是定义在方 ...
- JAVA_SE基础——9.基本数据类型间的转换
前面我已经教会大家基本的数据类型进行了介绍, 然后这篇文章,我来介绍下,基本数据类型的转换. Java中有两种类型转换形式,分别是自动类型转换和强制类型转换. Step1.自动类型转换. 自动类型 ...
- JAVA_SE基础——8.基本数据类型
基本数据类型有:整数类型.浮点类型.字符类型.布尔类型 整数类型 整数类型用来存储整数数值,即没有小数部分的数值.与C.C++语言相同,整数在Java语言中有3种表示形式:十进制.八进制和十六进制. ...
- JAVA_SE基础——7.常量&变量
上一篇,我讲了标识符&关键字 这篇我来解释下变量&常量~~~ 变量与常量这两个概念相信大家都不会感到陌生,在数学中就已经涉及了变量与常量.理解变量与常量,可以举这样一个例子: 例 ...
- JAVA_SE基础——5.第一个Java程序HelloWorld&注释的应用
配置完JDK&环境变量后,我们就可以开始写程序了,那么程序怎么写呢,用什么工具呢,我建议 为了方便学习,我们最好在一个磁盘下建立一个专门的文件来写java程序,比如就在D盘下建立一个名为&qu ...
- JAVA_SE基础——4.path的临时配置&Classpath的配置
这次,我来写下关于path的临时配置的心的 我来说个有可能的实例:如果你去到别人的电脑 又想写代码 又不想改乱别人的path配置的话 再说别人愿意你在别人的电脑上瞎配吗? 那该怎么办呢? 那没问题 ...
随机推荐
- 构造方法里的super()方法
为什么经常会遇到有的构造函数会有super(),而有的却没有,其实super就比如 对数函数,log的底数为10,如果为10 ,我们可写可不写,如果不为10,那么我们就要加上底数 在子类构造方法中,s ...
- Vuex 教程案例:计数器以及列表展示
本案例github:https://github.com/axel10/Vuex_demo-Counter-and-list 本篇教程将以计数器及列表展示两个例子来讲解Vuex的简单用法. 从安装到启 ...
- 用firefox 31配合KeePass密码管理器实现web帐号密码自动填写登录
原文:http://bbs.kafan.cn/thread-1754676-1-1.html KeePass的优势:1.这是一款完全开源的密码管理器2.很多人都使用lastpass来保存密码,而这种严 ...
- leaflet渲染mapbox gl的矢量数据
准备条件 1.mapbox-gl.js mapbox-gl.css 2.leaflet-mapbox-gl.js https://github.com/mapbox/mapbox-gl-leaflet ...
- 【RMAN】Oracle中如何备份控制文件?备份控制文件的方式有哪几种?
真题1. 如何备份控制文件?备份控制文件的方式有哪几种? 答案:备份控制文件的方式有多种. ① 备份控制文件可以在线进行: SQL> ALTER DATABASE BACKUP CONTROLF ...
- Linux-CentOS7下安装mysql5.6常见问题解决!
第一次写博客,写的不好请大家多见谅!有遇到问题可以评论到下方,我会抽空帮大家解决!! 下载MySQL-5.6.tar安装包(包含server,client等) 首先用root用户将MySQL-5.6. ...
- CentOS7.2下Nginx的使用
Nginx的启动 指定配置文件的方式启动 nginx -c /etc/nginx/nginx.conf 对于yum安装的nginx,使用systemctl命令启动 systemctl start ng ...
- JavaIO
1.字节流和字符流 在IO有两种数据传输格式一个是字符流还一个是字节流,但是字符流就会涉及到编码的问题. 一开始美国使用的自己的编码表就是ASCII表 中国的字符需要被识别也需要编码表于是就有了GB2 ...
- python中super()的一些用法
在看python高级编程这本书的时候,在讲到super的时候,产生了一些疑惑,super在python中的用法跟其他的语言有一些不一样的地方,在网上找了一些资料,发现基本上很少有文章能把我的疑惑讲明白 ...
- CAS简介和无锁队列的实现
Q:CAS的实现 A:gcc提供了两个函数 bool __sync_bool_compare_and_swap (type *ptr, type oldval, type newval, ...)// ...