没有继承就可以抽象吗? java
abstraction can be done without inheritance? 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();
}
}
请注意上面,我是如何:
- 没有从抽象 class "whatever" 扩展 class "what" 但是代码运行完美没有错误
- 没有将 class "what" 声明为抽象的(因为它没有声明其他两个方法 disp2() 和 disp3())
我很困惑。请帮忙
您没有使用 whatever
(并且应遵守 Java 命名约定)。 abstract
class(和继承)背后的想法是有一个接口契约。让我们用一个更实际的例子来研究它,
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
。
你的抽象 class 和你的具体 class 之间没有关系。不管你对 "abstraction" 的定义是什么,它实际上代表了类型之间的一种关系。 abstract
关键字不 建立 class 之间的关系,它 表示 这种关系,而不是单独的。关系需要从双方延伸。
abstract
是来自一方的关于必须遵守的承诺的声明,对于继承类型实现抽象方法或从其继承类型请求该承诺。
另一方通过成为从抽象类型继承的 class 来做出承诺。如果没有继承,具体类型将失去 is-a 连接。
如果您更正所犯的一个重大错误,您将得到您抱怨遗漏的编译器错误。您未能使用 @Override
注释。 总是当你打算覆盖一个方法时使用@Override
注解,否则你将永远享受你在这里展示的那种错误。
我想他的意思是如果我们不继承abstractclass就可以实现abstractclass的方法。
你可能在想我们是否可以用 composition/association/aggregation 关系做到这一点。
对此,我会回答:不,因为你不能创建抽象对象 class 因为在这些关系中你必须创建对象或对象的引用。
所以,实现抽象方法的唯一途径就是继承。
没有继承可以抽象吗?这是我的代码
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();
}
}
请注意上面,我是如何:
- 没有从抽象 class "whatever" 扩展 class "what" 但是代码运行完美没有错误
- 没有将 class "what" 声明为抽象的(因为它没有声明其他两个方法 disp2() 和 disp3())
我很困惑。请帮忙
您没有使用 whatever
(并且应遵守 Java 命名约定)。 abstract
class(和继承)背后的想法是有一个接口契约。让我们用一个更实际的例子来研究它,
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
。
你的抽象 class 和你的具体 class 之间没有关系。不管你对 "abstraction" 的定义是什么,它实际上代表了类型之间的一种关系。 abstract
关键字不 建立 class 之间的关系,它 表示 这种关系,而不是单独的。关系需要从双方延伸。
abstract
是来自一方的关于必须遵守的承诺的声明,对于继承类型实现抽象方法或从其继承类型请求该承诺。
另一方通过成为从抽象类型继承的 class 来做出承诺。如果没有继承,具体类型将失去 is-a 连接。
如果您更正所犯的一个重大错误,您将得到您抱怨遗漏的编译器错误。您未能使用 @Override
注释。 总是当你打算覆盖一个方法时使用@Override
注解,否则你将永远享受你在这里展示的那种错误。
我想他的意思是如果我们不继承abstractclass就可以实现abstractclass的方法。
你可能在想我们是否可以用 composition/association/aggregation 关系做到这一点。
对此,我会回答:不,因为你不能创建抽象对象 class 因为在这些关系中你必须创建对象或对象的引用。
所以,实现抽象方法的唯一途径就是继承。