私はJavaを初め、基本を学んでいます。私はtoString
メソッドを研究していましたし、それを自分のクラスでオーバーライドする方法もありました。私はちょうどtoString
がpublic
であると思っていますか?それはObject
クラスでそう定義されているのでしょうか?なぜtoString()の私のオーバーライドメソッドはpublicでなければならないのですか?
答えて
の視認性をより等しいまたは以上である必要があります。
修飾子
オーバーライドするmのアクセス指定子エコーは、オーバーライドされたメソッドより多くのアクセスを許可することができますが、少なくはありません。たとえば、スーパークラスの保護されたインスタンスメソッドは、サブクラスでパブリックにすることはできますが、プライベートにすることはできません。
この継承はLiskov substitution principleが有効でなければならないための2つのクラス間の関係IS-Aを作成するため。強制することが不可能であった先の制約を受けることなく。
LSPでは、オブジェクトを基底型にキャストすると基底型として動作する必要があるため、メソッドをオーバーライドするオブジェクトはベースクラスの契約に準拠するような方法で行われます。 *これは、メソッドが有用でなければならないことを意味するものではありません。 'Foo()'がfalseを返す場合に '' Foo ''() ''が '' Fnorble() ''がFnorble()を呼び出すことができない場合、 'Moozler'であることが知られているオブジェクトに対して' Fnorble() 'を呼び出す試みを禁止することも同様です。 – supercat
どのようなメソッドをオーバーライドする場合でも、オーバーライドの可視性は少なくとも基本メソッドと同じくらい目に見える必要があります。
メソッドをオーバーライドするときは、オーバーライドされたメソッドの可視性を、ベースクラスまたはそれ以上のものとして宣言する必要があります。ここで
は私が私への参照として、それを自分で書いたオーバーライドのルールについての注意です:子で
/*アクセス修飾子*/
の1-アクセス修飾子は、(同じかそれ以上でなければなりませんシーケンス: public - protected - default(package-private) - private)。親のアクセス 修飾子はプライベートであってはいけません。子が親のメソッドへのアクセス を持っていない場合、@Overrideアノテーションを持たないメソッドをオーバーライドすると、新しいメソッドとみなされます。子供で
/*戻り値の型*/
2 - 戻り値の型は、同じクラスまたはサブクラスでなければなりません。
/*例外*/
、3-親のメソッドがチェック例外をスローした場合、その子の 方法ができます。同じ例外またはサブクラスを投げますA-。 b - に例外をスローしないでください。 c-実行時例外をスローします。
4-親メソッドがチェックされていない例外をスローした場合、子の メソッドは次のことを実行できます。a-例外をスローしません。 b - ランタイム 例外をスローします。
5-パルネットのメソッドが例外をスローしない場合、子の メソッドは次のことを実行できます。a-例外をスローしない。 b - ランタイム 例外をスローします。
あなたが任意のメソッドをオーバーライドする場合、オーバーライドの視認性が公式のOracle documentationからベース方法
がメソッドをオーバーライドしているため、プロトタイプメソッドまたはそれ以上のメソッドとして定義する必要があります。
-1:ポイントの隣に( 'toString'は' public'、 'protected'はしません)、正しくありません(アクセス修飾子で宣言されたメソッドを、アクセス修飾子なしの別のメソッドでオーバーライドすることができますパッケージ) – meriton
考えてみましょう:あなたはGizmoをMyGizmoでサブクラス化します。これは、Gizmoを使用できる場所であればどこでもMyGizmoを使用できることを意味します。あるプログラムがgizmoObject.toString()
の場合、gizmoObjectがGizmoではなくMyGizmoであっても動作するはずです。
特に、toString
は、ダンプオブジェクト&を印刷するために使用され、すべてのオブジェクトでアクセス可能である必要があります。
+1は直感を説明する唯一の答えです。 –
+1、@OliCharlesworthと同じ理由で。これは単なる恣意的なルールではありません。 –
@OliCharlesworthと同じ理由で+1 – sunlight07
サブクラスメソッドをオーバーライドすると、可視性は親クラスよりも広くなければなりません。厳格なために
広い:
公共 デフォルト 保護 プライベート
- 1. なぜデリゲートは静的でなければならないのですか?
- 2. なぜASP.NET MVCはWebアプリケーションでなければならないのですか?
- 3. Cocoa-私のstatusItemをApplicationDelegateに入れなければならないのはなぜですか?
- 4. なぜobjcブロックの割り当ては 'copy'でなく 'assign'でなければならないのですか?
- 5. なぜ私はiOSをクリックするトリガーに2度タップしなければならないのですか
- 6. +または - は、Calc()メソッド内の空白で囲まなければならないのはなぜですか?
- 7. なぜ時々私はparseJSONをしなければならなかったのですか?
- 8. Member Detectorのフォールバックはなぜintでなければならないのですか?
- 9. main()を専用のクラスに入れなければならないのはなぜですか?
- 10. ScalazのUnapply:なぜtraverseUはStateと連携しないのですか?なぜトラバースが存在しなければならないのですか?
- 11. intでなければならないSqlCommandが文字列を返すのはなぜですか?
- 12. IQuery NHibernate - それはリストでなければならないのですか?
- 13. 私の警告から警告を受けないのはなぜですか?
- 14. Windows AzureのWebRoleはステートレスでなければならないのですか?
- 15. this.objectNameの代わりにExt.getCmp( 'id')を使用しなければならないのはなぜですか?
- 16. パッケージがあれば、そのアーティファクトIDはどんなものでなければならないのですか?
- 17. なぜWPFの依存関係プロパティが静的でなければならないのですか
- 18. コードブロックにSystem.out.printlnがなければ私のグラフィックスコードはなぜ動かないのですか?
- 19. はなぜ<宣言しなければならないのPHP
- 20. なぜ "foo" .toString()はtoString.call( "foo")と同じではないのですか?
- 21. VBでToString()を投影できないのはなぜですか?
- 22. VBAの簡単なループプロシージャでなければならない
- 23. キーを2回押しなければならないのはなぜですか?
- 24. super-deallocを最後に呼び出さなければならないのはなぜですか?
- 25. インターフェイスでToString()を呼び出せないのはなぜですか?
- 26. コードの先頭にパッケージを宣言しなければならなかったのはなぜですか?
- 27. VB.netクラスのNullable PublicプロパティがAssignmentとして0(ゼロ)を受け入れないのはなぜですか?
- 28. 動的GridViewのPostbackUrlは、私が彼らがそうでなければならないとは思わない
- 29. 依存性注入:私はどこから始めなければならないのですか?
- 30. なぜ私のTableLayoutは膨らませられないのですか?
http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls -8.4.8.3 –
'toString()'からprivateメソッドを呼び出すことはいつでも可能です – Moak