1

1)HashMap.javaのコードを読み取る。762行目で、アノテーションは、サブクラスがこれをオーバーライドしてputメソッドの動作を変更することを示しています。ただし、関数void addEntry(int、K、V、int)はプライベート関数です。サブクラスでオーバーライドするにはどうすればよいですか?

             /**
  758        * Adds a new entry with the specified key, value and hash code to
  759        * the specified bucket.  It is the responsibility of this
  760        * method to resize the table if appropriate.
  761        *
  762        * Subclass overrides this to alter the behavior of put method.
  763        */
  764       void addEntry(int hash, K key, V value, int bucketIndex) {
  765           Entry<K,V> e = table[bucketIndex];
  766           table[bucketIndex] = new Entry<>(hash, key, value, e);
  767           if (size++ >= threshold)
  768               resize(2 * table.length);

2)行746および753では、2つの関数recordAccessおよびrecordRemovalは空のままです。では、サブクラスはこれら2つの関数をどのようにオーバーライドできますか?

             static class Entry<K,V> implements Map.Entry<K,V> {
  688           final K key;
  689           V value;
  690           Entry<K,V> next;
  691           final int hash;

                ...

                 /**
  742            * This method is invoked whenever the value in an entry is
  743            * overwritten by an invocation of put(k,v) for a key k that's already
  744            * in the HashMap.
  745            */
  746           void recordAccess(HashMap<K,V> m) {
  747           }
  748   
  749           /**
  750            * This method is invoked whenever the entry is
  751            * removed from the table.
  752            */
  753           void recordRemoval(HashMap<K,V> m) {
  754           }
  755       }
4

1 に答える 1

2

これらのメソッドはではありません private

指定されていない場合のアクセシビリティは、いわゆる「パッケージプライベート」です。特に、これらのメソッドは、同じパッケージ内の他のクラスによってオーバーライドされる可能性があります。その理由はおそらく、Javaの作成者が、アプリケーションを壊すことなく、いつでもこのメソッドを変更/名前変更/置換できることを確認したいためです。APIが適切かどうかわからない場合は、これらの部分を「パッケージプライベート」に保ち、この方法でクラスを拡張する経験を積むことは非常に理にかなっています。後で公開することもできます。ただし、それらを作成することはできません。そうしないと、独自のクラスでそれらを拡張することもできなくなります。private

真の privateメソッドを取得するには、キーワードを使用する必要がありますprivate。指定がない場合、デフォルトはいわゆる「パッケージプライベート」であり、パブリックインターフェイスの場合は、何も指定されていない場合でもパブリックになります。

Eclipseを使用している場合は、メソッド名でCtrl + Tを試して、クラスがそれらをオーバーライドするかどうかを確認してください。

于 2012-12-24T20:44:14.553 に答える