一、抽象类介绍

  

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

  因此在类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. 用于构建 RESTful Web 服务的多层架构

    作者:Bruce Sun, Java 架构师, IBM 出处:http://www.ibm.com/developerworks/cn/web/wa-aj-multitier/ 用于构建 RESTfu ...

  2. IOS - CoreData 增删改查

    #pragma mark - Core Data Methods - (void)insertObjectWithFileName:(NSString *)fileName { /** SQL新增记录 ...

  3. CMDB设计

    CMDB(资产管理数据库) CMDB是所有运维工具的数据基础 CMDB包含的内容 用户管理,记录测试,开发,运维人员的用户表 业务线管理,需要记录业务的详情 项目管理,指定此项目用属于哪条业务线,以及 ...

  4. 3.如何构建Cython代码

    一.与Python不同的是,Cython代码需要进行编译.发生两个阶段 将一个.pyx文件用Cython编译成一个.c文件中,包括Python扩展模块代码 将.c文件使用C编译器编译成.so文件(在w ...

  5. js实现鼠标吸附线条效果

    如图,箭头→为鼠标位置,鼠标会带有吸附着一些线条的效果,具体效果可在我的博客查看,当然,这也是可很受欢迎很常见的效果了=3= <script> !function(){ function ...

  6. java结合jQuery.ajax实现左右菜单联动刷新列表内容

    http://域名/一级菜单ID-二级菜单ID/ 用这种URL请求页面,出现如图所看到的内容: 该页面包括四部分,顶部文件夹+左側菜单+右側菜单+右下側数据列表. 左側菜单包括一级菜单和二级菜单,点击 ...

  7. zzulioj--1634--Happy Thanksgiving Day - A + B Problem(模拟水题)

     1634: Happy Thanksgiving Day - A + B Problem Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 136  ...

  8. Batch脚本获取日期SET YEAR=%date:~10,4%

    在batch脚本中我们可以通过下面的语句来对日期进行操作: SET YEAR=%date:~10,4% SET MONTH=%date:~4,2% SET DAY=%date:~7,2% SET HO ...

  9. 解码URLDecode和编码URLEnCode

    在前台往后台传递参数的时候,在前台进行编码,在后台接收参数的时候,用Decode进行解码: 如果url中包含特殊字符如:&.html标签 <tr><td>等导致url无 ...

  10. 【转载】Xmemcached用户指南

    一.XMemcached简介 XMemcached是一个新java memcachedclient.也许你还不知道memcached是什么?可以先看看这里.简单来说,Memcached 是一个高性能的 ...