2019独角兽企业重金招聘Python工程师标准>>>

一、抽象类介绍

  

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

  因此在类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 }

转载于:https://my.oschina.net/zhanghaiyang/blog/595065

Java基础学习总结(3)——抽象类相关推荐

  1. 初学Java基础学习——抽象类和接口的区别

    初学Java基础学习--抽象类和接口的区别 一.关键字 1)抽象类的关键字 abstract class A{//定义一个抽象类: } class Test extends A{//子类使用exten ...

  2. java基础学习整理(一)

    java基础学习整理(一) lesson1: D0s命令: 1.回到根目录,>cd \ 2.复制命令行下的内容,右击标记所要复制的内容,这样就已经复制好了,右击粘贴就可以了. 3.查看,设置环境 ...

  3. 尚学堂JAVA基础学习笔记_2/2

    尚学堂JAVA基础学习笔记_2/2 文章目录 尚学堂JAVA基础学习笔记_2/2 写在前面 第10章 IO技术 1. IO入门 2. IO的API 3. 装饰流 4. IO实战 5. CommonsI ...

  4. Java基础学习(9)

    Java基础学习 一.常用方法(API) 1.1 Math 1.2 System 1.3 Runtime 1. 4 .object 1.5 Objects 1.6 BigInteger BigInte ...

  5. Java基础学习—— IO流

    Java基础学习-- IO流 1 文件 1.1 文件的创建 1.2 文件常用的方法 2 IO流 2.1 FileInputStream 2.2 FileOutputStream 2.3 文件的拷贝 2 ...

  6. JAVA基础学习--面向对象

    JAVA基础学习–面向对象 1.面向对象与面向过程: 面向过程:就代表从头到位,每一步都需要我们来完成,例如洗衣服,首先收拾脏衣服.接上水.到洗衣液.搓.倒水.拧干.晾晒.每一步都需要我们来完成. 面 ...

  7. java基础学习-4

    Java基础学习-4 static 注意事项 重新认识main方法 继承 小练习 子类到底能继承父类中的哪些内容(第126集)*** 继承过程中成员变量和成员方法的访问特点 小练习 小总结 构造方法的 ...

  8. java基础学习_IO流03_字符流、IO流小结、案例_day21总结

    java基础学习_IO流03_字符流.IO流小结.案例_day21总结 ================================================================ ...

  9. Java基础学习——第六章 面向对象编程(下)

    Java基础学习--第六章 面向对象编程(下) 一.关键词:static 1. static关键字的引入 当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new ...

  10. JAVA基础学习精简心得笔记整理

    JAVA基础学习精简心得笔记整理 配置java环境变量 Java的运行过程  基本数据类型 引用数据类型 逻辑运算符 数组 方法重载 封装 继承 多态 多态的作用 单例设计模式 接口interface ...

最新文章

  1. 【Visual C++】游戏开发笔记二十七 Direct3D 11入门级知识介绍
  2. 基于opencv的简单视频处理类示例
  3. word2vec (一) 简介与训练过程概要
  4. Eclipse+CDT+MinGW搭建C++环境 (转)
  5. MySQL 是如何利用索引的
  6. 通过Dapr实现一个简单的基于.net的微服务电商系统(十一)——一步一步教你如何撸Dapr之自动扩/缩容...
  7. 第一段冲刺 站立会议 5.6
  8. es 根据_id查询_京东把 Elasticsearch 用得真牛逼!日均5亿订单查询完美解决
  9. Scrapy 轻松定制网络爬虫
  10. springMVC使用拦截器针对控制器方法做预处理、后处理、资源清理
  11. 【java笔记】线程(2):多线程的原理
  12. 浏览器宽度和高度的说明
  13. 【浙江大学PAT真题练习乙级】1001 害死人不偿命的(3n+1)猜想(15分)真题解析
  14. ucinet数据集格式
  15. 常用BUG管理工具系统
  16. 小程序电子名片 制作
  17. 电脑重装系统后当前安全设置不允许下载该文件
  18. 计算机应用基础实验报告心得体会,计算机应用基础实训总结报告
  19. 二进制小数转换为十进制数和
  20. 烧得七荤八素了,完了这下,本来现在应该在学校做网站的,然而半小时前还摊在床上哼哼唧唧。

热门文章

  1. 数据变金矿:一文读懂序列模型(附用例)
  2. android自定义调节器控件 —— RegulatorView
  3. python快速小教程
  4. Javascript闭包和闭包的几种写法及用途
  5. 大学实习就要来了,买个性价比高的笔记本应付一下
  6. Spark(六):SparkSQLAndDataFrames对结构化数据集与非结构化数据的处理
  7. app-》h5同步身份
  8. ActiveMQ 消息服务(一)
  9. 解决Debian-7.1下Chrome浏览器字体难看的问题
  10. php json josn_decode()返回的是对像,如何把对像转成数组