了解Java中抽象类的用途
假设我有两个类,A和B.A类被定义为抽象类,而B扩展了这个抽象类,最后我测试了结果,两个类都是同一个包的一部分。了解Java中抽象类的用途
public abstract class A {
protected abstract void method1();
protected void method2() {
System.out.println("This is Class A's method");
}
}
public class B extends A {
@Override
protected void method1() {
System.out.println("This is B's implementaiton of A's method");
}
}
,现在当我测试他们:
B b = new B();
b.method1();
b.method2();
我得到预期输出:
This is B's implementaiton of A's method
This is Class A's method
问题:
- 什么是
@Override
k的目的eyword,因为如果我省略它, 仍然工作相同。 - 如果我没有实现抽象方法,我得到一个编译错误。那么与实现接口有什么不同?
- 此外,我也可以在B中实现
method2()
。然后输出变成B中的用法。这是不是也覆盖了父类的方法?那么在A类中明确定义方法的目的是什么?摘要?
@Override
@覆盖在Java 5引入(和Java 6中延伸一点点)。它只是提供信息。它说:“我想覆盖父类或接口中已经存在的东西。
IDE就像Eclipse一样,可以在没有这样的父级方法的情况下警告你(例如,如果你拼错了名字)。方法将不会被调用(因为拼写错误的)。
不过不要担心太多。
抽象类VS接口
一个抽象类允许你定义留下基本功能未定义的部分。接口不允许你o执行任何事情。除了每种情况下真正改变的部分外,您可以编程所有内容。所以当你需要它的时候,你会继承和实现缺失的部分。
覆盖两种方法
是。在Java中,您可以覆盖父类中未声明为final的所有方法。没关系。如果你想让它不可修改,你可以声明它是最终的。举例,如果你想声明的顺序你可以:
public abstract class Ordering<X>
{
abstract boolean isLower(X a, X b);
abstract boolean isEquals(X a, X b);
final boolean isGreater(X a, X b) {
return !isLower(a, b) && !isEquals(a, b);
}
}
当然也可能有意识重写isGreater来实现它另一个更有效的方式(想象中那么的昂贵的比较)。但有些情况下,当你想提供基本的已经实现的功能(然后是抽象类比接口更好的时候),或者当你想强制执行某些实现时(那么当final关键字显示有用时)。
-
@Override
不是一个关键字,它是一个可选的注释,它可以帮助编译器检查是否确实重写了一个方法。如果你说@Override
但没有方法来覆盖,编译器会告诉你,你可能犯了一个错字。将method1
重命名为method12
以查看效果。 - 接口不能有任何实现,而抽象类可以选择性地为其某些方法提供实现。另外,接口不能有数据成员。
- 将方法定义为抽象意味着派生类必须提供实现。不宣布它抽象说派生类可以提供自己的实现,但他们不需要。
的实际使用进入画面,当你有多个类实现和方法1被从方法2调用。在这种情况下,在执行method2之后,相应类中的method1将被执行。
public abstract class A {
protected abstract void method1(int val);
protected void method2() {
System.out.println("This is Class A's method");
//Let us I calculated something here, may be sum of two ints
method1(//pass above calculated int);
}
}
public class B extends A {
@Override
protected void method1(int val) {
System.out.println("This is B's implementaiton of A's method");
//Here you may do this class specific manipulation on val.
}
}
像在C类,你可以计算出一些常用操作。
抽象类和接口之间的主要区别是,接口只定义一个接口和抽象类也可以具有执行和字段/属性。
抽象类可以被看作是IS-A关系(例如,马是动物)。对于接口来说,它主要是一个类可以具有的某些功能(例如INavigable,ISortable)。
另外抽象方法不能实例化(无论是接口)。
重写函数用于显示函数具有基类实现。
同时多重继承不可能/建议与类,因此最大。仅使用一个基类并从其他功能的接口继承。
谢谢这是非常有益的。 – 911TurboS 2012-02-08 16:45:01
什么是@覆盖关键字的目的,因为如果我忽略它,它仍然 的工作原理相同。
可读性。
如果我没有实现抽象方法,我得到编译错误。那么与实现接口有什么不同呢 ?
接口不允许您包含的代码。
另外,我也可以在B中实现method2()。然后输出更改为 什么是在B中使用。是不是这也覆盖父类 方法。那么明确定义类A中抽象方法 的目的是什么?
是的,它是重写父类的方法。您通常将方法定义为抽象方法,以便为孩子保留实现(必须实现它或抽象)。如果它不是抽象的,你必须实现它。
What is the purpose of @Override keyword
这是后来的Java此外,这是弱自我控制。它是注释,即库类,而不是关键字。
So what is the difference to implementing an interface?
小。 Iterface是一个所有方法都是抽象的类。而且,只允许一个父类,而它可以是多个接口。你也可以把成员放入课堂,但不能进入界面。
Then what is the purpose of explicitly Defining a method abstract in Class A?
你应该把它声明摘要仅供如果它有没有身体。 JVM需要知道所有后代都拥有它。
感谢您的回答 – 911TurboS 2012-02-08 16:51:19
有时是谷歌比要求或回答这里更快:http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html – vulkanino 2012-02-08 16:37:19
谷歌被阻止在我们的学校 – 911TurboS 2012-02-08 16:42:12
你的互联网如何存在没有没有谷歌? – jondavidjohn 2012-02-08 16:50:13