抽象可以在没有继承的情况下完成?Java



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

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();
}
}

请注意,上面如何:

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

我很困惑。请帮忙。

您没有使用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

抽象类和具体类之间没有关系。 无论你对"抽象"的定义是什么,它实际上都代表了类型之间的关系。abstract关键字不建立类之间的关系,它表示该关系,而不是本身。这种关系需要从双方扩展。

abstract是一方关于必须保留的承诺的声明,以便继承类型实现抽象方法或从其继承类型请求该承诺。

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

如果您纠正了您犯的一个主要错误,您将收到您抱怨丢失的编译器错误。您未能使用@Override批注。当您打算重写方法时,请始终使用@Override注释,否则您将永远享受此处显示的那种错误。

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

您可能会想我们是否可以使用组合/关联/聚合关系来做到这一点。

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

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

我想你正在寻找一些像我的答案一样的东西。

abstract class whatever {
abstract void disp1();
abstract void disp2();
abstract void disp3();
}
public class threeClasses {
public static void main(String args[]) {
whatever obj = new whatever() {
@Override
void disp1() {
System.out.println("This is disp1");
}
@Override
void disp2() {
System.out.println("This is disp2");
}
@Override
void disp3() {
System.out.println("This is disp3");
}
};
obj.disp1();
}
}

但在此示例中,您正在从从任何内容继承anonymous class创建一个对象。

所以我认为你的答案是抽象离不开继承。

最新更新