文档章节

Java学习总结-抽象类

_谙久
 _谙久
发布于 2016/02/01 10:29
字数 1396
阅读 25
收藏 0

一、抽象类介绍

  

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

  因此在类Animal里面只需要定义这个enjoy()方法就可以了,使用abstract关键字把enjoy()方法定义成一个抽象方法,定义如下:public abstract void enjoy(); 

  从某种意义上来说,抽象方法就是被用来重写的,所以在父类声明的抽象方法一定要在子类里面重写。如果真的不想在子类里面重写这个方法,那么可以再在子类里面把这个方法再定义为抽象方法,因为子类觉得我去实现也不合适,应该让继承我的子类去实现比较合适,因此也可以在继承这个子类的下一个子类里面重写在父类里面声明的抽象方法,这是可以的。

  这里有一个规则:既然父类里面的方法是抽象的,那么对于整个类来说,它就有一个没有实现的方法,这个方法不知道怎么去实现,那么这个类是就是残缺不全的,因此这个类应该被定义为一个抽象类。所以前面这样声明的声明的class Animal应该要在class的前面加上abstract即声明成这样:abstract class Animal,这样Animal类就成了一个抽象类了。Animal类的最终定义代码如下:

/**
 * 父类Animal
 * 在class的前面加上abstract,即声明成这样:abstract class Animal
 * 这样Animal类就成了一个抽象类了
 */
abstract class Animal {

    public String name;

    public Animal(String name) {
        this.name = name;
    }
    
    /**
     * 抽象方法
     * 这里只有方法的定义,没有方法的实现。
     */
    public abstract void enjoy(); 
    
}

  Java语言规定,当一个类里面有抽象方法的时候,这个类必须被声明为抽象类。

  子类继承父类时,如果这个父类里面有抽象方法,并且子类觉得可以去实现父类的所有抽象方法,那么子类必须去实现父类的所有抽象方法,如:

/**
 * 子类Dog继承抽象类Animal,并且实现了抽象方法enjoy
 * @author gacl
 *
 */
class Dog extends Animal {
    /**
     * Dog类添加自己特有的属性
     */
    public String furColor;

    public Dog(String n, String c) {
        super(n);//调用父类Animal的构造方法
        this.furColor = c;
    }

    @Override
    public void enjoy() {
        System.out.println("狗叫....");
    }

}

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

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

    /**
     * Cat添加自己独有的属性
     */
    public String eyeColor;

    public Cat(String n, String c) {
        super(n);//调用父类Animal的构造方法
        this.eyeColor = c;
    }
}

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

/**
 * 子类BlueCat继承抽象类Cat,并且实现了从父类Cat继承下来的抽象方法enjoy
 * @author gacl
 *
 */
class BlueCat extends Cat {

    public BlueCat(String n, String c) {
        super(n, c);
    }

    /**
     * 实现了抽象方法enjoy
     */
    @Override
    public void enjoy() {
        System.out.println("蓝猫叫...");
    }
    
}

完整的测试代码如下:

package javastudy.summary;

/**
 * 父类Animal
 * 在class的前面加上abstract,即声明成这样:abstract class Animal
 * 这样Animal类就成了一个抽象类了
 */
abstract class Animal {

    public String name;

    public Animal(String name) {
        this.name = name;
    }
    
    /**
     * 抽象方法
     * 这里只有方法的定义,没有方法的实现。
     */
    public abstract void enjoy(); 
    
}

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

    /**
     * Cat添加自己独有的属性
     */
    public String eyeColor;

    public Cat(String n, String c) {
        super(n);//调用父类Animal的构造方法
        this.eyeColor = c;
    }
}

/**
 * 子类BlueCat继承抽象类Cat,并且实现了从父类Cat继承下来的抽象方法enjoy
 * @author gacl
 *
 */
class BlueCat extends Cat {

    public BlueCat(String n, String c) {
        super(n, c);
    }

    /**
     * 实现了抽象方法enjoy
     */
    @Override
    public void enjoy() {
        System.out.println("蓝猫叫...");
    }
    
}

/**
 * 子类Dog继承抽象类Animal,并且实现了抽象方法enjoy
 * @author gacl
 *
 */
class Dog extends Animal {
    /**
     * Dog类添加自己特有的属性
     */
    public String furColor;

    public Dog(String n, String c) {
        super(n);//调用父类Animal的构造方法
        this.furColor = c;
    }

    @Override
    public void enjoy() {
        System.out.println("狗叫....");
    }

}

public class TestAbstract {

    /**
     * @param args
     */
    public static void main(String[] args) {

        /**
         * 把Cat类声明成一个抽象类以后,就不能再对Cat类进行实例化了,
         * 因为抽象类是残缺不全的,缺胳膊少腿的,因此抽象类不能被实例化。
         */
        //Cat c = new Cat("Catname","blue");
        Dog d = new Dog("dogname","black");
        d.enjoy();//调用自己实现了的enjoy方法
        
        BlueCat c = new BlueCat("BlueCatname","blue");
        c.enjoy();//调用自己实现了的enjoy方法
    }
}


本文转载自:http://www.cnblogs.com/xdp-gacl/p/3644035.html

共有 人打赏支持
_谙久
粉丝 6
博文 75
码字总数 45070
作品 0
徐汇
程序员
私信 提问
java程序员基础进阶篇,万丈高楼平地起

一.final,finally,finalize 三者区别 Final是一个修饰符: 当final修饰一个变量的时候,变量变成一个常量,它不能被二次赋值 当final修饰的变量为静态变量(即由static修饰)时,必须在声明这...

启示录是真的
2018/05/26
0
0
java编程新手入门基础知识学习

Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互...

Java小辰
2018/05/15
0
0
Java编程思想 第1章 对象导论

Bruce Eckel 前辈写的《Java编程思想》把问题探讨得非常深入,非常建议同行都学习一下。学习 Java 语言时,老师告诉你 What,自己练习知道 How ,Bruce Eckel 告诉你Why 。 之前已经把后面的...

木云凌
2016/02/23
0
0
大数据开发培训:0基础学习Java编程语言有哪些知识点?

Java 技术通用、高效、具有平台移植性和安全性,广泛应用于PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网等,学习Java首先要知道学习知识点有哪些。在这就用加米谷大数据培训...

加米谷大数据
2018/07/25
0
0
【Java学习路线】新手该如何一步步的学习 Java

新手该如何一步步的学习 Java? 如果真的想学Java,最好要循序渐进,有章有法的学习它! 今天小慕就不说一些学习方法和技巧了,直接来谈每个阶段要学习的内容。 首先,给大家分享一张以 企业...

Eddie_yang
2018/11/15
131
0

没有更多内容

加载失败,请刷新页面

加载更多

Linux 权限

权限 0 000 --- 无权限 1 001 --x 执行权限 2 010 -w- 写权限 3 011 -wx 写和执行 4 100 r-- 读权限 5 101 r-x 读和执行 6 110 rw- 读和写 7 111 rwx 读写执行 755 : rwxr-xr-x 660 : rw-r...

忙碌的小蜜蜂
23分钟前
0
0
21分钟教会你分析MaxCompute账单

21分钟教会你分析MaxCompute账单 背景 阿里云大计算服务MaxCompute是一款商业化的大数据分析平台,其计算资源有预付费和后付费两种计费方式。并且产品每天按照project为维度进行计量计费(账...

阿里云云栖社区
26分钟前
0
0
Docker使用 linuxserver/letsencrypt 生成SSL证书最全解析及实践

本文使用 HTTP 和 DNS 两种校验方式对 Docker 下 linuxserver/letsencrypt 项目进行了实践。生成SpringBoot可用证书,使用 Nginx 的 htpasswd 来对网站进行密码保护,并测试使用 fail2ban 防...

java菜分享
26分钟前
0
0
代码吃鸡:Python-Robocode

最近看到一个很有“未来感”的新闻: 一辆特斯拉在拉斯维加斯出了车祸,撞“死”了一个……emmmm……机器人。不知道是意外还是炒作,又或者是这位机器人故意碰瓷,反正人们也无法从受害者口中...

crossin
30分钟前
0
0
什么是公网IP、内网IP和NAT转换?

搞网络通信应用开发的程序员,可能会经常听到外网IP(即互联网IP地址)和内网IP(即局域网IP地址),但他们的区别是什么? 1、引言 搞网络通信应用开发的程序员,可能会经常听到外网IP(即互联网I...

Linux就该这么学
40分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部