回答編集履歴

19

2023/06/10 15:58

投稿

退会済みユーザー
test CHANGED
@@ -30,7 +30,7 @@
30
30
  (わかりやすい例)
31
31
  http://www.wisdomsoft.jp/123.html
32
32
 
33
- まあちょっとぐぐればすぐ出てくることなんだけれども。
33
+
34
34
 
35
35
  # まとめ
36
36
 
@@ -39,8 +39,7 @@
39
39
  + 言語仕様として、スタティックメソッドを「オーバーライド」することはできなくされている。=スタティックメソッドに対して@overrideアノテーションを使うと、コンパイルエラーになる。
40
40
 
41
41
 
42
- # じゃあなんでそもそも、スタティックメソッドは「オーバーライド」できなくなってるの?
42
+ # じゃあなんでそもそも、スタティックメソッドは「オーバーライド」できなの?
43
- (なんでなんでって小学生かっての)
44
43
 
45
44
  staticメソッドは、参照されるオブジェクトではなく参照の型に基づいて呼び出される=どのメソッドを呼び出すかが、コンパイル時に決定される。
46
45
 

18

2023/06/10 14:48

投稿

退会済みユーザー
test CHANGED
@@ -39,7 +39,7 @@
39
39
  + 言語仕様として、スタティックメソッドを「オーバーライド」することはできなくされている。=スタティックメソッドに対して@overrideアノテーションを使うと、コンパイルエラーになる。
40
40
 
41
41
 
42
- # じゃあなんでそもそも、スタティックメソッドはオーバーライドできなくなってるの?
42
+ # じゃあなんでそもそも、スタティックメソッドはオーバーライドできなくなってるの?
43
43
  (なんでなんでって小学生かっての)
44
44
 
45
45
  staticメソッドは、参照されるオブジェクトではなく参照の型に基づいて呼び出される=どのメソッドを呼び出すかが、コンパイル時に決定される。

17

2023/06/10 14:47

投稿

退会済みユーザー
test CHANGED
@@ -38,3 +38,13 @@
38
38
 
39
39
  + 言語仕様として、スタティックメソッドを「オーバーライド」することはできなくされている。=スタティックメソッドに対して@overrideアノテーションを使うと、コンパイルエラーになる。
40
40
 
41
+
42
+ # じゃあなんでそもそも、スタティックメソッドはオーバーライドできなくなってるの?
43
+ (なんでなんでって小学生かっての)
44
+
45
+ staticメソッドは、参照されるオブジェクトではなく参照の型に基づいて呼び出される=どのメソッドを呼び出すかが、コンパイル時に決定される。
46
+
47
+ 「オーバーライド」は実行時の動的バインディングに依存するしくみになってるから、上記のようなstaticメソッドの仕様上、staticメソッドを「オーバーライド」することは原理的にできない。
48
+
49
+ (インスタンスメソッドはstaticメソッドと異なり、参照の型ではなく参照されてるオブジェクトの型に基づいて呼び出される=どのメソッドを呼び出すかが実行時に決定される)
50
+

16

2023/06/10 14:35

投稿

退会済みユーザー
test CHANGED
@@ -36,5 +36,5 @@
36
36
 
37
37
  + 形式上、スタティックメソッドを"再定義"することは可能 =インスタンスメソッドのオーバーライドの形式と同じように「クラスを継承して、継承先で、継承元に存在するメソッドと同じ名前、同じ引数のメソッドを定義」することはできる。(これは「オーバーライド」ではない。元のメソッドは「隠蔽」される)
38
38
 
39
- + 言語仕様として、スタティックメソッドを「オーバーライド」することはできなくされている。=@overrideアノテーションを使うと、コンパイルエラーになる。
39
+ + 言語仕様として、スタティックメソッドを「オーバーライド」することはできなくされている。=スタティックメソッドに対して@overrideアノテーションを使うと、コンパイルエラーになる。
40
40
 

15

2023/06/10 14:33

投稿

退会済みユーザー
test CHANGED
@@ -3,14 +3,13 @@
3
3
  なんかのサイトで出てきてる”再定義”ってのは、「継承先で、おなじなまえで、"てーぎ"すること」という一般的な言葉に過ぎない。
4
4
 
5
5
  一方、「オーバーライド」ってのはJavaのドキュメントに仕様みたいなもんとして定義されてる言葉。
6
+ https://docs.oracle.com/javase/specs/jls/se20/html/jls-8.html#jls-8.4.8.1
6
7
 
7
8
  ”再定義”っていう言葉と「オーバーライド」は同じではない。
8
9
  語弊があるかもしれないが、”再定義”は「オーバーライド」を含むと考えたらわかりやすいかも。
9
10
 
10
11
  で、もう一つの公式っぽい単語「隠蔽」っていう言葉を知ってるかどうか。
11
-
12
-
13
- https://docs.oracle.com/javase/specs/jls/se20/html/jls-8.html#jls-8.4.8
12
+ https://docs.oracle.com/javase/specs/jls/se20/html/jls-8.html#jls-8.4.8.2
14
13
 
15
14
  スタティックメソッドは「オーバーライド」(override)できない。
16
15
  言語仕様として「オーバーライド」できるのはインスタンスメソッドだけだ。
@@ -26,10 +25,9 @@
26
25
  + オーバーライド:オーバーライドしたインスタンスメソッドによって、継承元のインスタンスメソッドが上書き(支配)される。オーバーライドされたインスタンスメソッドへのアクセスは、サブクラス内部からsuper()を使ってしかできなくなる。
27
26
 
28
27
  + 隠蔽:修飾名や、super、スーパークラス型へのキャストを含むメソッド呼び出し式を用いて元のメソッドにアクセスすることができる。
29
- なお、クラスメソッドでインスタンスメソッドを隠蔽しようとするとコンパイルエラーになる
28
+ なお、クラスメソッドでインスタンスメソッドを隠蔽しようとするとコンパイルエラーになる
30
- https://docs.oracle.com/javase/specs/jls/se20/html/jls-8.html#jls-8.4.8.2
31
29
 
32
- わかりやすい例)
30
+ わかりやすい例)
33
31
  http://www.wisdomsoft.jp/123.html
34
32
 
35
33
  まあちょっとぐぐればすぐ出てくることなんだけれども。

14

2023/06/10 14:31

投稿

退会済みユーザー
test CHANGED
@@ -17,7 +17,7 @@
17
17
  なので、@Overrideアノテーションをスタティックメソッドに使うとコンパイルエラーになる。
18
18
 
19
19
  しかし、staticメソッドも、継承先で同じ名前をつかって再定義することはできる。
20
- つまり「スタティッラスを継承して、継承先で、継承元に存在するメソッドと同じ名前、同じ引数のメソッドを定義」することはできる。
20
+ つまり「クラスを継承して、継承先で、継承元に存在するスタティックメソッドと同じ名前、同じ引数のスタティックメソッドを定義」することはできる。
21
21
  この場合、継承元のスタティックメソッドは「**隠蔽**」される(hiding)。
22
22
 
23
23
 

13

2023/06/10 14:29

投稿

退会済みユーザー
test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  なんかのサイトで出てきてる”再定義”ってのは、「継承先で、おなじなまえで、"てーぎ"すること」という一般的な言葉に過ぎない。
4
4
 
5
- 一方、「オーバーライド」ってのはJavaに仕様みたいなもんしてちゃんと定義されてる言葉。
5
+ 一方、「オーバーライド」ってのはJavaのドキュメントに仕様みたいなもんして定義されてる言葉。
6
6
 
7
7
  ”再定義”っていう言葉と「オーバーライド」は同じではない。
8
8
  語弊があるかもしれないが、”再定義”は「オーバーライド」を含むと考えたらわかりやすいかも。

12

2023/06/10 14:28

投稿

退会済みユーザー
test CHANGED
@@ -21,7 +21,7 @@
21
21
  この場合、継承元のスタティックメソッドは「**隠蔽**」される(hiding)。
22
22
 
23
23
 
24
- おんなじ、”メソッドの再定義”を行っているとしても、「オーバーライド」している場合と「隠蔽」が起こっている場合では、下記のような違いが出る。
24
+ 形式上おんなじ、”メソッドの再定義”を行っているとしても、「オーバーライド」している場合と「隠蔽」が起こっている場合では、下記のような違いが出る。
25
25
 
26
26
  + オーバーライド:オーバーライドしたインスタンスメソッドによって、継承元のインスタンスメソッドが上書き(支配)される。オーバーライドされたインスタンスメソッドへのアクセスは、サブクラス内部からsuper()を使ってしかできなくなる。
27
27
 

11

2023/06/10 14:27

投稿

退会済みユーザー
test CHANGED
@@ -3,6 +3,9 @@
3
3
  なんかのサイトで出てきてる”再定義”ってのは、「継承先で、おなじなまえで、"てーぎ"すること」という一般的な言葉に過ぎない。
4
4
 
5
5
  一方、「オーバーライド」ってのはJavaに仕様みたいなもんしてちゃんと定義されてる言葉。
6
+
7
+ ”再定義”っていう言葉と「オーバーライド」は同じではない。
8
+ 語弊があるかもしれないが、”再定義”は「オーバーライド」を含むと考えたらわかりやすいかも。
6
9
 
7
10
  で、もう一つの公式っぽい単語「隠蔽」っていう言葉を知ってるかどうか。
8
11
 

10

2023/06/10 14:22

投稿

退会済みユーザー
test CHANGED
@@ -33,7 +33,7 @@
33
33
 
34
34
  # まとめ
35
35
 
36
- + 形式上、スタティックメソッドを"再定義"することは可能 =インスタンスメソッドのオーバーライドの形式と同じように「クラスを継承して、継承先で、継承元に存在するメソッドと同じ名前、同じ引数のメソッドを定義」することはできる。
36
+ + 形式上、スタティックメソッドを"再定義"することは可能 =インスタンスメソッドのオーバーライドの形式と同じように「クラスを継承して、継承先で、継承元に存在するメソッドと同じ名前、同じ引数のメソッドを定義」することはできる。(これは「オーバーライド」ではない。元のメソッドは「隠蔽」される)
37
37
 
38
- + しかし、言語仕様として、スタティックメソッドを「オーバーライド」することはできなくされている。=@overrideアノテーションを使うと、コンパイルエラーになる。
38
+ + 言語仕様として、スタティックメソッドを「オーバーライド」することはできなくされている。=@overrideアノテーションを使うと、コンパイルエラーになる。
39
39
 

9

ww

2023/06/10 14:20

投稿

退会済みユーザー
test CHANGED
@@ -35,5 +35,5 @@
35
35
 
36
36
  + 形式上、スタティックメソッドを"再定義"することは可能 =インスタンスメソッドのオーバーライドの形式と同じように「クラスを継承して、継承先で、継承元に存在するメソッドと同じ名前、同じ引数のメソッドを定義」することはできる。
37
37
 
38
- + しかし、言語仕様として、スタティックメソッドをオーバーライドすることはできなくされている。=@overrideアノテーションを使うはできない。ゆえにコンパイルエラーになる。
38
+ + しかし、言語仕様として、スタティックメソッドをオーバーライドすることはできなくされている。=@overrideアノテーションを使うとコンパイルエラーになる。
39
39
 

8

qqqq

2023/06/10 14:20

投稿

退会済みユーザー
test CHANGED
@@ -14,7 +14,8 @@
14
14
  なので、@Overrideアノテーションをスタティックメソッドに使うとコンパイルエラーになる。
15
15
 
16
16
  しかし、staticメソッドも、継承先で同じ名前をつかって再定義することはできる。
17
- この場合(=「スタティッククラスを継承して、継承先で、継承元に存在するメソッドと同じ名前、同じ引数のメソッドを定義した場合いう意味)、継承元のスタティックメソッドが「**隠蔽**」され(hiding)
17
+ つまり「スタティッククラスを継承して、継承先で、継承元に存在するメソッドと同じ名前、同じ引数のメソッドを定義」するこはできる。
18
+ この場合、継承元のスタティックメソッドは「**隠蔽**」される(hiding)。
18
19
 
19
20
 
20
21
  おんなじ、”メソッドの再定義”を行っているとしても、「オーバーライド」している場合と「隠蔽」が起こっている場合では、下記のような違いが出る。
@@ -30,3 +31,9 @@
30
31
 
31
32
  まあちょっとぐぐればすぐ出てくることなんだけれども。
32
33
 
34
+ # まとめ
35
+
36
+ + 形式上、スタティックメソッドを"再定義"することは可能 =インスタンスメソッドのオーバーライドの形式と同じように「クラスを継承して、継承先で、継承元に存在するメソッドと同じ名前、同じ引数のメソッドを定義」することはできる。
37
+
38
+ + しかし、言語仕様として、スタティックメソッドをオーバーライドすることはできなくされている。=@overrideアノテーションを使うことはできない。ゆえにコンパイルエラーになる。
39
+

7

rr

2023/06/10 14:14

投稿

退会済みユーザー
test CHANGED
@@ -14,7 +14,7 @@
14
14
  なので、@Overrideアノテーションをスタティックメソッドに使うとコンパイルエラーになる。
15
15
 
16
16
  しかし、staticメソッドも、継承先で同じ名前をつかって再定義することはできる。
17
- この場合(=「スタティッククラスを継承して、継承先で同じ継承元に存在するメソッドと同じ名前、同じ引数のメソッドを定義した場合」、とう意味)、継承元のスタティックメソッドが「**隠蔽**」される(hiding)。
17
+ この場合(=「スタティッククラスを継承して、継承先で継承元に存在するメソッドと同じ名前、同じ引数のメソッドを定義した場合」、とう意味)、継承元のスタティックメソッドが「**隠蔽**」される(hiding)。
18
18
 
19
19
 
20
20
  おんなじ、”メソッドの再定義”を行っているとしても、「オーバーライド」している場合と「隠蔽」が起こっている場合では、下記のような違いが出る。

6

2023/06/10 14:12

投稿

退会済みユーザー
test CHANGED
@@ -14,7 +14,7 @@
14
14
  なので、@Overrideアノテーションをスタティックメソッドに使うとコンパイルエラーになる。
15
15
 
16
16
  しかし、staticメソッドも、継承先で同じ名前をつかって再定義することはできる。
17
- この場合(=「スタティックメソッドを継承して継承先で同じメソッド名、同じ引数を定義した場合、と言う意味)、継承元のスタティックメソッドが「**隠蔽**」される(hiding)。
17
+ この場合(=「スタティッククラスを継承して継承先で同じ継承元に存在するメソッドと同じ、同じ引数のメソッドを定義した場合、と言う意味)、継承元のスタティックメソッドが「**隠蔽**」される(hiding)。
18
18
 
19
19
 
20
20
  おんなじ、”メソッドの再定義”を行っているとしても、「オーバーライド」している場合と「隠蔽」が起こっている場合では、下記のような違いが出る。

5

ww

2023/06/10 14:11

投稿

退会済みユーザー
test CHANGED
@@ -17,7 +17,7 @@
17
17
  この場合(=「スタティックメソッドを継承して継承先で同じメソッド名、同じ引数を定義した場合、と言う意味」)、継承元のスタティックメソッドが「**隠蔽**」される(hiding)。
18
18
 
19
19
 
20
- じメソッドの再定義を行っとしても、「オーバーライド」し場合と「隠蔽」した場合で、下記のような違いが出る。
20
+ おんな、”メソッドの再定義を行っているとしても、「オーバーライド」している場合と「隠蔽」が起こっている場合で、下記のような違いが出る。
21
21
 
22
22
  + オーバーライド:オーバーライドしたインスタンスメソッドによって、継承元のインスタンスメソッドが上書き(支配)される。オーバーライドされたインスタンスメソッドへのアクセスは、サブクラス内部からsuper()を使ってしかできなくなる。
23
23
 

4

2023/06/10 14:10

投稿

退会済みユーザー
test CHANGED
@@ -1,6 +1,6 @@
1
1
  再定義とかオーバーライドという言葉の使い方で混乱してるかな。一度公式ドキュメントを読んで整理しよう。
2
2
 
3
- なんかのサイトで出てきてる”再定義”ってのは、「継承先でおなじなまえでてーぎすること」という一般的な言葉に過ぎない。
3
+ なんかのサイトで出てきてる”再定義”ってのは、「継承先でおなじなまえで、"てーぎ"すること」という一般的な言葉に過ぎない。
4
4
 
5
5
  一方、「オーバーライド」ってのはJavaに仕様みたいなもんしてちゃんと定義されてる言葉。
6
6
 

3

ss

2023/06/10 14:09

投稿

退会済みユーザー
test CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  一方、「オーバーライド」ってのはJavaに仕様みたいなもんしてちゃんと定義されてる言葉。
6
6
 
7
- で、この「オーバーライド」に対応したもう一つの公式っぽい単語「隠蔽」っていう言葉を知ってるかどうか。
7
+ で、もう一つの公式っぽい単語「隠蔽」っていう言葉を知ってるかどうか。
8
8
 
9
9
 
10
10
  https://docs.oracle.com/javase/specs/jls/se20/html/jls-8.html#jls-8.4.8

2

ww

2023/06/10 14:08

投稿

退会済みユーザー
test CHANGED
@@ -17,8 +17,7 @@
17
17
  この場合(=「スタティックメソッドを継承して継承先で同じメソッド名、同じ引数を定義した場合、と言う意味」)、継承元のスタティックメソッドが「**隠蔽**」される(hiding)。
18
18
 
19
19
 
20
- 同じ再定義といっても、「オーバーライド」と「隠蔽」は異なる。
20
+ 同じメソッドの再定義を行ったても、「オーバーライド」した場合と「隠蔽」した場合で、下記のよう違いが出る。
21
- 違いは下記。
22
21
 
23
22
  + オーバーライド:オーバーライドしたインスタンスメソッドによって、継承元のインスタンスメソッドが上書き(支配)される。オーバーライドされたインスタンスメソッドへのアクセスは、サブクラス内部からsuper()を使ってしかできなくなる。
24
23
 

1

ww

2023/06/10 14:06

投稿

退会済みユーザー
test CHANGED
@@ -1,10 +1,10 @@
1
1
  再定義とかオーバーライドという言葉の使い方で混乱してるかな。一度公式ドキュメントを読んで整理しよう。
2
2
 
3
- なんかのサイトで出てきてる再定義ってのは、継承先でじなまえで定義すること」という一般的な言葉に過ぎない。
3
+ なんかのサイトで出てきてる再定義ってのは、継承先でおなじなまえでてーぎすること」という一般的な言葉に過ぎない。
4
4
 
5
- 一方、「オーバーライド」ってのはJavaに仕様して定義されてる言葉。
5
+ 一方、「オーバーライド」ってのはJavaに仕様みたいなもんしてちゃんと定義されてる言葉。
6
6
 
7
- で、この「オーバーライド」に対応した「隠蔽」っていう言葉を知ってるかどうか。
7
+ で、この「オーバーライド」に対応したもう一つの公式っぽい単語「隠蔽」っていう言葉を知ってるかどうか。
8
8
 
9
9
 
10
10
  https://docs.oracle.com/javase/specs/jls/se20/html/jls-8.html#jls-8.4.8
@@ -14,7 +14,7 @@
14
14
  なので、@Overrideアノテーションをスタティックメソッドに使うとコンパイルエラーになる。
15
15
 
16
16
  しかし、staticメソッドも、継承先で同じ名前をつかって再定義することはできる。
17
- この場合、継承元のスタティックメソッドが「隠蔽」される(hiding)と言う
17
+ この場合(=「スタティックメソッドを継承して継承先で同じメソッド名同じ引数を定義した場合、と言う意味」)、継承元のスタティックメソッドが「**隠蔽**」される(hiding)。
18
18
 
19
19
 
20
20
  同じ再定義といっても、「オーバーライド」と「隠蔽」は異なる。
@@ -26,7 +26,7 @@
26
26
  なお、クラスメソッドでインスタンスメソッドを隠蔽しようとするとコンパイルエラーになる。
27
27
  https://docs.oracle.com/javase/specs/jls/se20/html/jls-8.html#jls-8.4.8.2
28
28
 
29
- 例)
29
+ わかりやすい例)
30
30
  http://www.wisdomsoft.jp/123.html
31
31
 
32
32
  まあちょっとぐぐればすぐ出てくることなんだけれども。