2013-01-08 82 views
1

下面的代码是从http://docs.oracle.com/javase/tutorial/java/IandI/examples/CharSequenceDemo.java我在我的笔记本电脑上运行netbeans来了解接口。什么时候Interface中的方法是'both'重写和实现?

public class CharSequenceDemo implements CharSequence { 
    private String s; 

    public CharSequenceDemo(String s) { 
     //It would be much more efficient to just reverse the string 
     //in the constructor. But a lot less fun! 
     this.s = s; 
    } 

    //If the string is backwards, the end is the beginning! 
    private int fromEnd(int i) { 
     return s.length() - 1 - i; 
    } 

    public char charAt(int i) { 
     if ((i < 0) || (i >= s.length())) { 
      throw new StringIndexOutOfBoundsException(i); 
     } 
     return s.charAt(fromEnd(i)); 
    } 

    public int length() { 
     return s.length(); 
    } 

    public CharSequence subSequence(int start, int end) { 
     if (start < 0) { 
      throw new StringIndexOutOfBoundsException(start); 
     } 
     if (end > s.length()) { 
      throw new StringIndexOutOfBoundsException(end); 
     } 
     if (start > end) { 
      throw new StringIndexOutOfBoundsException(start - end); 
     } 
     StringBuilder sub = 
      new StringBuilder(s.subSequence(fromEnd(end), fromEnd(start))); 
     return sub.reverse(); 
    } 

    public String toString() { 
     StringBuilder s = new StringBuilder(this.s); 
     return s.reverse().toString(); 
    } 

    //Random int from 0 to max. As random() generates values between 0 and 0.9999 
    private static int random(int max) { 
     return (int) Math.round(Math.random() * (max+1)); 
    } 

    public static void main(String[] args) { 
     CharSequenceDemo s = 
      new CharSequenceDemo("Write a class that implements the CharSequence interface found in the java.lang package."); 

     //exercise charAt() and length() 
     for (int i = 0; i < s.length(); i++) { 
      System.out.print(s.charAt(i)); 
     } 

     System.out.println(""); 

     //exercise subSequence() and length(); 
     int start = random(s.length() - 1); 
     int end = random(s.length() - 1 - start) + start; 
     System.out.println(s.subSequence(start, end)); 

     //exercise toString(); 
     System.out.println(s); 

    } 
} 

对于方法toString netbeans说 - >方法重写和实现,但对于其他它只是说覆盖。重写和实现一种方法有什么区别?他们不是同一件事吗?

+0

当您重写时,您修改了现有的行为。当你执行时,你尊重现有的行为。 – mre

回答

0

实现 - 你必须做的定义从实现的接口的每一个方法

延伸 - 您可以使用写在父类


实现来自你的接口方法。

替代来自对象(每个Java对象隐含地延伸对象)

3

在Java 5.0,@覆盖只能被放置在覆盖在超类中定义的方法,而不是一个在接口中声明的方法。在Java 6+中,您可以将@Override放置在实现和覆盖方法上。

在Java 6+您可以在不实现

interface A { 
    void method(); 
} 

interface B extends A { 
    @Override 
    void method(); 
} 

abstract class C implements A { 
    @Override 
    public abstract void method(); 
} 

class D extends C { 
    @Override 
    public void method() { 
    } 
} 
0

CharSequence覆盖有toString()方法,但是当你的类实现的CharSequence你的类将被迫实现的toString()(因此工具),因为所有该类的扩展java.lang.Object其中toString()声明你的类将从Object类继承它(因此被覆盖)。从CharSequence的

你的情况

因此

  • 的toString() - >工具
  • 的toString()--->从java.lang.Object继承
+0

所以,他们都“指向”被覆盖的toString。从哪里可以接受我得到正确的答案? – user1837224

1

重写当你说“对于另一个它只是说覆盖”你实际上是否意味着实施?

charAt,length和subSequence方法被标记为已实现,因为a)接口列出了它们,b)您为它们添加了代码(实现它们)。

toString方法说覆盖,因为接口覆盖了所有Java对象所具有的toString方法,并且您也在CharSequenceDemo中实现了它。

相关问题