抽象可以不用继承吗?爪哇

Posted

技术标签:

【中文标题】抽象可以不用继承吗?爪哇【英文标题】:abstraction can be done without inheritance? java 【发布时间】:2017-08-27 03:15:30 【问题描述】:

没有继承可以抽象吗?这是我的代码

     abstract class whatever

    abstract void disp1();
    abstract void disp2();
    abstract void disp3();


 class what 

    void disp1()
    
        System.out.println("This is disp1");
    




public class threeClasses 

    public static void main (String args[])
    
        what obj =new what();
        obj.disp1();

    


请注意上面,我是如何:

    没有从抽象类“whatever”扩展类“what”,但代码运行完美,没有错误
      没有将“what”类声明为抽象类(因为它没有声明其他两个方法 disp2() 和 disp3())

我很困惑。请帮忙。

【问题讨论】:

你没有使用whatever 你必须从任何东西扩展才能使用它。 @HovercraftFullOfEels 我试图看看是否可以在不从抽象类扩展的情况下使用抽象 好的,这个问题的答案是:“不”。 @Will_Panda 我不想在它的继承类中声明抽象类“whatever”中的所有方法。如何在不同的类中分别声明每个方法?我必须为此使用分层继承吗? 【参考方案1】:

您没有使用whatever(应遵守 Java 命名约定)。 abstract 类(和继承)背后的想法是有一个接口契约。让我们用一个更实际的例子来研究它,

abstract class Whatever 
    abstract void disp1();

    void disp2() 
        System.out.println("disp2");
    

    void disp3() 
        System.out.println("disp3");
    

然后让What 扩展它。重写两个方法进行演示(注解是一个有用的编译时安全检查)

class What extends Whatever 
    @Override
    void disp1() 
        System.out.println("This is disp1");
    

    @Override
    void disp2() 
        System.out.println("This is disp2");
    

最后,通过Whatever 合约调用What 实例上的方法

public static void main(String args[]) 
    Whatever obj = new What();
    obj.disp1();
    obj.disp2();
    obj.disp3();

哪些输出

This is disp1
This is disp2
disp3

注意What 提供disp1disp2 的实现,而Whatever 提供disp3

【讨论】:

【参考方案2】:

抽象类和具体类之间没有关系。无论您对“抽象”的定义如何,它实际上都代表了类型之间的关系。 abstract 关键字不建立类之间的关系,它代表这种关系,而不是单独。这种关系需要从双方延伸。

abstract 是一个关于必须遵守的承诺的声明,继承类型要么实现抽象方法,要么从其继承类型请求该承诺。

另一方通过继承抽象类型的类来做出承诺。如果没有继承,具体类型将失去 is-a 连接。

如果您纠正了您犯的一个重大错误,您将收到您抱怨的编译器错误。您未能使用 @Override 注释。 总是当你打算重写一个方法时使用@Override注解,否则你将永远享受你在这里展示的那种错误。

【讨论】:

【参考方案3】:

我认为他的意思是如果我们可以在不继承抽象类的情况下实现抽象类的方法。

你可能会想我们是否可以通过组合/关联/聚合关系来做到这一点。

对此,我会回答:不,因为你不能创建抽象类的对象,因为在这些关系中你必须创建对象或对象的引用。

因此,实现抽象方法的唯一方法是通过继承。

【讨论】:

以上是关于抽象可以不用继承吗?爪哇的主要内容,如果未能解决你的问题,请参考以下文章

Scala - 抽象继承多态

您可以强制从抽象基类继承的类仅具有在基本情况下定义的公共方法吗?

私有成员变量可以被子类继承吗

Java中 支持多继承吗?

桥梁模式

接口能被继承吗?