1

以下代码来自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 说-> 方法被覆盖和实现,但对于其他方法,它只是说被覆盖。覆盖和实现方法有什么区别?他们不是一样的吗?

4

4 回答 4

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() {
    }
}
于 2013-01-08T17:35:14.270 回答
1

当您说“对于另一个它只是说被覆盖”时,您实际上是指已实施吗?

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

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

于 2013-01-08T17:50:28.260 回答
0

implements - 你已经从实现的接口定义了每个方法

extends - 您可以使用在父类中编写的方法


实施来自您的界面。

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

于 2013-01-08T17:32:10.640 回答
0

CharSequence具有toString()方法,当您的类实现 CharSequence 时,您的类将被迫实现 toString()(因此实现),但是由于声明您的类的所有类的扩展java.lang.ObjecttoString()将从 Object 类继承它(因此被覆盖)。

因此在你的情况下

  • toString() ---> 从 CharSequence 实现
  • toString() ---> 从 java.lang.Object 覆盖
于 2013-01-08T17:35:28.173 回答