zoukankan      html  css  js  c++  java
  • Java 面向对象编程 抽象类 抽象方法 abstract

    抽象类

    • 通过abstract定义的方法是抽象方法,它只有定义,没有实现。抽象方法定义了子类必须实现的接口规范;

    • 定义了抽象方法的class必须被定义为抽象类,从抽象类继承的子类必须实现抽象方法;

    • 如果不实现抽象方法,则该子类仍是一个抽象类;

    • 面向抽象编程使得调用者只关心抽象方法的定义,不关心子类的具体实现。

     

    如果父类的方法本身不需要实现任何功能 ,仅仅是为了定义方法签名,目的是让子类去覆写它,那么,可以把父类的方法声明为抽象方法。声明关键词abstract

    abstract class Person(){
        public  abstract void run(); 
    }

    把一个方法声明为abstract,表示这是一个抽象方法,本身没有任何方法语句。这个方法本身无法执行,所以Person类也无法实例化。编译器无法编译Person类,因包含抽象方法。必须把Person类本身也声明为abstract才可编译。

    如果一个类class定义了方法,但没有具体执行代码,这个方法就是是抽象方法,用abstract修饰。

    因为无法执行抽象方法,因此这个类也必须声明为抽象类,abstract class

    使用abstract修饰的类就是抽象类,但无法实例化一个抽象类。

    Person P = new Person(); //编译错误

    因为抽象类的目的是为了用于被继承,因此,抽象类强迫子类实现其定义的方法,否则编译出错。

    因此,抽象方法实际上定义了“规范”。

    例如:Person类定义了抽象方法run(),那么在实现子类Student的时候,必须覆写run()方法。

    public class main{
        public static void main(String[] args){
            Person P = new Student();
            P.run();
        }
    }
    abstract class Person{
        public abstract void run();
    }
    class Student extends Person{
        @Overrind
        public void run(){
            System.out.println("Student run");
        }
    }

    面向对象编程

    当我们定义了抽象类Person,及具体的子类Student,Teacher的时候,可以通过抽象类Person类型 引用具体子类的实例。

    Person S = new Student();
    Person T = new Teather();

    这种引用的好处是,只对其方法进行调用,无需关心Person类型变量的具体子类型:

    //无需关心Person变量的具体子类型
    S.run();
    T.run();

    同样的代码,如果引用的是一个新的子类,我们仍然不关心具体类型:

    // 同样不关心新的子类是如何实现run()方法的:
    Person e = new Employee();
    e.run();

    这种尽量引用高层类型,避免引用实际子类型的方式,称之为面向抽象编程。

    面向抽象编程的本质就是:

    • 上层代码只定义规范(例如:abstract class Person);

    • 不需要子类就可以实现业务逻辑(正常编译);

    • 具体的业务逻辑由不同的子类实现,调用者并不关心。

    小结

    • 通过abstract定义的方法是抽象方法,它只有定义,没有实现。抽象方法定义了子类必须实现的接口规范;

    • 定义了抽象方法的class必须被定义为抽象类,从抽象类继承的子类必须实现抽象方法;

    • 如果不实现抽象方法,则该子类仍是一个抽象类;

    • 面向抽象编程使得调用者只关心抽象方法的定义,不关心子类的具体实现。

  • 相关阅读:
    再次或多次格式化导致namenode的ClusterID和datanode的ClusterID之间不一致的问题解决办法
    Linux安装aria2
    POJ 3335 Rotating Scoreboard 半平面交
    hdu 1540 Tunnel Warfare 线段树 区间合并
    hdu 3397 Sequence operation 线段树 区间更新 区间合并
    hud 3308 LCIS 线段树 区间合并
    POJ 3667 Hotel 线段树 区间合并
    POJ 2528 Mayor's posters 贴海报 线段树 区间更新
    POJ 2299 Ultra-QuickSort 求逆序数 线段树或树状数组 离散化
    POJ 3468 A Simple Problem with Integers 线段树成段更新
  • 原文地址:https://www.cnblogs.com/henrypaul/p/12228413.html
Copyright © 2011-2022 走看看