【问题标题】:Why to make a class abstract when you can extend and instantiate it?当你可以扩展和实例化一个类时,为什么要让它抽象呢?
【发布时间】:2022-01-20 22:32:23
【问题描述】:

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

如果有人能帮我解释一下,我将不胜感激。

【问题讨论】:

  • 你说的“有人可以偷走你所有的品质,像你一样在市场上推销自己”是什么意思??在什么市场?使用抽象类是您的应用程序中的一个实现细节(除非您提供库/框架),而不是旨在以某种方式“保护您的应用程序不被窃取”

标签: java oop abstract-class abstraction


【解决方案1】:

如果您想阻止其他人从您的类继承,请将其设为final。但不是它的最后一个层次结构,所以它不能再被继承,所以要声明abstract(因为它已经过时了)。 抽象类是模板。它们继承属性和函数而不具体实现它们(你当然可以为所有人提供默认行为,但声明方法中 abstract 背后的想法是 abstract -> 未实现)并且仅用于构建一个等级制度。示例:

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

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

【讨论】:

  • 谢谢!最后一段帮助很大......
【解决方案2】:

抽象类基本上意味着隐藏实现细节并只向用户显示功能

抽象类可以有以下方法。

  1. 抽象方法

  2. 非抽象方法 在 Java 8 之后他们还可以拥有

  3. 静态方法

  4. 最终方法

    抽象类A{

    抽象 void run(); //抽象方法

    }

    B 类扩展 A{

    无效运行(){ System.out.println("安全运行"); }

    }

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

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

所以要使其工作,需要对其进行扩展和实现(这就是在 B 类中所做的)。

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

更多信息请参考此链接:abstract class in java

【讨论】:

    【解决方案3】:

    抽象类没有隐藏。抽象类是“不完整”类,可以通过多种不同方式“完成”。如果您的类中包含很多相似的代码,最好将所有相似的代码移到抽象类中并让您的类扩展这个抽象类。

    抽象类在其他方面功能非常全面。尽管您无法实例化它们,但它们甚至可以具有构造函数。这些构造函数可以通过子类构造函数中的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;
        }
    }
    

    【讨论】:

    • 这个例子可能会更好。 Parent 没有抽象方法,“Child / Parent”也不是有用的抽象。你不能说孩子“是”父母。作为一个孩子是一个人的属性,可以由他们的年龄来定义,并且可能会随着对象的生命周期而改变。
    • 好点子,但我想演示super,而不是一个成熟的现实世界类层次结构。
    • “抽象类没有被隐藏。抽象类是“不完整”的类,可以通过许多不同的方式“完成”。 - 这很有帮助
    猜你喜欢
    • 2014-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-15
    • 2019-08-20
    • 2018-06-16
    相关资源
    最近更新 更多