一、抽象类

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. solr(CVE-2019-0193)远程命令执行

    影响版本 Apache Solr < 8.2.0 并且开启了DataImportHandler模块(默认情况下该模块不被启用) 安装 重启daoker  更新配置文件 systemctl dae ...

  2. Python: 解析crontab正则,增加+操作

    以下是使用Python解析crontab时间格式的一个类, 同时minute和hour支持了 + 的操作. 记录一下备忘. 其中的line参数是字符串分拆后的格式, 包含了 "week&qu ...

  3. DC-4 靶机渗透测试

    DC-4 渗透测试 冲冲冲,努力学习 .掌握 hydra ,nc反弹shell 记住你要干嘛, 找地方上传shell(大多以后台登录为切入点,再反弹shell),shell提权到root 操作机:ka ...

  4. .NET5控制台程序使用EF连接MYSQL

    .NET5控制台程序使用EF连接MYSQL 1.使用nuget下载: Microsoft.Extensions.Configuration.Json Pomelo.EntityFrameworkCor ...

  5. 为什么 WordPress 镜像用起来顺手?

    有用户朋友问,用已有WordPress镜像好?还是自己动手安装配置好? 答案:用Websoft9的相关镜像好(各大云市场的镜像提供商比较多,"真假李逵"的现象总是有的,我们只对We ...

  6. 计算机网络模型和5G知识

    目录 一.网络布线及信号传输 1.信号 2.传输介质 2.1双绞线 2.2光纤 2.3常见性问题 三.无线传播介质 四.综合布线系统 五.计算机的数制度以及运算 一.网络布线及信号传输 1.信号 频率 ...

  7. 未知高度-纯css实现水平垂直居中

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. JavaGUI画笔工具的使用

    JavaGUI画笔工具的使用 package GUI; import java.awt.*; public class TestPaint { public static void main(Stri ...

  9. Send Excerpts from Jenkins Console Output as Email Contents

    Sometimes we need to send some excerpts from Jenkins console output (job logs) as email, such as tes ...

  10. Using Evernote with Wine on Mint

    Install Evernote Install Evernote in Wine: wine Evernote_xxx.exe; Backup Evernote Database File Loca ...