2012-02-08 52 views
11

假设我有两个类,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类中明确定义方法的目的是什么?摘要
+2

有时是谷歌比要求或回答这里更快:http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html – vulkanino 2012-02-08 16:37:19

+5

谷歌被阻止在我们的学校 – 911TurboS 2012-02-08 16:42:12

+6

你的互联网如何存在没有没有谷歌? – jondavidjohn 2012-02-08 16:50:13

回答

13

@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关键字显示有用时)。

+1

感谢您抽出宝贵时间来解释这个想法 – 911TurboS 2012-02-08 16:51:31

+2

非常感谢!无论如何,通过查看示例,您将习惯于抽象/接口等。 Spring框架就是一个很好的例子。事实上,如果您了解设计模式:抽象类与模板方法非常接近,而接口涉及(在许多其他事物中)策略模式。模板通过继承进行扩展,而策略通过组合进行扩展。再次说明:具有所有模板和组件的Spring框架就是一个很好的例子。你会发现与时间。 – helios 2012-02-08 16:56:14

4

抽象类允许你存储基础水平实现(继承),同时还生产,保证继承的类将执行自己的特定功能(接口)合同......

虽然永远不会有抽象类的实例,你可以存储继承人之间共享的功能...

我一直认为他们作为接口,允许一定的方法基地级实现...

+1

抽象类为+1“某些方法的基本级别实现的接口” – helios 2012-02-08 16:44:36

+1

您的答案是让我清楚地了解其差异的原因。 – 911TurboS 2012-02-08 16:47:11

17
  1. @Override不是一个关键字,它是一个可选的注释,它可以帮助编译器检查是否确实重写了一个方法。如果你说@Override但没有方法来覆盖,编译器会告诉你,你可能犯了一个错字。将method1重命名为method12以查看效果。
  2. 接口不能有任何实现,而抽象类可以选择性地为其某些方法提供实现。另外,接口不能有数据成员。
  3. 将方法定义为抽象意味着派生类必须提供实现。不宣布它抽象说派生类可以提供自己的实现,但他们不需要。
+0

感谢您的回答 – 911TurboS 2012-02-08 16:42:32

+0

@ 911TurboS如果答案正确(箭头向下符号下方的按钮),您应该将答案标记为已回答。 – Rohan 2012-02-08 16:45:46

+0

是的,但它不允许我说,它说等待2分钟 – 911TurboS 2012-02-08 16:53:28

0

的实际使用进入画面,当你有多个类实现和方法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类,你可以计算出一些常用操作。

2

抽象类和接口之间的主要区别是,接口只定义一个接口和抽象类也可以具有执行和字段/属性。

抽象类可以被看作是IS-A关系(例如,马是动物)。对于接口来说,它主要是一个类可以具有的某些功能(例如INavigable,ISortable)。

另外抽象方法不能实例化(无论是接口)。

重写函数用于显示函数具有基类实现。

同时多重继承不可能/建议与类,因此最大。仅使用一个基类并从其他功能的接口继承。

+0

谢谢这是非常有益的。 – 911TurboS 2012-02-08 16:45:01

1

什么是@覆盖关键字的目的,因为如果我忽略它,它仍然 的工作原理相同。

可读性。

如果我没有实现抽象方法,我得到编译错误。那么与实现接口有什么不同呢 ?

接口不允许您包含的代码。

另外,我也可以在B中实现method2()。然后输出更改为 什么是在B中使用。是不是这也覆盖父类 方法。那么明确定义类A中抽象方法 的目的是什么?

是的,它是重写父类的方法。您通常将方法定义为抽象方法,以便为孩子保留实现(必须实现它或抽象)。如果它不是抽象的,你必须实现它。

+0

完全符合我要求的答案:) – 911TurboS 2012-02-08 16:52:26

+1

接口确实允许您包含“代码”,它们是客户端如何与实现该接口的对象进行交互(接口)的声明。它们可以用作参考类型,实体通过从任何抽象或具体实现中封装客户端来促进多态。变量可以在接口中声明,但默认情况下(和定义)是静态的,因为永远不会有接口的实例。您使用抽象方法来执行具体实现,这些实现或者是未知的,或者可能会在子实现之间发生变化 – 2012-02-08 16:54:40

+0

您是对的。我只是想恢复;) – m0skit0 2012-02-08 16:59:00

1

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需要知道所有后代都拥有它。

+0

感谢您的回答 – 911TurboS 2012-02-08 16:51:19