java语言,声明类时格式为: abstract class Db{} 说明Db类为抽象类。抽象方法是说没有方法的实现(方法体)此方法为抽象方法,只有抽象类和接口中才可以有抽象方法。简而言之,含有抽象方法的类一定是抽象类;关键字是abstract

抽象类本质

1.从类的组成上看其是抽象方法和非抽象方法的集合,还有属性(常量)。
2.从设计的角度来看,实际上抽象类定义了一套规范(抽象方法)。(规范)

使用规则

  1. 抽象类必须被继承,抽象方法必须被重写。
  2. 抽象类中的抽象方法只需声明,无需实现,没有方法体;
  3. 抽象类不能被实例化,抽象类不一定要包含抽象方法,而定义抽象方法的类必须是抽象类。
  4. 抽象类包含的抽象方法必须在其子类中被实现,否则该子类也必须是抽象类。
  5. 抽象类可以有构造方法供子类实例化对象
  6. 抽象类不能直接实例化使用,一般用的是抽象类的子类,
    A a = new B();
    A和B之间的关系,继承关系,接口实例关系。

下面逐条解释:

规则一

抽象类必须被继承,抽象方法必须被重写。

规则二

抽象类中的抽象方法只需声明,无需实现,没有方法体。
在Java中抽象类实际上是一种规范,一般在抽象类中声明方法不直接提供方法体(当然也可以提供),而是通过其子类去重写其抽象方法:

  1. package day_12_01.abs;
  2. /**
  3. * @author soberw
  4. */
  5. public abstract class A {
  6. //报错,不能定义抽象属性
  7. // abstract int a;
  8. //可以声明属性
  9. private int a;
  10. //可以声明一个普通方法
  11. public void a(){
  12. }
  13. //报错,因为抽象方法不能有方法体,即不能去实现
  14. // public abstract void aa(){
  15. //
  16. // }
  17. //抽象方法正确格式
  18. public abstract void aa();
  19. //抽象方法不能是私有的private
  20. // private abstract void bb();
  21. }
  22. //没有重写父类的抽象方法aa(),报错
  23. //class B extends A{
  24. //
  25. //}

注意

抽象方法不能是私有的private,因为一旦私有,子类就不能重写了,但这违背了抽象方法必须被重写的原则。

规则三

抽象类不能被实例化,抽象类不一定要包含抽象方法,而定义抽象方法的类必须是抽象类。
首先,抽象类不能被实例化,当一个类实例化对象后,这个对象就可以调用类中的属性或者方法了,但在抽象类有抽象方法(没有方法体),无法调用。自相矛盾,所以无法实例化。比如,我想实例化上例中的抽象类A:

  1. class TestA{
  2. public static void main(String[] args) {
  3. //报错
  4. // A a = new A();
  5. }
  6. }

抽象类不一定有抽象方法,这点显而易见,但是意义不大:

  1. //一个空的抽象类
  2. abstract class AA{
  3. }

然后,定义抽象方法的类必须是抽象类,这点也很好理解,一个普通的类是可以被实例化的,如果这个普通类存在抽象方法,那我是不是就可以通过对象去调用呢?当然不能。

  1. package day_12_01.abs;
  2. /**
  3. * @author soberw
  4. */
  5. //报错,因为抽象方法必须声明在抽象类中
  6. //public class B {
  7. // public abstract void b();
  8. //}

规则四

抽象类包含的抽象方法必须在其子类中被实现,否则该子类也必须是抽象类。
还拿上述代码做例子,如果我声明了一个类B,继承于A,那B就必须重写A中的抽象方法,否则报错(因为普通类中不能有抽象方法),解决方式一:重写父类抽象方法;解决方式二:将B声明为abstract:

  1. //解决方式一:重写父类抽象方法
  2. class B extends A{
  3. @Override
  4. public void aa() {
  5. }
  6. }
  7. //解决方式二:将B声明为abstract
  8. abstract class Bb extends A{
  9. }

规则五

抽象类可以有构造方法供子类实例化对象。
这点很好理解,因为首先可以确定的是,Java中所有的类都有构造方法,即使你是抽象类,虽然我们没写,但其实系统已经默认给我们提供了一个无参的空构造器,例如下面我显示化的在抽象类中声明一个构造方法:

  1. package day_12_01.abs;
  2. /**
  3. * @author soberw
  4. */
  5. public abstract class Ab {
  6. public Ab(){
  7. System.out.println("Abs......");
  8. }
  9. }
  10. class Abs extends Ab{
  11. }
  12. class Test{
  13. public static void main(String[] args) {
  14. Abs abs = new Abs();
  15. }
  16. }

运行结果:

证明我们在创建子类实例化对象时,父类的构造器也可实现(哪怕父类是抽象类)

规则六

抽象类不能直接实例化使用,一般用的是抽象类的子类。
抽象类不能去实例化对象,那如果我想用其中的一些非抽象方法呢,比如静态方法,比如普通方法呢或者是属性?
我们可以通过继承关系,去创建其子类的对象,形如:

A a = new B(); //其中A是父类,B是子类

  1. package day_12_01.abs;
  2. /**
  3. * @author soberw
  4. */
  5. public abstract class TT {
  6. String some = "hello";
  7. public static void talk() {
  8. System.out.println("talk...");
  9. }
  10. public void say() {
  11. System.out.println("say..." + some);
  12. }
  13. }
  14. class FF extends TT{
  15. }
  16. class FFTest{
  17. public static void main(String[] args) {
  18. TT.talk();
  19. TT f = new FF();
  20. f.say();
  21. }
  22. }

运行结果:

如果子类重写了父类的非抽象方法,那实际调用的就是子类重写后的。通过子类去调用父类的方法,即通过父类去new一个子类的对象,这实际上也是多态性的一种体现。当然了,抽象类中的静态方法是可以直接调用的(除非是私有的),实际上对任何类都一样。

浅谈Java面向对象之抽象类(abstract)的更多相关文章

  1. Java面向对象之抽象类abstract 入门实例

    一.基础概念 抽象事物,是若没有具体的信息可以描述这个事物,这个事物可以称为抽象事物. 抽象类,是不断的向上抽取而来.抽取方法声明而不确定具体的方法内容.由不同的子类来完成具体的方法内容. (一)抽象 ...

  2. 浅谈Java面向对象思想

    本人免费整理了Java高级资料,涵盖了Java.Redis.MongoDB.MySQL.Zookeeper.Spring Cloud.Dubbo高并发分布式等教程,一共30G,需要自己领取.传送门:h ...

  3. 浅谈Java中接口与抽象类的异同

    浅谈Java中接口与抽象类的异同 抽象类和接口这两个概念困扰了我许久,在我看来,接口与抽象类真的十分相似.期间也曾找过许许多多的资料,参考了各路大神的见解,也只能是简简单单地在语法上懂得两者的区别.硬 ...

  4. 浅谈Java接口(Interface)

    浅谈Java接口 先不谈接口,不妨设想一个问题? 如果你写了个Animal类,有许多类继承了他,包括Hippo(河马), Dog, Wolf, Cat, Tiger这几个类.你把这几个类拿给别人用,但 ...

  5. 浅谈JAVA集合框架

    浅谈JAVA集合框架 Java提供了数种持有对象的方式,包括语言内置的Array,还有就是utilities中提供的容器类(container classes),又称群集类(collection cl ...

  6. !! 浅谈Java学习方法和后期面试技巧

    浅谈Java学习方法和后期面试技巧 昨天查看3303回复33 部落用户大酋长 下面简单列举一下大家学习java的一个系统知识点的一些介绍 一.java基础部分:java基础的时候,有些知识点是非常重要 ...

  7. 浅谈Java的集合框架

    浅谈Java的集合框架 一.    初识集合 重所周知,Java有四大集合框架群,Set.List.Queue和Map.四种集合的关注点不同,Set 关注事物的唯一性,List 关注事物的索引列表,Q ...

  8. 浅谈java类集框架和数据结构(2)

    继续上一篇浅谈java类集框架和数据结构(1)的内容 上一篇博文简介了java类集框架几大常见集合框架,这一篇博文主要分析一些接口特性以及性能优化. 一:List接口 List是最常见的数据结构了,主 ...

  9. 浅谈Java的默认和静态方法

    目录 浅谈Java的默认和静态方法 Java新增默认方法有啥用 Java新增的静态方法有啥用 浅谈Java的默认和静态方法 允许在接口中声明默认方法和静态方法,是JDK1.8新增的特性.存在即合理,两 ...

随机推荐

  1. [学习笔记] Oracle集合运算、内连接、外连接、伪列

    集合运算 INTERSECT(交集),返回两个查询共有的记录. UNION ALL(并集重复),返回各个查询的所有记录,包括重复记录. UNION(并集不重复),返回各个查询的所有记录,不包括重复记录 ...

  2. CSS基础 CSS的三大特性以及选择器优先级计算方法

    1.子元素默认会继承父元素的样式,但不是所有的元素都有继承 常见的继承父元素特点的元素有: 1.color 2.font-sytle.font-weight.font-size.font-family ...

  3. python3 f-string格式化字符串的高级用法

    从Python 3.6开始,f-string是格式化字符串的一种很好的新方法.与其他格式化方式相比,它们不仅更易读,更简洁,不易出错,而且速度更快! 在Python 3.6之前,有两种将Python表 ...

  4. 779. 第K个语法符号

    <找规律> <递归> 题目描述 在第一行我们写上一个 0.接下来的每一行,将前一行中的0替换为01,1替换为10. 给定行数 N 和序数 K,返回第 N 行中第 K个字符.(K ...

  5. Centos更换阿里云源

    1.备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2.下载新的CentOS-Base ...

  6. react子组件向父组件传值

    子组件向父组件传值,注意父组件传递函数的时候必须绑定this到当前父组件(handleEmail={this.handleEmail.bind(this)}),不然会报错 /***实现在输入框输入邮箱 ...

  7. 通过了解Servlet和Http之间的关系,了解web中http通信使用

    注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6512336761551585796/ 1.<Servlet简单实现开发部署过程> 2.<Serv ...

  8. python分支结构与循环结构

    python分支结构 一.if 单条件形式 # 年轻人的世界都不容易 age > 18 age = int(input("请输入您的年龄:")) # input()函数 模拟 ...

  9. 《手把手教你》系列技巧篇(五十八)-java+ selenium自动化测试-分页测试(详细教程)

    1.简介 前几天,有人私信里留言问宏哥,分页怎么自动化测试了,完了给他说了说思路,不知道最后搞定没有,索性宏哥就写一篇文章来讲解和介绍如何处理分页. 2.测试场景 对分页来说,我们最感兴趣的和测试的无 ...

  10. 【reverse】逆向6 JCC

    [reverse]逆向6 JCC 前言 我们之前学习的时候讲了,eip寄存器存储的是当前(即将执行的语句的) 指向地址 而我们之前提到的下断点(F2),就和我们编程中的下断点一样,执行到某句汇编指令然 ...