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) それらのコードが追加された (実装された) ため、実装済みとしてマークされます。

インターフェイスはすべての Java オブジェクトが持つ toString メソッドをオーバーライドし、CharSequenceDemo にも実装しているため、toString メソッドはオーバーライドされています。

于 2013-01-08T17:50:28.260 に答える
0

実装- 実装されたインターフェイスからすべてのメソッドを定義する必要があります

extends - 親クラスで書かれたメソッドが使える


実装はあなたのインターフェースから来ます。

オーバーライドは 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 に答える