Interface中的方法何时被“覆盖”并实现?

时间:2013-01-08 17:28:21

标签: java interface

以下代码来自http://docs.oracle.com/javase/tutorial/java/IandI/examples/CharSequenceDemo.java我在笔记本电脑中使用netbeans运行以了解界面。

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说 - &gt;方法被覆盖和实现,但对于其他它只是说被覆盖。覆盖和实现方法有什么区别?他们不一样吗?

4 个答案:

答案 0 :(得分:3)

在Java 5.0中,@ Override只能放在覆盖超类中定义的方法的方法上,而不是在接口中声明的方法。在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() {
    }
}

答案 1 :(得分:1)

当你说“为了另一个它只是说被覆盖”时你真的意味着实施吗?

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

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

答案 2 :(得分:0)

实现 - 您已经从实现的接口

定义了每个方法

extends - 您可以使用父类

中编写的方法

实施来自您的界面。

Override来自Object(每个java对象隐式扩展Object)

答案 3 :(得分:0)

CharSequence toString()方法,当您的类实现CharSequence时,您的类将被强制实现toString()(因此实现),但是所有类的扩展{ {1}} java.lang.Object声明您的类将从Object类继承它(因此覆盖)。

因此在你的情况下

  • toString()---&gt;来自CharSequence的实现
  • toString()---&gt;从java.lang.Object重写