2011-02-09 13 views
2

私はSun/Oracle's java tutorialに行ってきましたので、Javaの方が流暢になることに興味があります。私はインターフェイスを実装するセクションにあり、演習の1つに解決策として与えたコードは理解していません。インターフェイスの実装に関するこのレッスンを理解するのを助けてください

exerciseは、java.lang.CharSequenceインターフェイスを実装することでした。実装では文字列を後方に返し、クラスをテストするための小さなメインメソッドを記述する必要がありました。 4つの方法すべてを必ず呼び出してください。

これはやや圧倒的なものだったので、私はそのコンセプトとそのコードを理解できるかどうかを調べるために解決策を開始しました。

1)charAtメソッドを実装すると、charAtメソッドの呼び出しが返されますが、これが何らかの無限ループを引き起こさないのはなぜですか?

ありがとうございます。ここで

コードは次のとおりです。

/* Copyright (c) 1995, 2008, Oracle and/or its affiliates. All rights reserved. */ 
// CharSequenceDemo presents a String value -- backwards. 
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. 
    private static int random(int max) { 
     return (int) Math.round(Math.random() * max + 0.5); 
    } 

    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.println(s.charAt(i)); 
     } 

     //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); 

    } 
} 

答えて

1

1)、インクルードが が、この原因は 無限ループのいくつかの並べ替えていない理由のcharAtメソッドの呼び出し を戻ってきていますか?

メソッドが全く異なる2つのオブジェクトを参照するため、無限ループはありません。

インターフェイスでは、CharSequenceのcharAt()シグネチャが定義されています。この場合の実装には、バッキングStringインスタンスがあります。 CharSequenceの実装では、バッキングStringインスタンスのメソッドcharAt()が呼び出されます。 this.charAt()を呼び出していないため、無限ループはありません。

+0

's.charAt(fromEnd(i))'はjava.lang.Stringの 'charAt'メソッドを' s'がStringオブジェクトであるため実際に呼び出していますか? – ProfessionalAmateur

+0

はい、そうです。 – duffymo

3

のcharAtにネストされた呼び出しは、あなたが同じメソッドを呼び出すことが、対象にしていることを意味するにs.charAtです。そこに無限ループはありません。

彼らfromEndは、ほぼ最上部に

private int fromEnd(int i) { 
     return s.length() - 1 - i; 
    } 

として定義されます。彼らはのcharAt メソッドを実装する場合

+0

: 'CharSequenceDemo S =新CharSequenceDemo("書きますこのCharSequenceDemo varString = new CharSequenceDemo( "java.langパッケージにあるCharSequenceインタフェースを実装するクラスを作成します。"); 'このクラスは、java.langパッケージ内のCharSequenceインタフェースを実装するクラスです。私の主な方法に含まれているものを修正するだけでいいですか?私はおそらく彼らが 's'を2度混乱させて私を傷つけてしまったと思っていますか? – ProfessionalAmateur

+0

's.charAt()'はStringオブジェクト 'charAt()'を呼び出していますが、あなたが主張しているのと同じメソッドではありません。 –

1
  1. charAtは、それがString sためStringクラスのcharAtメソッドを呼び出して、実際には再帰的ではありません。
  2. fromEnd(i)
  3. はまたあなたのクラス

で定義されているfromEnd(int i)メソッドへのメソッド呼び出しである - 私はこのことから、変数名を変更した場合

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