一、抽象类介绍

  

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

  因此在类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. CF833B The Bakery (线段树+DP)

    题目大意:给你一个序列(n<=35000),最多分不大于m块(m<=50),求每个块内不同元素的数量之和的最大值 考试的时候第一眼建图,没建出来,第二眼贪心 ,被自己hack掉了,又随手写 ...

  2. 2019-03-18 Python time 将2015年11月20日转换为2015-11-20

    #ReportingDate = soup.select('body > div.main > div > div.ctr > div.recruit > ul > ...

  3. Unity 摄像头竖屏预览显示的问题

    Unity可以通过WebCamTexture打开摄像头,通过 cameraRawImage.texture = camTexture; 将贴图给RawImage,但是WebCamTexture只能设置 ...

  4. STM32 关于头文件路径没添加错误问题(cannot open source input file "spi.h": No such file or directory)

    error:  #5: cannot open source input file "spi.h": No such file or directory 1.出现这种问题,首先要确 ...

  5. tp框架报错 Namespace declaration statement has to be the very first statement in the script

    Namespace declaration statement has to be the very first statement in the script tp框架报这个错误,错误行数就是nam ...

  6. tp框架 验证码的应用注意事项

    1如何点击更换二维码 二维码是img标签的src访问生成二维码的方法.绑定点击事件,ajax的get方式请求生成二维码的函数.在U函数后面加上任意不重复的参数 如  ?rand=’+math.rand ...

  7. 电子签章盖章之jQuery插件jquery.zsign

           简介:  使用jquery.zsign可以实现电子签章盖章效果,使用方便,只需提供自己的章图片.效果图如下:        页面引用:        <link href=&quo ...

  8. 赵雅智_使用SQLiteDatabase操作SQLite数据库及事务

    知识点具体解释:http://blog.csdn.net/zhaoyazhi2129/article/details/9025995 详细代码: MainActivity.java package c ...

  9. 小胖说事30------iOS 强制转成横屏的方式

    一直遇到这个问题,今天最终找到了解决方法. 在我们的项目中常常遇到横竖屏切换,而又有某个特定的界面必须是特定的显示方式(横屏或竖屏).这就须要例如以下的处理了. 强制转成横屏: if ([[UIDev ...

  10. cocos2dx-3.0创建Android项目时遇到的错误。

    cocos run -p android出现 文件名称.文件夹名或卷标语法不对 Updated project.properties Updated local.properties Updated ...