2013-03-17 13 views
14

私はJavaを初め、基本を学んでいます。私はtoStringメソッドを研究していましたし、それを自分のクラスでオーバーライドする方法もありました。私はちょうどtoStringpublicであると思っていますか?それはObjectクラスでそう定義されているのでしょうか?なぜtoString()の私のオーバーライドメソッドはpublicでなければならないのですか?

+0

http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls -8.4.8.3 –

+0

'toString()'からprivateメソッドを呼び出すことはいつでも可能です – Moak

答えて

26

の視認性をより等しいまたは以上である必要があります。

修飾子

オーバーライドするmのアクセス指定子エコーは、オーバーライドされたメソッドより多くのアクセスを許可することができますが、少なくはありません。たとえば、スーパークラスの保護されたインスタンスメソッドは、サブクラスでパブリックにすることはできますが、プライベートにすることはできません。

この継承はLiskov substitution principleが有効でなければならないための2つのクラス間の関係IS-Aを作成するため。強制することが不可能であった先の制約を受けることなく。

+0

LSPでは、オブジェクトを基底型にキャストすると基底型として動作する必要があるため、メソッドをオーバーライドするオブジェクトはベースクラスの契約に準拠するような方法で行われます。 *これは、メソッドが有用でなければならないことを意味するものではありません。 'Foo()'がfalseを返す場合に '' Foo ''() ''が '' Fnorble() ''がFnorble()を呼び出すことができない場合、 'Moozler'であることが知られているオブジェクトに対して' Fnorble() 'を呼び出す試みを禁止することも同様です。 – supercat

14

どのようなメソッドをオーバーライドする場合でも、オーバーライドの可視性は少なくとも基本メソッドと同じくらい目に見える必要があります。

1

メソッドをオーバーライドするときは、オーバーライドされたメソッドの可視性を、ベースクラスまたはそれ以上のものとして宣言する必要があります。ここで

は私が私への参照として、それを自分で書いたオーバーライドのルールについての注意です:子で

/*アクセス修飾子*/

の1-アクセス修飾子は、(同じかそれ以上でなければなりませんシーケンス: public - protected - default(package-private) - private)。親のアクセス 修飾子はプライベートであってはいけません。子が親のメソッドへのアクセス を持っていない場合、@Overrideアノテーションを持たないメソッドをオーバーライドすると、新しいメソッドとみなされます。子供で

/*戻り値の型*/

2 - 戻り値の型は、同じクラスまたはサブクラスでなければなりません。

/*例外*/

、3-親のメソッドがチェック例外をスローした場合、その子の 方法ができます。同じ例外またはサブクラスを投げますA-。 b - に例外をスローしないでください。 c-実行時例外をスローします。

4-親メソッドがチェックされていない例外をスローした場合、子の メソッドは次のことを実行できます。a-例外をスローしません。 b - ランタイム 例外をスローします。

5-パルネットのメソッドが例外をスローしない場合、子の メソッドは次のことを実行できます。a-例外をスローしない。 b - ランタイム 例外をスローします。

2

あなたが任意のメソッドをオーバーライドする場合、オーバーライドの視認性が公式のOracle documentationからベース方法

0

がメソッドをオーバーライドしているため、プロトタイプメソッドまたはそれ以上のメソッドとして定義する必要があります。

+0

-1:ポイントの隣に( 'toString'は' public'、 'protected'はしません)、正しくありません(アクセス修飾子で宣言されたメソッドを、アクセス修飾子なしの別のメソッドでオーバーライドすることができますパッケージ) – meriton

20

考えてみましょう:あなたはGizmoをMyGizmoでサブクラス化します。これは、Gizmoを使用できる場所であればどこでもMyGizmoを使用できることを意味します。あるプログラムがgizmoObject.toString()の場合、gizmoObjectがGizmoではなくMyGizmoであっても動作するはずです。

特に、toStringは、ダンプオブジェクト&を印刷するために使用され、すべてのオブジェクトでアクセス可能である必要があります。

+3

+1は直感を説明する唯一の答えです。 –

+0

+1、@OliCharlesworthと同じ理由で。これは単なる恣意的なルールではありません。 –

+0

@OliCharlesworthと同じ理由で+1 – sunlight07

0

サブクラスメソッドをオーバーライドすると、可視性は親クラスよりも広くなければなりません。厳格なために

広い:

公共 デフォルト 保護 プライベート

関連する問題