抽象类与抽象方法

编程的时候会有这样的需求,你定义一个类,你知道必须有哪些方法但是你又不知道这些方法具体怎么实现。例如每个App都有安装、卸载和运行这些方法,但是具体App怎么安装、卸载和运行并不清楚。于是你希望父类App规定子类们必须有这些方法,但是父类本身不写具体实现,让子类们去写具体实现。

语法##

可以把类和方法定义为抽象的,语法是在类名或方法名前加abstract关键字。

概念##

  • 抽象类只能被继承不能被实例化。
  • 抽象方法没有方法体,且子类必须重写。

好处##

  • 父类更抽象通用性更好,不能实例化但是可以用于声明,利用了多态的特性。
  • 因为抽象方法必须重写可以避免遗漏的错误

注意##

  • 因为抽象方法必须被子类重写,而构造方法不能被继承(只能在子类通过super关键字调用)。所以构造方法不能用abstract修饰。
  • 因为final类不能被继承,所以不能final和abstract不能同时修饰一个类
  • 因为final方法不能被重写,所以final和abstract不能同时修饰一个方法
  • 如果子类要重写父类的抽象方法,那么子类必须能访问抽象方法,所以private和abstract不能同时修饰一个方法。
  • 因为抽象方法是没有方法体的,而static修饰的方法可以不用实例化直接用类名调用。而调用一个没有方法体的方法没有意义,所以static和abstract不能同时修饰一个方法。

示例代码
抽象一个App父类,包含安装、卸载和运行。因为不知道具体实现,所以定义为抽象方法的。

public abstract class App {

    protected String name; // 应用名称

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    //安装
    public abstract void install();

    //卸载
    public abstract void remove();

    //运行
    public abstract void run();
}

下面的Chrome类和WeiShi360类对App的继承与重写。

public class Chrome extends App {

    public Chrome() {
        this.name = "Chrome";
    }

    //安装
    public void install() {
        System.out.println("安装" + this.name);
    }

    //卸载
    public void remove() {
        System.out.println("卸载" + this.name);
    }

    //运行
    public void run() {
        System.out.println(this.name + "运行中。。。");
    }

}
public class WeiShi360 extends App {

    public WeiShi360() {
        this.name = "360安全卫士";
    }

    //安装
    public void install() {
        System.out.println("安装" + this.name);
        System.out.println("捆绑安装360全家桶");
        System.out.println("设置开机启动项");
    }

    //卸载
    public void remove() {
        System.out.println("警告:卸载后电脑会变得很不安全,是否要卸载?");
        System.out.println("询问:真的要卸载吗?");
        System.out.println("询问:你确定要卸载吗?");
        System.out.println("询问:你忍心卸载吗?");
        System.out.println("卸载" + this.name);
    }

    //运行
    public void run() {
        System.out.println(this.name + "运行中。。。");
        System.out.println("弹广告。。。");
        System.out.println("提示:一键清理垃圾,清理后电脑运行速度显著提升哦");
        System.out.println("提示:有软件可以更新");
        System.out.println("提示:提示建议卸载XX软件");
        System.out.println("偷偷黑一下竞争对手的软件进程");
        System.out.println("偷偷收集点用户数据");
    }

}

测试代码

    App app1 = new Chrome();
    App app2 = new WeiShi360();
    
    app1.install();
    app1.remove();
    app1.run();
    
    System.out.println("********************");
    
    app2.install();
    app2.remove();
    app2.run();

运行结果:
<pre>
安装Chrome
卸载Chrome
Chrome运行中。。。


安装360安全卫士
捆绑安装360全家桶
设置开机启动项
警告:卸载后电脑会变得很不安全,是否要卸载?
询问:真的要卸载吗?
询问:你确定要卸载吗?
询问:你忍心卸载吗?
卸载360安全卫士
360安全卫士运行中。。。
弹广告。。。
提示:一键清理垃圾,清理后电脑运行速度显著提升哦
提示:有软件可以更新
提示:提示建议卸载XX软件
偷偷黑一下竞争对手的软件进程
偷偷收集点用户数据
</pre>

本文代码下载:百度网盘

推荐阅读更多精彩内容

  • 抽象类 在面向对象的概念中一切都是对象,同时所有的对象都是通过类来描述的,但是并不是所有的类都是用来描述对象的。如...
    李俊的博客阅读 52评论 1 1
  • 面向对象 单词表: Extends 一可死腾特 继承 Start 死打特 开始 Stop 死躲普 停止 C...
    chcvn阅读 88评论 0 0
  • 本文出自 Eddy Wiki ,转载请注明出处:http://eddy.wiki/interview-java.h...
    eddy_wiki阅读 367评论 0 5
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    会飞的鱼69阅读 20,471评论 18 385
  • 1 面向对象No6 面向对象 OO Object Oriented 编程时以对象为单元,封装数据和逻辑,以此提...
    征程_Journey阅读 217评论 0 2