Java基础(四)——抽象类和接口
一、抽象类
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基础(四)——抽象类和接口的更多相关文章
- java基础(四)-----抽象类与接口
抽象类与接口是java语言中对抽象概念进行定义的两种机制,正是由于他们的存在才赋予java强大的面向对象的能力.他们两者之间对抽象概念的支持有很大的相似,甚至可以互换,但是也有区别. 一.抽象类 我们 ...
- Java基础之抽象类与接口
Java基础之抽象类与接口 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类.这两者有太多相似的地方,又有太多不同的地方.很多人在初学的时候 ...
- 程序猿的日常——Java基础之抽象类与接口、枚举、泛型
再次回顾这些基础内容,发现自己理解的又多了一点.对于一些之前很模糊的概念,渐渐的清晰起来. 抽象类与接口 抽象类通常是描述一些对象的通用方法和属性,并且默认实现一些功能,它不能被实例化.接口仅仅是描述 ...
- java基础之抽象类与接口的区别
在学习java的过程中,或者是在找工作笔试或面试的时候,如果你是java岗位,那么抽象类与接口的区别无疑是一个大热点,是各大公司都想要考的一个小知识点,下面是我为了9月份秋招自己总结的,若有不对的地方 ...
- java基础之抽象类与接口的形式参数和返回值
抽象类与接口形式参数和返回值问题 1.形参问题 /* 1.形式参数: 基本类型(太简单,不是我今天要讲解的) 引用类型 (1)类名:(匿名对象的时候其实我们已经讲过了) 需要的是该类的对象 (2)抽象 ...
- 3、java基础:抽象类与接口的区别
抽象类 我们都知道在面向对象的领域一切都是对象,同时所有的对象都是通过类来描述的,但是并不是所有的类都是来描述对象的.如果一个类没有足够的信息来描述一个具体的对象,而需要其他具体的类来支撑它,那么这样 ...
- JAVA基础知识|抽象类与接口类
一.抽象类 抽象类:拥有抽象方法的类就是抽象类,抽象类要使用abstract声明 抽象方法:没有方法体的方法,必须要使用abstract修饰 为什么要使用抽象类,抽象方法? 举例来说,如果你定义了一个 ...
- Java基础之抽象类和接口
今天来说说抽象类和接口的实现以及它们的区别.我们知道抽象类和接口都是对具体事物的抽象,接口在实现上比抽象类更加抽象,抽象类中可以有普通方法和变量,而接口中只有抽象方法和不可变常量.但是从另一个角度看, ...
- java基础之抽象类和接口的区别
抽象类和接口的区别 A:成员区别 抽象类: 成员变量:可以是变量,也可以是常量 构造方法:有 成员方法:可以是抽象方法,也可以是非抽象方法 接口: 成员变量:只能是静态常量(不写修饰符,默认是 sta ...
- Java基础(basis)-----抽象类和接口详解
1.抽象类 1.1 abstract修饰类:抽象类 不可被实例化 抽象类有构造器 (凡是类都有构造器) 抽象方法所在的类,一定是抽象类 抽象类中可以没有抽象方法 1.2 abstract修饰方法:抽象 ...
随机推荐
- Python - if 条件控制
注意 本篇图片素材都来自慕课网,因为素材过于优秀,直接拿过来了,加水印只是为了防止整篇文章被搬 前言 程序并非是一成不变的向下执行,有的时候也要根据条件的不同选择不一样的代码,这个时候便用到了分支结构 ...
- 搭建SSM基础环境>基于idea
目录 搭建SSM基础环境 创建一个Web项目 导入所需要的jar包 在项目目录下创建一个Resources文件夹并设置为类路径 在src目录下创建项目的初始文件夹目录 在resources文件夹下创建 ...
- 记录21.07.23 —— Vue.js基础(二)
Vue基础(二) 过滤器 过滤器作用 全局过滤器 输出结果 私有过滤器 输出结果 把其中一个做点修改 错误信息 自定义指令 全局自定义指令 私有自定义指令 钩子函数 注意:fond-weight是粗细 ...
- Windows内核开发-5-(2)-内核模式调试
Windows内核开发-5-(2)-内核模式调试 普通用户模式的调试,采取的是给进程添加一个线程来挂起断点,作为一个调试器的线程在进程中使用.照这样来类推,对操作系统调试相当于添加一个进程来限制操作系 ...
- SpringBoot - 根据目录结构自动生成路由前缀
目录 前言 具体实现 配置文件指定基础包 自动补全路由前缀处理类 自动补全路由前缀配置类 测试类 测试 前言 本文介绍如何根据目录结构给RequestMapping添加路由前缀(覆盖RequestMa ...
- C++ 结构体案例2 升序打印数组中的元素
1 //结构体案例 2 2 #include<iostream> 3 #include<string> 4 #include<ctime> 5 using name ...
- 1~n数字中1出现的个数
1~n数字中1出现的个数 LeetCode 给定一个整数 n,计算所有小于等于 n 的非负整数中数字 1 出现的个数. 感觉挺有意思 对于一个数,我们先局部分析一下,比如123456,我们考虑百位这个 ...
- 面试反杀「GitHub 热点速览 v.21.33」
作者:HelloGitHub-小鱼干 作为一个应聘者,面试的时候经常会被面试官问:你有什么问题要问我吗?为了避免这种临时想不到问题的尴尬,reverse-interview-zh 会教你下反向操作,提 ...
- Git的使用以及整理
Usage of Git 1 Git区域划分 1)工作区(working directory):默认为项目根目录root 2)缓存区(stage):在版本库中设立一个缓存/暂存区,直接和工作区的文件进 ...
- spring学习06(AOP)
9.AOP 什么是AOP AOP(Aspect Oriented Programming)意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是软 ...