类的继承结构中,越往上的类越具有通用性,也就越抽象。当它抽象到一定程度,就变成概念成框架,不能再产生实例化的对象了。例如“交通工具”,就无法用它来产生一个实例。
       对应这一现象,Java中提供了抽象类,它只能作为父类,不能实例化。定义抽象类的作用是将一类对象的共同特点抽象出来,成为代表该类共同特性的抽象概念,其后在描述某一具体对象时,只要添加与其他子类对象的不同之处,而不需要重复类的共同特性。这样就使得程序概念层次分明,开发更高效。与抽象类紧密相连的是抽象方法一它总是用在抽象类或接口中。

一、抽象类的定义

被关键字“abstract”修饰的类,为抽象类。(而且,abstract只能修饰类和方法)

abstract class className{类体;
}

在抽象类中,可以有0个或者多个抽象方法,也可以有普通的实例方法和静态方法,还可以有其他的成员变量和构造方法。如果类中没有任何形式的抽象方法,那么可以由程序员决定是否将类声明成abstract类型,但是只要是下面这些情况之一,那类必定为抽象类,必须加上abstract修饰。

  • 类中明确声明有abstract方法的。
  • 类是抽象类继承下来的,而且没有实现父类中全部的抽象方法。
  • 类实现了一个接口,但没有将其中所有的抽象方法实现。

抽象类不一定有抽象方法,有抽象方法的类一定是抽象类或者是接口。(这点要铭记,有些文章说含有抽象方法的类就是抽象类,这个是不准确的)

那么什么是抽象方法呢?

二、抽象方法的声明

抽象方法:使用abstract关键字定义的方法,抽象方法没有具体的方法体;抽象类必须也要用abstract关键字定义。

抽象方法是一种只有方法声明面没有方法体定义的特殊方法。它的声明部分和一般方法并
没有太大的区别,也有访问权限、返回值类型等,只是需要在前面加上一个关键字“abstract”。通常的形式如下
abstract 访问权限 返回类型 方法名 ([参数列表]);
特持别注意它的最后有一个分号“;”,而没有方法体的括号“{ }”。
例如下面就是一个合法的抽象方法。
abstract protected void eat();
而下面这个,虽然方法体为空,但它不是一个合法的抽象方法。
abstract protected void eat() { }

声明抽象方法时有以下几个限制,具体原理文章后面会讲到

  • 构造方法不能声明为 abstract
  • 静态方法不能声明为 abstract
  • privale方法不能声明为 abstraet
  • final方法不能声明为 abstract
  • 抽象方法只能出现在抽象类或接口中

三、抽象类的特点

1.抽象类和抽象方法必须用abstract关键字修饰

abstract class 类名 {}
public abstract void 方法名();

2.抽象类不一定有抽象方法,有抽象方法的类一定是抽象类或者是接口(这点上面讲过,是个易错点)

3.抽象类不能实例化,那么抽象类如何实例化
抽象类如果可以实例化的话,那么就可以调用类中的抽象方法,很明显调用抽象方法是没有意义的,所以抽象类不能实例化,如何非要实例化,那就按照多态的方式,由具体的子类实例化。(其实这也是多态的一种,抽象类多态,不能算抽象类实例化

public class Demo1_Abstract {public static void main(String[] args) {//Animal a = new Animal();         //错误: Animal是抽象的; 无法实例化Animal a = new Cat();               //父类引用指向子类对象a.eat();}
}abstract class Animal {                        //抽象类public abstract void eat();                //抽象方法
}class Cat extends Animal {public void eat() {System.out.println("猫吃鱼");}
}

运行结果:

4.抽象类的子类

 要么是抽象类要么重写抽象类中的所有抽象方法

补充说明

四、抽象类的成员特点

抽象类的成员特点:

  1. 成员变量:既可以是变量,也可以是常量。(abstract是否可以修饰成员变量?不能修饰成员变量)
  2. 构造方法:有,用于子类访问父类数据的初始化。
  3. 成员方法:既可以是抽象的,也可以是非抽象的。
abstract class Demo {int num1 = 10;         //定义了变量final int num2 = 20;   //定义了常量public Demo(){}          //构造方法public void print() {System.out.println("hello");}public abstract void method();    //既有非抽象方法又有抽象方法
}class Test extends Demo {public void method() {System.out.println("world");}
}

抽象类的成员方法特性:

  • 抽象方法:强制要求子类做的事情。
  • 非抽象方法:子类继承的事情,提高代码复用性。

五、抽象类的一些问题解答

1、一个抽象类如果没有抽象方法,可不可以定义为抽象类?如果可以,有什么意义?
可以,这么做目的只有一个,就是不让其他类创建本类对象,交给子类完成

2.构造方法为什么不能声明为 abstract?
构造方法不能被继承,一个抽象的构造方法将永远不会被实现,所以它也不能声明为abstract的。

3.abstract不能和哪些关键字共存?

1.abstract和static被abstract修饰的方法没有方法体被static修饰的可以用类名.调用,但是类名.调用抽象方法是没有意义的
2.abstract和final被abstract修饰的方法强制子类重写被final修饰的不让子类重写,所以他俩是矛盾
3.abstract和private被abstract修饰的是为了让子类看到并强制重写被private修饰不让子类访问,所以他俩是矛盾的

测试如下

abstract class Demo {//public static abstract void print();  //错误: 非法的修饰符组合: abstract和static//public final abstract void print();    //错误: 非法的修饰符组合: abstract和finalprivate abstract void print();            //错误: 非法的修饰符组合: abstract和private
}

Java抽象类/抽象方法定义及其特性详解相关推荐

  1. Python基础(六) | 面向对象类定义及特性详解

    ⭐本专栏旨在对Python的基础语法进行详解,精炼地总结语法中的重点,详解难点,面向零基础及入门的学习者,通过专栏的学习可以熟练掌握python编程,同时为后续的数据分析,机器学习及深度学习的代码能力 ...

  2. Java泛型的定义和使用详解

    目录 一,为什么我们需要泛型 二,什么是泛型,泛型的定义 三,如何定义和使用泛型 四.限定类型变量 五.泛型中的约束和局限性 六.泛型类型的继承规则 七.通配符类型 八.虚拟机是如何实现泛型的? 一, ...

  3. 4.6 W 字总结!Java 11—Java 17特性详解

    作者 | 民工哥技术之路 来源 | https://mp.weixin.qq.com/s/SVleHYFQeePNT7q67UoL4Q Java 11 特性详解 基于嵌套的访问控制 与 Java 语言 ...

  4. Java EE 8的五大新特性详解

    Java EE 8的五大新特性详解 2018.4.3 版权声明:本文为博主chszs的原创文章,未经博主允许不得转载. Java EE 8带来了很多新特性,其中最好的新特性有下面五个. 备受期待的Ja ...

  5. Java基础学习总结(33)——Java8 十大新特性详解

    Java8 十大新特性详解 本教程将Java8的新特新逐一列出,并将使用简单的代码示例来指导你如何使用默认接口方法,lambda表达式,方法引用以及多重Annotation,之后你将会学到最新的API ...

  6. Atitit.jdk java8的语法特性详解 attilax 总结

    Atitit.jdk java8的语法特性详解 attilax 总结 1.1. 类型推断这个特别有趣的.鲜为人知的特性1 2. Lambda1 2.1. 内部迭代意味着改由Java类库来进行迭代,而不 ...

  7. Java(enum)枚举用法详解

    转载自 Java(enum)枚举用法详解 本篇文章主要介绍了Java 枚举用法详解,枚举的好处:可以将常量组织起来,统一进行管理.有兴趣的可以一起来了解一下. 概念 enum的全称为 enumerat ...

  8. java类修饰词和内部类详解

    java类修饰词和内部类详解 控制属性: 同一类内     同一包内      子类     所有类 public            可             可         可       ...

  9. java8-stream新特性详解及实战

    Java8 Stream新特性详解及实战 背景介绍 在阅读Spring Boot源代码时,发现Java 8的新特性已经被广泛使用,如果再不学习Java8的新特性并灵活应用,你可能真的要out了.为此, ...

最新文章

  1. 如何在iOS或macOS上检查活动的Internet连接?
  2. 阿里巴巴启动2017全球创客大赛 四大洲共设25个赛区
  3. Kafka如何在千万级别时优化JVM GC问题?
  4. LightGBM参数的贝叶斯搜索(有boost_from_average参数设置)
  5. Django(part6)--利用正则的组名进行关键字传参
  6. 用pc装华为服务器系统,pc安装服务器系统安装
  7. Go语言之高级篇beego框架之参数配置与路由配置
  8. 女人,向《奋斗》中的夏琳米莱们学习什么
  9. 和我一起入坑-React-Native-加入Redux的TodoList
  10. SAP License:谁能透露你的信息
  11. 用Java读取pdf中的数据
  12. 面向对象之自动绑定数据源
  13. python使用try语句捕获处理异常_Python使用try except处理程序异常的三种常用方法分析...
  14. 2021年CFA全套资料无偿分享|备考经验|备考计划
  15. 今日头条推荐算法相关博客集合
  16. Guava学习笔记:Google Guava 类库简介
  17. 邮件退回 对方服务器不允许,主 题:我给别人发的邮件被退回来了如何处理?...
  18. Windows ping General failure.
  19. Android音视频——MediaPlayerService
  20. sap的清账是什么意思_SAP清账的高手

热门文章

  1. 物联网的十大应用场景,带你认识真正的物联网通讯技术
  2. asp.net/net/c#房地产管理系统-成品
  3. 利用交换机镜像点抓流量与分析协议
  4. python通过API查阅热点新闻
  5. 大盘点|OCR算法汇总
  6. OAuth 2.0 学习
  7. 【中英双语】Unity:从零开始构建2D游戏
  8. word 解放双手,使用宏批量添加word中表格边框以及自适应
  9. 数据库学习笔记第一弹——MySQL8.0和MySQL5.7的下载、安装与配置(图文详解步骤2022)
  10. 计算机如何通过手机连接网络打印机,如何让手机连接上打印机,原来是这样的...