java中abstract是什么_java关键字abstract
在java中我们中abstract关键字来表达抽象。举个例子:
我们说车子都可以跑(run)。但有几个轮子,怎么跑,对于不同的车有不同的结果。自行车需要人踩着跑,汽车发动机推动跑等等,那么我们可以车表达为抽象类。
/**
* 车子类
*/
public abstract class Car {
public abstract void run();
}
/**
* 自行车
*/
class Bicycle extends Car{
@Override
public void run() {
System.out.println("人踩着跑。。。");
}
}
/***
* 汽车
*/
class Automobile extends Car{
@Override
public void run() {
System.out.println("发动机驱动跑。。。");
}
}
假如后面各种车,倒着跑、悬在空中跑随你怎么跑,只需要继承抽象类实现自己的业务就行了。相信大家对java抽象已有一个初步的印象了。
抽象方法:
1、从上面的例子中我们可以看到抽象方法跟普通方法是有区别的,它没有自己的主体(没有{}包起来的
业务逻辑),跟接口中的方法有点类似。所以我们没法直接调用抽象方法
2、抽象方法不能用private修饰,因为抽象方法必须被子类实现(覆写),而private权限对于子类来
说是不能访问的,所以就会产生矛盾
3、抽象方法也不能用static修饰,试想一下,如果用static修饰了,那么我们可以直接通过类名调
用,而抽象方法压根就没有主体,没有任何业务逻辑,这样就毫无意义了。
抽象类:
1、用abstract关键字来表达的类,其表达形式为:(public)abstract class 类名{}
2、抽象类不能被实例化,也就是说我们没法直接new 一个抽象类。抽象类本身就代表了一个类型,无法
确定为一个具体的对象,所以不能实例化就合乎情理了,只能有它的继承类实例化。
3、抽象类虽然不能被实例化,但有自己的构造方法(这个后面再讨论)
4、抽象类与接口(interface)有很大的不同之处,接口中不能有实例方法去实现业务逻辑,而抽象类
中可以有实例方法,并实现业务逻辑,比如我们可以在抽象类中创建和销毁一个线程池。
5、抽象类不能使用final关键字修饰,因为final修饰的类是无法被继承,而对于抽象类来说就是
需要通过继承去实现抽象方法,这又会产生矛盾。(后面将写一篇关于finally的文章详细讨论)
抽象类与抽象方法的关联:
如果一个类中至少有一个抽象方法,那么这个类一定是抽象类,但反之则不然。也就是说一个抽象类中可
以没有抽象方法。这样做的目的是为了此类不能被实例化。
如果一个类继承了一个抽象类,那么它必须全部覆写抽象类中的抽象方法,当然也可以不全部覆写,如果
不覆写全部抽象方法则这个子类也必须是抽象类
public abstract class Car {
public void mothod1(){
}
public abstract void mothod2();
public abstract void method3();
}
class Bicycle extends Car{
@Override
public void mothod2() {//需要覆写抽象方法mothod2
}
@Override
public void method3() {//需要覆写抽象方法mothod3
}
}
抽象类的构造器:
先来看一个例子:
public abstract class Car {
Car(){
System.out.println("抽象方法无参构造函数");
}
Car(String a){
System.out.println("抽象有参构造方法");
}
public void mothod1(){
System.out.println(this.getClass());
System.out.println("抽象类的实例方法");
}
public abstract void mothod2();
}
/**
* 自行车
*/
class Bicycle extends Car{
Bicycle(){
System.out.println("子类无参构造函数");
}
@Override
public void mothod2() {//需要覆写抽象方法mothod2
}
}
/**另一个包的测试类**/
public class Test {
public static void main(String[] args) {
Bicycle b = new Bicycle();
b.mothod1();
}
}
结果:
抽象方法无参构造函数
子类无参构造函数
class com.shaolin.service.impl.Bicycle
抽象类的实例方法
从上面的例子中可以看出:
1、抽象类是有构造方法的(当然如果我们不写,编译器会自动默认一个无参构造方法)。而且从结果来看,和普通的继承类一样,在new 一个子类对象时会优先调用父类(这里指的是抽象类Car)的构造器初始化,然后再调用子类的构造器。至此相信大家都会有这样一个疑问,为什么抽象方法不能实例化却有构造器呢? 对于这个问题网上也中说纷纭,没有确定答案。
既然它也属于继承的范畴,那么当子类创建对象时必然要优先初始化父类的属性变量和实例方法,不然子类怎么继承和调用呢?而它本身不能实例化,因为它本身就是不确定的一个对象,如果它能被实例化,那么我们通过它的对象来调用它本身的抽象方法是不是有问题。所以不能实例化有在情理之中。因此大家只要记住这个规定就行。
2、对于抽象类中的非statci(静态)和非abstract(抽象)方法中的this关键字(静态方法中不能有关键字this之前已经讨论过可以参考 关于静态static那些事)代表的是它的继承类,而非抽象类本身,这个好理解,因为抽象类本身不能被实例化。如果有多个继承类,谁调用this就代表谁。
抽象类有什么好处呢?
1、由于抽象类不能被实例化,最大的好处就是通过方法的覆盖来实现多态的属性。也就是运行期绑定
2、抽象类将事物的共性的东西提取出来,由子类继承去实现,代码易扩展、易维护。
java中abstract是什么_java关键字abstract相关推荐
- java中用于定义小数的关键字_Java 中用于定义小数的关键字有两个:( ) 和 ( )。_学小易找答案...
[填空题]列举至少三种中药饮片现代贮藏方法 [单选题]用于薄壁形零件联接时,应采用 . [填空题]若螺纹的直径和螺纹副的摩擦系数一定, 则拧紧螺母时的效率取决于螺纹的 和 . [单选题]以太网采用的介 ...
- Java中的synchronized与volatile关键字
原文出处:http://hukai.me/android-training-course-in-chinese/performance/smp/index.html Java中的"synch ...
- Java中的break和continue关键字使用总结
java中的break和continue关键字使用总结 一.作用和区别 break的作用是跳出当前循环块(for.while.do while)或程序块(switch).在循环块中的作用是跳出当前正在 ...
- java中final详解_Java中final用法与详解
Java中final用法与详解 final作为Java中经常用到的关键字,了解final的使用方法是非常有必要的.这里从final关键字在数据域.方法和类中三个方面分析final关键字的主要用法. f ...
- 简要解析Java中的throw和throws关键字
解析Java中的throw和throws关键字 1 throws关键字 1.1 作用 向上抛异常,把异常交给调用处处理,实际上自身并没有处理异常. 1.2 原理 一旦方法体出现异常,仍会在异常代码出生 ...
- java中用于定义小数的关键字_Java中用于定义小数的关键字有两个:() 和 (),后者精度高于前者。...
1.[ 填空题 ]给Java中的菜单项设置快捷键所使用的类中对应的构造方法为______. 2.[ 主观题 ][程序设计题]编写一个方法hex3704(),要求将一个十进制正整数n转换成十六进制数,其 ...
- java中访问修饰符_Java中的非访问修饰符是什么?
java中访问修饰符 Java非访问修饰符 (Java non access modifiers) We have 7 non-access modifiers in Java. The name o ...
- java中static的用法_Java类中static的用法
关于Java中static的使用有以下四种情况: 1.静态成员变量 被static修饰的成员变量,叫静态成员变量或类变量:没有被static修饰的变量,叫实例变量. 两者的区别是: 静态 ...
- java中 2017 1等于_java 2017秋招1
1 GC是什么?为什么要有GC? GC是垃圾收集的意思,内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用 ...
最新文章
- 多线程——NSThread、GCD、NSOperation
- Net混淆与用de4dot工具破解
- 404. Sum of Left Leaves 左叶子之和
- 2021-04-08
- api自动化测试_API测试和自动化101:基本指南
- java字符串相关知识
- SQL SERVER占用CPU过高排查和优化
- python连接数据库oracle_python 连接oracle数据库:cx_Oracle
- php form 上传_php+html5使用FormData对象提交表单及上传图片的方法
- 【微信小程序】——wxss引用外部CSS文件及iconfont
- 接口设计考虑点及验证点
- 《修炼之道:.NET开发要点精讲》读书笔记(三)
- 阿里云云计算 41 阿里云CDN的工作原理
- VBS脚本病毒原理分析与防范
- 520 miix 小兵 黑苹果_黑苹果资源
- [附源码]java毕业设计户籍管理系统
- OpenGL LookAt、Camera摄像机
- 动态规划的一般解题思路-详解
- 【学习】loss图和accuracy
- RTFM(Read The Fucking Manual)的意思
热门文章
- 软件工程概论第一个冲刺周期
- 七、集成MyBatis
- 如何解决MySQL安装出现“此产品的配置信息已损坏,请联系专业人员技术支持”问题
- 如何才能设计出一个“好的”测试用例?
- 记一次针对SupeSite的中转注入实战
- Thinkphp command使用
- 评委打分——去掉一个最高分一个最低分算平均分
- CSS高级选择器+块级元素,行内元素的特点+CSS定位+logo的做法
- Java垃圾回收心得
- rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm下载地址 centos7 下 apt安装