没有继承的抽象可能吗?这是我的代码
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
(应遵守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
提供disp1
和disp2
的实现,而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
创建一个对象。
所以我认为你的答案是抽象离不开继承。