繁体   English   中英

当您可以扩展和实例化 class 时,为什么要制作它?

[英]Why to make a class abstract when you can extend and instantiate it?

我很困惑。 当我知道抽象基本上意味着 class 是隐藏的并且没有人可以实例化它时,我很兴奋。 凉爽的。 但是当我知道有人可以来扩展我的 class 并实例化它时,使用所有方法,当有人可以窃取你所有的品质,像你一样行事并在市场。

如果有人可以帮助我解释这一点,我将不胜感激。

如果您想防止其他人从您的 class 继承,请将其设为final 但是它不是其层次结构的最后一个,因此它不能再被继承,因此不能被声明为abstract的(因为它已经过时了)。 抽象类是模板。 它们继承了属性和功能,但没有具体实现它们,仅用于建立层次结构。 例子:

abstract class Vehicle {...}
class Car extends Vehicle {...}
class Bike extends Vehicle {...}

车辆描述了共同的属性,但具体的实例化太模糊了。 我们将所有类型的车辆称为“车辆”,即使我们从未在自然界中看到过其中一种。 这是一种思想结构,可以更轻松地对混凝土 forms 进行分类,例如汽车或自行车。

Abstract class 基本上意味着隐藏实现细节并仅向用户显示功能

摘要 class 可以有以下方法。

  1. 抽象方法

  2. Java 8 之后的非抽象方法他们也可以有

  3. static 方法

  4. 最终方法

    摘要 class A{

    抽象无效运行(); //抽象方法

    }

    class B 扩展 A{

    void run(){ System.out.println("安全运行"); }

    }

上面你可以看到 run() 方法在 class A 中没有任何实现。

它不能被实例化,因为 class A 中没有 run() 的实现

所以为了使它工作,它需要扩展和实现(这就是在 class B 中所做的)。

在外部世界中,人们只能看到 run() 他们无法了解 run 的工作原理或 run() 方法的实际实现。

有关更多信息,请参阅此链接: java 中的抽象 class

抽象类没有隐藏。 抽象类是“不完整”的类,可以通过许多不同的方式“完成”。 如果您的类包含大量相似代码,最好将所有相似代码移入抽象 class 并让您的类扩展此抽象 class。

抽象类在其他方面功能非常齐全。 尽管您无法实例化它们,但它们甚至可以具有构造函数。 这些构造函数可以通过子 class 构造函数的super关键字调用:

abstract class Parent {
    private String name;

    public Parent(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

class Child extends Parent {
    private boolean hasMilkTeeth;

    public Child(String name, boolean hasMilkTeeth) {
        super(name); // calls the parent constructor!
        this.hasMilkTeeth = hasMilkTeeth;
    }

    public boolean hasMilkTeeth() {
        return hasMilkTeeth;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM