美文网首页
Java-基础-抽象类

Java-基础-抽象类

作者: 月沉眠love | 来源:发表于2019-08-15 16:33 被阅读0次

由于多态的存在,每个子类都可以覆写父类的方法

class Person {
    public void run() { … }
}

class Student extends Person {
    @Override
    public void run() { … }
}

class Teacher extends Person {
    @Override
    public void run() { … }
}

能不能去掉父类的run()方法?-----不能
如果父类Person的run()方法没有实际意义,能否去掉方法的执行语句?--不能

如果父类的方法本身不需要实现任何功能,仅仅是为了定义方法签名,目的是让子类去覆写它,那么,可以把父类的方法声明为抽象方法:
class Person {
    public abstract void run();
}
把一个方法声明为abstract,表示它是一个抽象方法,

本身没有实现任何方法语句。因为这个抽象方法本身是无法执行的,所以,Person类也无法被实例化。编译器会告诉我们,无法编译Person类,因为它包含抽象方法。

必须把Person类本身也声明为abstract,才能正确编译它:

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

抽象类

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

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

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

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

问:无法实例化的抽象类有什么用?
因为抽象类本身被设计成只能用于被继承,因此,抽象类可以强迫子类实现其定义的抽象方法,否则编译会报错。因此,抽象方法实际上相当于定义了“规范”。

//abstract class
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 {
    @Override
    public void run() {
        System.out.println("Student.run");
    }
}

面向抽象编程

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

Person s = new Student();
Person t = new Teacher();

这种引用抽象类的好处在于,我们对其进行方法调用,并不关心Person类型变量的具体子类型:

// 不关心Person变量的具体子类型:
s.run();
t.run();

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

// 同样不关心新的子类是如何实现run()方法的:
Person e = new Employee();
e.run();
面向抽象编程的本质就是:

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

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

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

相关文章

  • Hello Java

    目录 Java-基础(1/6) Java-对象(2/6) Java-核心库类 上(3/6) Java-核心库类下(...

  • Java-基础-抽象类

    由于多态的存在,每个子类都可以覆写父类的方法 能不能去掉父类的run()方法?-----不能如果父类Person的...

  • Java-接口与抽象类

    Java-接口与抽象类 抽象类 如果编写一个类时,我们只想为该类定义一些方法,但是具体的实现交给继承它的子类来实现...

  • Java-抽象类

    抽象类的概念 普通类是一个完善的功能类,可以直接产生实例化对象,并且在普通类中可以包含有构造方法、普通方法、sta...

  • JAVA-跳转语句(break,continue)

    java-编程基础 1. 跳转语句(break,continue) 1.1 break语句 break语句在swi...

  • java-基础

    为啥有时会出现4.0-3.6=0.40000001这种现象? float,double等精度丢失问题 - 铅笔 -...

  • java-基础

    1.java中的final关键字:http://www.importnew.com/7553.html final...

  • JAVA语言

    Java (计算机编程语言) JavaEE:12天掌握Java语言开发 - Java-环境搭建及基础语法 - 创...

  • Java-浅析Object类

    Java-浅析Object类 ++2016.7.19++byside @Java-浅析Object类 ======...

  • 将 Java 作为入门编程语言有错吗?

    Java 起源与诞生 JavaEE:12天掌握Java语言开发 - Java-环境搭建及基础语法 - 创客学院直...

网友评论

      本文标题:Java-基础-抽象类

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