一、抽象类

1、介绍

  • 使用关键字 abstract 定义抽象类。
  • abstract定义抽象方法,只有声明,不用实现。
  • 包含抽象方法的类必须定义为抽象类。
  • 抽象类中可以有普通方法,也可以有抽象方法。
  • 抽象类不能被实例化,但可以定义引用变量。
  • 抽象关键字 abstract 和哪些不可以共存?final,private,static。

2、应用场景

  • 在某些情况下,某个父类只知道其子类应该包含怎样的方法,但不知道这些子类如何实现这些方法。
  • 从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为子类的模板,从而避免了子类设计的随意性。

  其他概念等,其他博客或书籍已介绍的很清楚,请读者自行百度,这里不做介绍。

3、案例

  下面定义了两个类,一个学生类,一个老师类。学生有姓名和年龄属性,还有吃饭和学习两个方法。老师也有姓名和年龄属性,还有吃饭和教书两个方法。

 1 class Student {
2 private String name;
3 private String age;
4
5 public void eat() {
6 System.out.println("学生在吃饭");
7 }
8
9 public void study() {
10 System.out.println("学生在学习");
11 }
12 }
13
14 class Teacher {
15 private String name;
16 private String age;
17
18 public void eat() {
19 System.out.println("老师在吃饭");
20 }
21
22 public void teach() {
23 System.out.println("老师在教书");
24 }
25 }

抽象类案例

  很明显,这两个类,学生和老师,都有共同的属性,姓名和年龄,也有共同的方法,吃饭。那么,就可以向上抽取一个抽象类,人。修改代码如下:

 1 /**
2 * 父类Person
3 * 通过关键字 abstract 定义Person是一个抽象类
4 */
5 abstract class Person {
6 private String name;
7 private String age;
8
9 /**
10 * abstract 抽象方法
11 * 只有方法的定义,没有方法的实现。
12 */
13 public abstract void eat();
14 }
15
16 class Student extends Person {
17
18 /**
19 * 不同的子类有不同的实现
20 */
21 @Override
22 public void eat() {
23 System.out.println("学生在吃饭");
24 }
25
26 public void study() {
27 System.out.println("学生在学习");
28 }
29
30 }
31
32 class Teacher extends Person {
33
34 /**
35 * 不同的子类有不同的实现
36 */
37 @Override
38 public void eat() {
39 System.out.println("老师在吃饭");
40 }
41
42 public void teach() {
43 System.out.println("老师在教书");
44 }
45 }

抽象类

  补充一下:①抽象类不可以实例化,②如果子类不想实现父类的抽象方法的话,可以将子类也申明为 abstract ,再由他的子类来实现即可。

  很明显,这样做,可以简化代码。但是,请读者不要以为只要是有共有的属性或者方法,就去使用抽象类,向上抽取为一个类。Java是面向对象的语言,封装、继承、多态是它的三大的特性。本博客中前面(一)虽然没有详细介绍,是默认读者有一定的Java基础,且这些概念百度到处都是,所以不赘述。

  抽象类,向上抽取,必须要有继承关系,也就是 is a 。这里,学生是一个人,老师也是一个人。所以抽取抽象类 Person。

  比如:下面是反例。

 1 class Student {
2 private String name;
3 private String age;
4
5 public void eat() {
6 System.out.println("学生在吃饭");
7 }
8
9 }
10
11 class Cat {
12 private String name;
13 private String age;
14
15 public void eat() {
16 System.out.println("猫在吃鱼");
17 }
18 }

抽象类反例

  这里,定义了学生类,猫类,同样,他们都有姓名和年龄属性,还有吃饭方法。最好就不要抽取抽象类。因为猫和人的共同父类是什么?在现实生活中是找不到的。Java中,所谓一切皆对象,程序代码也只是将现实生活中的事物在计算机中的映射。所以,这里不要为了代码的简介而胡乱抽取一个父类。有读者可能会说,他们都是生物啊,可以抽取一个Biology类,那如果是一个球类和学生类呢?这里只是举了一个例子,希望说明问题。实际开发中,读者可灵活定义!

Java基础(四)——抽象类和接口的更多相关文章

  1. java基础(四)-----抽象类与接口

    抽象类与接口是java语言中对抽象概念进行定义的两种机制,正是由于他们的存在才赋予java强大的面向对象的能力.他们两者之间对抽象概念的支持有很大的相似,甚至可以互换,但是也有区别. 一.抽象类 我们 ...

  2. Java基础之抽象类与接口

    Java基础之抽象类与接口 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的时候 ...

  3. 程序猿的日常——Java基础之抽象类与接口、枚举、泛型

    再次回顾这些基础内容,发现自己理解的又多了一点.对于一些之前很模糊的概念,渐渐的清晰起来. 抽象类与接口 抽象类通常是描述一些对象的通用方法和属性,并且默认实现一些功能,它不能被实例化.接口仅仅是描述 ...

  4. java基础之抽象类与接口的区别

    在学习java的过程中,或者是在找工作笔试或面试的时候,如果你是java岗位,那么抽象类与接口的区别无疑是一个大热点,是各大公司都想要考的一个小知识点,下面是我为了9月份秋招自己总结的,若有不对的地方 ...

  5. java基础之抽象类与接口的形式参数和返回值

    抽象类与接口形式参数和返回值问题 1.形参问题 /* 1.形式参数: 基本类型(太简单,不是我今天要讲解的) 引用类型 (1)类名:(匿名对象的时候其实我们已经讲过了) 需要的是该类的对象 (2)抽象 ...

  6. 3、java基础:抽象类与接口的区别

    抽象类 我们都知道在面向对象的领域一切都是对象,同时所有的对象都是通过类来描述的,但是并不是所有的类都是来描述对象的.如果一个类没有足够的信息来描述一个具体的对象,而需要其他具体的类来支撑它,那么这样 ...

  7. JAVA基础知识|抽象类与接口类

    一.抽象类 抽象类:拥有抽象方法的类就是抽象类,抽象类要使用abstract声明 抽象方法:没有方法体的方法,必须要使用abstract修饰 为什么要使用抽象类,抽象方法? 举例来说,如果你定义了一个 ...

  8. Java基础之抽象类和接口

    今天来说说抽象类和接口的实现以及它们的区别.我们知道抽象类和接口都是对具体事物的抽象,接口在实现上比抽象类更加抽象,抽象类中可以有普通方法和变量,而接口中只有抽象方法和不可变常量.但是从另一个角度看, ...

  9. java基础之抽象类和接口的区别

    抽象类和接口的区别 A:成员区别 抽象类: 成员变量:可以是变量,也可以是常量 构造方法:有 成员方法:可以是抽象方法,也可以是非抽象方法 接口: 成员变量:只能是静态常量(不写修饰符,默认是 sta ...

  10. Java基础(basis)-----抽象类和接口详解

    1.抽象类 1.1 abstract修饰类:抽象类 不可被实例化 抽象类有构造器 (凡是类都有构造器) 抽象方法所在的类,一定是抽象类 抽象类中可以没有抽象方法 1.2 abstract修饰方法:抽象 ...

随机推荐

  1. postman之get请求

    get请求:

  2. Create Shortcut for SSH Hosts

    You frequently visit host 10.0.7.141 for example. It's a waste to type "ssh gcp@10.0.7.141" ...

  3. SpringMVC学习07(Ajax)

    7.Ajax研究 7.1 简介 AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). AJAX 是一种在无需重新加载整个网页的情况 ...

  4. Axure RP 9 安装

    安装好的样子 官方安装包下载地址(速度较慢) 下载Axure RP 9 MAC版:https://axure.cachefly.net/AxureRP-Setup.dmg 下载Axure RP 9 P ...

  5. MySQL-10-索引应用规范

    建立索引的原则 SQL文件 sql文件下载链接: https://alnk-blog-pictures.oss-cn-shenzhen.aliyuncs.com/blog-pictures/world ...

  6. CVPR2021 | 重新思考BatchNorm中的Batch

    ​ 前言 公众号在前面发过三篇分别对BatchNorm解读.分析和总结的文章(文章链接在文末),阅读过这三篇文章的读者对BatchNorm和归一化方法应该已经有了较深的认识和理解.在本文将介绍一篇关于 ...

  7. Echarts 图表位置调整

    Echarts 图表的位置调整 折线图和柱状图,通过grid属性调整. grid:{ show:false, top:'20%', right:'5%', bottom:'10%', left:'10 ...

  8. 微信小程序中wx.login和wx.getUserProfile的使用

    在使用微信登录时,通常会在调用wx.login获取code后再通过wx.getUserProfile获取iv和encryptedData(加密数据)一起发到后端进行登录验证 在实际使用中如果在wx.l ...

  9. NOIP 模拟 $26\; \rm 降雷皇$

    题解 \(by\;zj\varphi\) 用树状数组优化一下求最长上升子序列即可. 至于第二问,在求出答案后开 \(n\) 棵线段树,每颗维护当前最长上升子序列长度的方案数. Code #includ ...

  10. SSM自学笔记(二)

    3.SpringMVC入门 1.Spring与Web环境集成 1.1 ApplicationContext应用上下文获取方式 应用上下文对象是通过new ClasspathXmlApplication ...