先来看一道题:

下列哪一种叙述是正确的

A:abstract修饰符可修饰字段、方法和类

B:抽象方法的body部分必须用一对大括号{ }包住

C:声明抽象方法,大括号可有可无

D:声明抽象方法不可写出大括号

解析:D

java中规定:abstract只能修饰类和方法,不能修饰变量。

1、什么是抽象类?

类和类之间如果具有相同的特征,将这些共同的特征提取出来,形成的就是抽象类。

类本身是不存在的,所以抽象类无法实例化对象。
类到对象是实例化,对象到类是抽象。

public class Test {public static void main(String[] args) {Animal a1 = new Animal();  //此行报错}
}
//抽象类Animal
abstract class Animal {}

编译结果:Animal是抽象的; 无法实例化。

2、抽象类属于什么类型?
抽象类也是类,属于引用数据类型。

3、抽象类怎么定义?
语法:[修饰符列表] abstract class 类名 { }

4、抽象类是无法实例化的,无法创建对象的,所以设计抽象类就是用来被子类继承的。

5、abstractb不能和final、private、static联合使用,只能单独使用abstract或者联合public abstract使用。

6、抽象类就是用来被继承的,子类可以是抽象类,也可以是非抽象类。
非抽象子类继承了抽象父类,必须重写父类的抽象方法,可以有自己的方法,但不能是抽象方法;
抽象子类继承了抽象父类,不需要重写父类的抽象方法,可以有自己的方法,但必须是抽象方法

//抽象类Animal,父类
abstract class Animal {}
//抽象类Bird,子类
abstract class Bird extends Animal {}
//非抽象类:Cat,子类
class Cat extends Animal {}

编译结果:编译成功。
7、抽象类虽然无法被实例化,但是抽象类有构造方法,这个构造方法是供子类使用的。

子类怎么调用父类的构造方法?
子类的构造方法第一行使用super(形参列表)方法调用父类的构造方法。

//抽象类Animal,父类
abstract class Animal {public Animal() {}
}
//抽象类Bird,子类
abstract class Bird extends Animal {public Bird() {super();}
}
//非抽象类:Cat,子类
class Cat extends Animal {public Cat() {super();}

编译结果:编译成功。

8、抽象类关联到一个概念:抽象方法。那什么是抽象方法?
抽象方法表示没有实现的方法,没有方法体的方法。例如:

public abstract void doSome();  //注意:没有“{ }”。

抽象方法特点是:前面使用abstract修饰,没有方法体,以分号结尾。

9、抽象类中可以有抽象方法,可以有实例方法,也可以没有抽象方法,但抽象方法一定得出现在抽象类中,或者这样说吧,抽象方法只能出现在抽象的容器中,也就是说一个类不是抽象类,那它不能有抽象方法。

//抽象类Animal
abstract class Animal {public abstract void doSome();  //抽象类中的抽象方法,没有方法体public void doOther() {  //抽象类中的实例方法}public Animal() {}
}class User {public abstract void doSome();  //编译报错:User不是抽象的, 并且未覆盖User中的抽象方法doSome()
}

10、非抽象类继承抽象类,子类一定,必须得覆盖父类中的抽象方法。为什么?

因为抽象方法只能出现在抽象类当中。子类继承了父类,也就继承了父类的抽象方法,相当于子类自己有了抽象方法,而子类自己本身不是抽象类,就必须自己覆盖掉那个抽象方法。

总结:

1、抽象类怎么定义?
在class前面添加abstract关键字就行了。

2、抽象类无法实例化对象,所以抽象类是用来被子类继承的。

3、abstract不能和final、private、static联合使用,只能单独使用,或者联合public abstract使用。一般就是public abstract联合使用。

4、抽象类的子类可以是抽象类,也可以是非抽象类。

5、抽象类虽然无法实例化,但是抽象类有构造方法,这个构造方法是供子类使用的。

6、抽象类中可以有实例方法,不一定有抽象方法,但是抽象方法一定得出现在抽象类中。

7、抽象方法的特征:
public abstract void doSome();

abstract修饰的方法没有方法体,以分号结尾。

//附提一下:native修饰的方法也没有方法体。
//例如:Object里面的public native int hashCode();

面试题:没有方法体的方法都是抽象方法吗?(错的)

8、规定abstract只能修饰类和方法,不能修饰变量。

9、非抽象类继承抽象类,一定必须得将父类中的抽象方法进行覆盖重写(最重要的一条结论)。

万变不离其宗:
抽象类:此类不能实例化,要求子类去继承。
抽象方法:只能存在抽象容器中,要求子类去覆盖重写。
抽象变量:不存在这种定义。

Java中abstract的基本使用与详解相关推荐

  1. java throw与throws_基于Java中throw和throws的区别(详解)

    系统自动抛出的异常 所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行. 语句抛出的异常 ...

  2. java里的进制转换函数_基于Java中进制的转换函数详解

    十进制转成十六进制: Integer.toHexString(int i) 十进制转成八进制 Integer.toOctalString(int i) 十进制转成二进制 Integer.toBinar ...

  3. throws java_基于Java中throw和throws的区别(详解)

    系统自动抛出的异常 所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行. 语句抛出的异常 ...

  4. java线程和内核线程的,Java中内核线程理论及实例详解

    1.概念 内核线程是直接由操作系统内核控制的,内核通过调度器来完成内核线程的调度并负责将其映射到处理器上执行.内核态下的线程执行速度理论上是最高的,但是用户不会直接操作内核线程,而是通过内核线程的接口 ...

  5. java中List的用法和实例详解

    Java中List的用法和实例详解 List的用法 List包括List接口以及List接口的所有实现类.因为List接口实现了Collection接口,所以List接口拥有Collection接口提 ...

  6. java中switchcase用法,java中的switch case语句使用详解

    java中的switch case语句 switch-case语句格式如下: ? swtich()变量类型只能是int.short.char.byte和enum类型(JDK 1.7 之后,类型也可以是 ...

  7. java中带符号十六进制转换成十进制详解

    java中带符号十六进制转换成十进制详解 代码如下 代码如下 必须拿ffff进行测试,否则测不出异同 public void test1(){String strHex="ffff" ...

  8. java里throws详细讲解,基于Java中throw和throws的区别(详解)

    系统自动抛出的异常 所有系统定义的编译和运行异常都可以由系统自动抛出,称为标准异常,并且 Java 强烈地要求应用程序进行完整的异常处理,给用户友好的提示,或者修正后使程序继续执行. 语句抛出的异常 ...

  9. Java中的Timer和Timer Task详解

    Java Timer&TimerTask原理分析 如果你使用Java语言进行开发,对于定时执行任务这样的需求,自然而然会想到使用Timer和TimerTask完成任务,我最近就使用 Timer ...

最新文章

  1. Maven安装与配置详解(Win10)
  2. Linux基础练习题(三)
  3. 游戏网页设计:拟物还是扁平?
  4. 毫秒级预测,性能卓越!检测、跟踪、行为识别都搞定!这套行人分析系统重磅开源!...
  5. 轻松学c语言编程.pdf等,轻松学编程 轻松学C语言编程pdf
  6. kali linux set工具,求助: 社会工程学工具set 出现错误for kali linux.
  7. tensorflow中的global_step参数(转)
  8. session的销毁方式
  9. GFZRNX学习教程(安装以及rinex格式转换)
  10. Vue - 引入集成 Tinymce 富文本编辑器(详细步骤及运行Demo),在 Vue.js 项目中使用富文本插件详细教程,附带超级详细的注释说明
  11. Grafana实现参数查询功能
  12. js点击获取短信验证码
  13. LC串联谐振的分析方法
  14. 【javascript激增的思考02】模块化与MVC
  15. 假如生活欺骗了你 (普希金诗歌)
  16. 爱情在患得患失时最美丽
  17. Openairinterface从零开始搭建5G核心网——Basic版
  18. python [WinError 5] [WinError 145] 错误处理方案
  19. matlab生成不同的椭圆,[平面几何][Matlab] 平面椭圆参数与一般式之间的转换
  20. 不平衡桥法检测新能源电动汽车绝缘以及绝缘电阻推导计算

热门文章

  1. CString中 format、trimLeft和trimright、trim 和FindOneOf用法
  2. linux个人桌面推扩情况,linux桌面
  3. Lucene入门及操作详解
  4. 深度学习的初学者用哪本书比较好的?
  5. 【软件测试自动化-QTP系列讲座 11】== AOM应用(一)+QuickTest+Automation ==
  6. SQL-SERVER语法特性
  7. 【C语言】求自然对数的底e 03
  8. python学习第一周总结
  9. 【英杰送书第三期】Spring 解决依赖版本不一致报错 | 文末送书
  10. Python如何实现机器人聊天