Java基础学习总结(3)——抽象类
一、抽象类介绍
下面通过一下的小程序深入理解抽象类
因此在类Animal里面只需要定义这个enjoy()方法就可以了,使用abstract关键字把enjoy()方法定义成一个抽象方法,定义如下:public abstract void enjoy();
从某种意义上来说,抽象方法就是被用来重写的,所以在父类声明的抽象方法一定要在子类里面重写。如果真的不想在子类里面重写这个方法,那么可以再在子类里面把这个方法再定义为抽象方法,因为子类觉得我去实现也不合适,应该让继承我的子类去实现比较合适,因此也可以在继承这个子类的下一个子类里面重写在父类里面声明的抽象方法,这是可以的。
这里有一个规则:既然父类里面的方法是抽象的,那么对于整个类来说,它就有一个没有实现的方法,这个方法不知道怎么去实现,那么这个类是就是残缺不全的,因此这个类应该被定义为一个抽象类。所以前面这样声明的声明的class Animal应该要在class的前面加上abstract,即声明成这样:abstract class Animal,这样Animal类就成了一个抽象类了。Animal类的最终定义代码如下:

1 /**
2 * 父类Animal
3 * 在class的前面加上abstract,即声明成这样:abstract class Animal
4 * 这样Animal类就成了一个抽象类了
5 */
6 abstract class Animal {
7
8 public String name;
9
10 public Animal(String name) {
11 this.name = name;
12 }
13
14 /**
15 * 抽象方法
16 * 这里只有方法的定义,没有方法的实现。
17 */
18 public abstract void enjoy();
19
20 }

Java语言规定,当一个类里面有抽象方法的时候,这个类必须被声明为抽象类。
子类继承父类时,如果这个父类里面有抽象方法,并且子类觉得可以去实现父类的所有抽象方法,那么子类必须去实现父类的所有抽象方法,如:

1 /**
2 * 子类Dog继承抽象类Animal,并且实现了抽象方法enjoy
3 * @author gacl
4 *
5 */
6 class Dog extends Animal {
7 /**
8 * Dog类添加自己特有的属性
9 */
10 public String furColor;
11
12 public Dog(String n, String c) {
13 super(n);//调用父类Animal的构造方法
14 this.furColor = c;
15 }
16
17 @Override
18 public void enjoy() {
19 System.out.println("狗叫....");
20 }
21
22 }

这个父类里面的抽象方法,子类如果觉得实现不了,那么把就子类也声明成一个抽象类,如:

1 /**
2 * 这里的子类Cat从抽象类Animal继承下来,自然也继承了Animal类里面声明的抽象方法enjoy(),
3 * 但子类Cat觉得自己去实现这个enjoy()方法也不合适,因此它把它自己也声明成一个抽象的类,
4 * 那么,谁去实现这个抽象的enjoy方法,谁继承了子类,那谁就去实现这个抽象方法enjoy()。
5 * @author gacl
6 *
7 */
8 abstract class Cat extends Animal {
9
10 /**
11 * Cat添加自己独有的属性
12 */
13 public String eyeColor;
14
15 public Cat(String n, String c) {
16 super(n);//调用父类Animal的构造方法
17 this.eyeColor = c;
18 }
19 }

这里的子类Cat从抽象类Animal继承下来,自然也继承了Animal类里面声明的抽象方法enjoy(),但子类Cat觉得自己去实现这个enjoy()方法也不合适,因此它把它自己也声明成一个抽象的类,那么,谁去实现这个抽象的enjoy方法,谁继承了子类,那谁就去实现这个抽象方法enjoy()。如:

1 /**
2 * 子类BlueCat继承抽象类Cat,并且实现了从父类Cat继承下来的抽象方法enjoy
3 * @author gacl
4 *
5 */
6 class BlueCat extends Cat {
7
8 public BlueCat(String n, String c) {
9 super(n, c);
10 }
11
12 /**
13 * 实现了抽象方法enjoy
14 */
15 @Override
16 public void enjoy() {
17 System.out.println("蓝猫叫...");
18 }
19
20 }

完整的测试代码如下:

1 package javastudy.summary;
2
3 /**
4 * 父类Animal
5 * 在class的前面加上abstract,即声明成这样:abstract class Animal
6 * 这样Animal类就成了一个抽象类了
7 */
8 abstract class Animal {
9
10 public String name;
11
12 public Animal(String name) {
13 this.name = name;
14 }
15
16 /**
17 * 抽象方法
18 * 这里只有方法的定义,没有方法的实现。
19 */
20 public abstract void enjoy();
21
22 }
23
24 /**
25 * 这里的子类Cat从抽象类Animal继承下来,自然也继承了Animal类里面声明的抽象方法enjoy(),
26 * 但子类Cat觉得自己去实现这个enjoy()方法也不合适,因此它把它自己也声明成一个抽象的类,
27 * 那么,谁去实现这个抽象的enjoy方法,谁继承了子类,那谁就去实现这个抽象方法enjoy()。
28 * @author gacl
29 *
30 */
31 abstract class Cat extends Animal {
32
33 /**
34 * Cat添加自己独有的属性
35 */
36 public String eyeColor;
37
38 public Cat(String n, String c) {
39 super(n);//调用父类Animal的构造方法
40 this.eyeColor = c;
41 }
42 }
43
44 /**
45 * 子类BlueCat继承抽象类Cat,并且实现了从父类Cat继承下来的抽象方法enjoy
46 * @author gacl
47 *
48 */
49 class BlueCat extends Cat {
50
51 public BlueCat(String n, String c) {
52 super(n, c);
53 }
54
55 /**
56 * 实现了抽象方法enjoy
57 */
58 @Override
59 public void enjoy() {
60 System.out.println("蓝猫叫...");
61 }
62
63 }
64
65 /**
66 * 子类Dog继承抽象类Animal,并且实现了抽象方法enjoy
67 * @author gacl
68 *
69 */
70 class Dog extends Animal {
71 /**
72 * Dog类添加自己特有的属性
73 */
74 public String furColor;
75
76 public Dog(String n, String c) {
77 super(n);//调用父类Animal的构造方法
78 this.furColor = c;
79 }
80
81 @Override
82 public void enjoy() {
83 System.out.println("狗叫....");
84 }
85
86 }
87
88 public class TestAbstract {
89
90 /**
91 * @param args
92 */
93 public static void main(String[] args) {
94
95 /**
96 * 把Cat类声明成一个抽象类以后,就不能再对Cat类进行实例化了,
97 * 因为抽象类是残缺不全的,缺胳膊少腿的,因此抽象类不能被实例化。
98 */
99 //Cat c = new Cat("Catname","blue");
100 Dog d = new Dog("dogname","black");
101 d.enjoy();//调用自己实现了的enjoy方法
102
103 BlueCat c = new BlueCat("BlueCatname","blue");
104 c.enjoy();//调用自己实现了的enjoy方法
105 }
106 }

Java基础学习总结(3)——抽象类的更多相关文章
- Java基础学习笔记(三) - 抽象类和接口
一.抽象类 没有方法主体的方法称为抽象方法,包含抽象方法的类就是抽象类. Java中使用 abstract 关键字修饰方法和类,抽象方法只有一个方法名,没有方法体. public abstract c ...
- java基础学习笔记五(抽象类)
java基础学习总结——抽象类 抽象类介绍
- Java基础学习笔记总结
Java基础学习笔记一 Java介绍 Java基础学习笔记二 Java基础语法之变量.数据类型 Java基础学习笔记三 Java基础语法之流程控制语句.循环 Java基础学习笔记四 Java基础语法之 ...
- 转载-java基础学习汇总
共2页: 1 2 下一页 Java制作证书的工具keytool用法总结 孤傲苍狼 2014-06-24 11:03 阅读:25751 评论:3 Java基础学习总结——Java对象的序列化和 ...
- 尚学堂JAVA基础学习笔记
目录 尚学堂JAVA基础学习笔记 写在前面 第1章 JAVA入门 第2章 数据类型和运算符 第3章 控制语句 第4章 Java面向对象基础 1. 面向对象基础 2. 面向对象的内存分析 3. 构造方法 ...
- Java基础学习(2)
Java基础学习(二) 面向对象 对象:客观存在的事物 面向对象:人具体关注的事物的某些信息 类:是模子,确定对象会拥有的特征(属性)和行为(方法) 对象的属性:对象具有的各种特征 对象的方法:对象能 ...
- Java基础学习(4)
Java基础学习(四) String类 特点:创建后不可再修改,看起来的修改只是创建了新的对象 常用方法 StringBuilder类 目的:解决String类频繁创建对象的问题 常用方法 特点:非线 ...
- Java基础学习-- 继承 的简单总结
代码参考:Java基础学习小记--多态 为什么要引入继承? 还是做一个媒体库,里面可以放CD,可以放DVD.如果把CD和DVD做成两个没有联系的类的话,那么在管理这个媒体库的时候,要单独做一个添加CD ...
- Java基础学习中一些词语和语句的使用
在Java基础学习中,我们刚接触Java会遇到一些词和语句的使用不清的情况,不能很清楚的理解它的运行效果会是怎么样的,如:break,continue在程序中运行效果及跳转位置, 1.先来看看brea ...
- 第二十八节:Java基础-进阶继承,抽象类,接口
前言 Java基础-进阶继承,抽象类,接口 进阶继承 class Stu { int age = 1; } class Stuo extends Stu { int agee = 2; } class ...
随机推荐
- LVS负载均衡三种模式的实现
何为lvs负载均衡? lvs负载均衡(linux virtual server)又名linux虚拟服务器.由章文嵩博士主导的负载均衡项目,目前LVS已经被集成到Linux内核模块中.该项目在Linux ...
- pytorch 3 activation 激活函数
2.3 Activation Function import torch import torch.nn.functional as F from torch.autograd import Vari ...
- [LeetCode] 350. 两个数组的交集 II intersection-of-two-arrays-ii(排序)
思路: 先找到set的交集,然后分别计算交集中的每个元素在两个原始数组中出现的最小次数. class Solution(object): def intersect(self, nums1, nums ...
- ucore_lab0
一直想好好学习一下操作系统课程,去一个Mooc网站上找了一门操作系统的课程.这便是里面的配套实验. 实验指导:点这里 lab0主要是准备相关的操作环境.课程推荐使用qemu作为硬件模拟器,推荐运行环境 ...
- unity 显示、隐藏Android导航栏
1.下面的返回.home栏可用Screen.fullScreen控制 2.导航栏的显示和隐藏用下面代码控制 private AndroidJavaObject currentActivity { ge ...
- JavaScript 常见创建对象的方式
JavaScript 有哪几种创建对象的方式? javascript创建对象简单的说,无非就是使用内置对象或各种自定义对象,当然还可以用JSON:但写法有很多种,也能混合使用. (1)对象字面量的方式 ...
- js 数组 : 差集、并集、交集、去重
//input:[{name:'liujinyu'},{name:'noah'}] //output:['liujinyu','noah'] Array.prototype.choose = func ...
- thinkphp 多个字段的不同关系的查询条件实现 .
tp的$map不同条件默认是 and ,如果要用or<><><><>如下 例如查询Stu表中年龄大于18,或者身高低于180cm的男性(1为男性),(例 ...
- 洛谷——P3398 仓鼠找sugar
https://www.luogu.org/problem/show?pid=3398#sub 题目描述 小仓鼠的和他的基(mei)友(zi)sugar住在地下洞穴中,每个节点的编号为1~n.地下洞穴 ...
- 四种GCC内置位运算函数
int __builtin_ffs (unsigned int x) 返回x的最后一位1的是从后向前第几位,比方7368(1110011001000)返回4. int __builtin_clz (u ...