14

私はJavaが初めてで、基本を学んでいます。toString私はメソッドと、自分のクラスでそれをオーバーライドする方法を研究していました。なぜそうしなけれtoStringばならないのだろうpublicか?Objectクラスでそう定義されているからですか?

4

7 に答える 7

28

公式のOracleドキュメントから:

修飾子

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

これは、継承によって 2 つのクラス間にIS-A関係が作成されるためです。この関係には、リスコフの置換原則が有効でなければなりません。以前の制約がなければ、強制することは不可能です。

于 2013-03-17T23:23:43.793 に答える
22

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

特に、toStringオブジェクトの印刷とダンプに使用され、すべてのオブジェクトでアクセスできる必要があります。

于 2013-03-17T23:27:10.303 に答える
14

メソッドをオーバーライドする場合、オーバーライドの可視性は、少なくとも基本メソッドと同じくらい可視的でなければなりません。

于 2013-03-17T23:21:39.383 に答える
2

メソッドをオーバーライドする場合、オーバーライド可視性は基本メソッドの可視性以上である必要があります

于 2013-03-17T23:23:25.197 に答える
1

メソッドをオーバーライドするときは、オーバーライドされたメソッドの可視性を、基本クラスまたはそれより広い範囲のものとして宣言する必要があります。

これは、私への参照として私が自分で書いたオーバーライドルールに関するメモです。

/* アクセス修飾子 */

1- 子のアクセス修飾子は同じかそれ以上でなければなりません (順序: public - protected - default (package-private) - private)。親のアクセス修飾子は非公開にしないでください。子が親のメソッドにアクセスできない場合、 @Override アノテーションなしでメソッドをオーバーライドすると、新しいメソッドと見なされます。

/* 戻り型 */

2- 子の戻り型は、同じクラスまたはサブクラスである必要があります。

/* 例外 */

3- 親のメソッドがチェック例外をスローする場合、子のメソッドは次のことができます。 a- 同じ例外またはサブクラスをスローします。b- 例外をスローしない。c- 実行時例外をスローします。

4- 親のメソッドが未チェックの例外をスローする場合、子のメソッドは次のことができます。 a- 例外をスローしない。b- 実行時例外をスローします。

5- parnet のメソッドが例外をスローしない場合、子のメソッドは次のことができます。 a- 例外をスローしない。b- 実行時例外をスローします。

于 2013-03-17T23:21:46.447 に答える
0

サブクラス メソッドの可視性をオーバーライドするときは、親クラスよりも広くする必要があります。

広い順から厳密な順:

パブリック デフォルト プロテクト プライベート

于 2013-03-18T08:46:16.297 に答える
0

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

于 2013-03-17T23:23:46.820 に答える