美文网首页
抽象类与抽象方法

抽象类与抽象方法

作者: 许宏川 | 来源:发表于2015-07-25 18:45 被阅读114次

    编程的时候会有这样的需求,你定义一个类,你知道必须有哪些方法但是你又不知道这些方法具体怎么实现。例如每个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>

    本文代码下载:百度网盘

    相关文章

      网友评论

          本文标题:抽象类与抽象方法

          本文链接:https://www.haomeiwen.com/subject/ryxmqttx.html