一、抽象类介绍

  

下面通过一下的小程序深入理解抽象类

  因此在类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)——抽象类的更多相关文章

  1. Java基础学习笔记(三) - 抽象类和接口

    一.抽象类 没有方法主体的方法称为抽象方法,包含抽象方法的类就是抽象类. Java中使用 abstract 关键字修饰方法和类,抽象方法只有一个方法名,没有方法体. public abstract c ...

  2. java基础学习笔记五(抽象类)

    java基础学习总结——抽象类 抽象类介绍

  3. Java基础学习笔记总结

    Java基础学习笔记一 Java介绍 Java基础学习笔记二 Java基础语法之变量.数据类型 Java基础学习笔记三 Java基础语法之流程控制语句.循环 Java基础学习笔记四 Java基础语法之 ...

  4. 转载-java基础学习汇总

    共2页: 1 2 下一页  Java制作证书的工具keytool用法总结 孤傲苍狼 2014-06-24 11:03 阅读:25751 评论:3     Java基础学习总结——Java对象的序列化和 ...

  5. 尚学堂JAVA基础学习笔记

    目录 尚学堂JAVA基础学习笔记 写在前面 第1章 JAVA入门 第2章 数据类型和运算符 第3章 控制语句 第4章 Java面向对象基础 1. 面向对象基础 2. 面向对象的内存分析 3. 构造方法 ...

  6. Java基础学习(2)

    Java基础学习(二) 面向对象 对象:客观存在的事物 面向对象:人具体关注的事物的某些信息 类:是模子,确定对象会拥有的特征(属性)和行为(方法) 对象的属性:对象具有的各种特征 对象的方法:对象能 ...

  7. Java基础学习(4)

    Java基础学习(四) String类 特点:创建后不可再修改,看起来的修改只是创建了新的对象 常用方法 StringBuilder类 目的:解决String类频繁创建对象的问题 常用方法 特点:非线 ...

  8. Java基础学习-- 继承 的简单总结

    代码参考:Java基础学习小记--多态 为什么要引入继承? 还是做一个媒体库,里面可以放CD,可以放DVD.如果把CD和DVD做成两个没有联系的类的话,那么在管理这个媒体库的时候,要单独做一个添加CD ...

  9. Java基础学习中一些词语和语句的使用

    在Java基础学习中,我们刚接触Java会遇到一些词和语句的使用不清的情况,不能很清楚的理解它的运行效果会是怎么样的,如:break,continue在程序中运行效果及跳转位置, 1.先来看看brea ...

  10. 第二十八节:Java基础-进阶继承,抽象类,接口

    前言 Java基础-进阶继承,抽象类,接口 进阶继承 class Stu { int age = 1; } class Stuo extends Stu { int agee = 2; } class ...

随机推荐

  1. Vue组件之作用域插槽

    写作用域插槽之前,先介绍一下Vue中的slot内容分发: 如果<child-component></child-component>标签之间没有插入那两个p标签的话,页面会显示 ...

  2. php的更新

    因为 PHP 那“集百家之长”的蛋疼语法,加上社区氛围不好,很多人对新版本,新特征并无兴趣.本文将会介绍自 PHP5.2 起,直至 PHP5.6 中增加的新特征 本文目录:PHP5.2 以前:auto ...

  3. 【【henuacm2016级暑期训练】动态规划专题 J】Red-Green Towers

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 显然最多1000行的样子. 从上到小做dp 设f[i][j]为前i行,使用了j个红色方块的方案数. f[1][r] = 1;如果r& ...

  4. 2015 Multi-University Training Contest 7 hdu 5375 Gray code

    Gray code Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

  5. ASP.net session丢失

    ASP.NET Session的实现: asp.net的Session是基于HttpModule技术做的,HttpModule可以在请求被处理之前,对请求进行状态控制,由于Session本身就是用来做 ...

  6. CURL库的宏定义列表

    列表CURL库一共同拥有17个函数 curl_close:关闭CURL会话 curl_copy_handle:复制一个CURL会话句柄,同一时候3复制其全部參数 curl_errno:返回最后一个错误 ...

  7. 阿里云server部署架构

    近期要上马一个项目,客户要求所有部署到阿里云的server,做了一个阿里云的部署方案. 上图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc21hbGx ...

  8. node--19 moogose demo1

    db.js /** * Created by Danny on 2015/9/28 16:44. */ //引包 var mongoose = require('mongoose'); //创建数据库 ...

  9. [Swift]数组(Array)最强解析

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  10. Go语言结构体转json的坑

    Go语言结构体转json的坑 标签(空格分隔): go json.Marshal() JSON输出的时候必须注意,只有导出的字段(首字母是大写)才会被输出,如果修改字段名,那么就会发现什么都不会输出, ...