teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

修正2

2021/09/10 05:54

投稿

BeatStar
BeatStar

スコア4962

answer CHANGED
@@ -100,7 +100,7 @@
100
100
 
101
101
  ですが、これは オブジェクトに結びついたものではなく、クラスレベルでついています。
102
102
 
103
- (イメージ的にはC言語の関数)
103
+ (イメージ的にはC言語の関数. 実際には別物だが, あくまでイメージとして)
104
104
 
105
105
  なので、staticなメソッド内で自分クラスのメンバを使いたい場合でもインスタンス化(オブジェクトを生成すること)が必要です。
106
106
 

2

追記1

2021/09/10 05:54

投稿

BeatStar
BeatStar

スコア4962

answer CHANGED
@@ -8,4 +8,106 @@
8
8
 
9
9
  **文字列を比較するときはequalsメソッドを使いましょう。**
10
10
 
11
- それに他の方も仰っているように、「フィールドpon が初期化も代入されていない」ですね。
11
+ それに他の方も仰っているように、「フィールドpon が初期化も代入されていない」ですね。
12
+
13
+ --------------
14
+
15
+ [追記1]
16
+
17
+ > それと別問題かもしれませんがインスタンスの生成時にstaticとうたないとエラーが出るので仕方なく打っているのですがそこについてもお聞きしたいです。
18
+
19
+ 今回のメインとは別枠ですが、一応書いておきます。
20
+
21
+ まず、この問題をどうにかする前に、「**オブジェクト指向とは何か**」を理解する必要があります。
22
+
23
+ オブジェクト指向(以降 OOP) とは、**データ(= フィールド)と処理(= メソッド)をひとまとめにしたオブジェクト**を中心に見る発想法です。
24
+
25
+ C言語とかのような言語では、データと処理(関数)は別々でした。
26
+ でも、この関係するものをひとまとめにしたオブジェクトにすることで、運用しやすくしています。
27
+
28
+ 「**対象データとその処理方法はオブジェクトだけが知っている**」状態にできるので、
29
+ 「**オブジェクトに管理や処理を任せる**」ということが出来ます。
30
+
31
+ そう、C#で言えば Stringとかみたいなものですね。
32
+
33
+ 質問者さんはこのStringに入っているデータの状態、完全に把握しますか?
34
+
35
+ そりゃ、もちろん、「今はディレクトリパスが入っている」とかみたいなものは把握するとは思いますが、
36
+ 事細かに把握しますか?
37
+
38
+ しませんね。
39
+
40
+ 文字列分割とかも、「String君、文字列を分割したものをくれないか?」とオブジェクトに依頼したりするだけですよね。
41
+
42
+ 呼び出し側は実装がどうなっているのかは興味なく、単に特定の処理(文字列分割, 文字列置換 etc.) だけが興味あるのですよね。
43
+
44
+ ~~そう、C言語の関数の範囲がオブジェクトレベルにまで広がった感じです。~~
45
+
46
+ ですが、勝手にオブジェクトを作って……とやると、コンパイラとかが理解できません。
47
+
48
+ いきなり、「これ、田中さんに渡して」とだけ言われるようなものです。
49
+ (いや、田中さんって誰よ???)
50
+
51
+ どの人を言っているのかを教えてくれないとわかりませんね。
52
+
53
+ そう、そういう情報を教えてあげないといけません。
54
+
55
+ で、その役割が**クラス**です。
56
+
57
+ 「こういうデータ構造があるんで、よろぴく~」とコンパイラに教えてあげるのです。
58
+ (言語によってはインタプリタだったりするが)
59
+
60
+ で、普通、クラスのメンバ( フィールドやメソッド ) には staticは付けません。
61
+
62
+ ```C#
63
+ public class ClassA{
64
+ public ClassA( int n ){
65
+ this.N = n;
66
+ this.name = "test";
67
+ }
68
+ public void add( int a ){
69
+ this.N += a;
70
+ }
71
+
72
+ // 他にもメソッド等がある
73
+
74
+ public int N{ get; set; }
75
+
76
+ private string name;
77
+ }
78
+ ```
79
+
80
+ みたいに。(上記サンプルは特に意味のないものですが)
81
+
82
+ そして、コンパイラとかに「このクラスでオブジェクトを作りますね~」と教えてあげる必要があります。
83
+
84
+ ```C#
85
+ ClassA obj = new ClassA( 100 );
86
+ ```
87
+
88
+ これによって、obj は N というデータや nameというデータをもったもので、
89
+ それに対する処理も完備しています。
90
+
91
+ これによって、N や name を管理したり処理したりするのは obj になります。
92
+
93
+ もちろん、一つのクラスから複数個のオブジェクトを作る事もできます。
94
+
95
+ とにかく、オブジェクトに管理を任せるのです。
96
+
97
+ でも、どうしても一つのメソッドで完結するような処理があります。
98
+
99
+ そういう場合は**苦肉の策として**、staticなメソッド等を使います。
100
+
101
+ ですが、これは オブジェクトに結びついたものではなく、クラスレベルでついています。
102
+
103
+ (イメージ的にはC言語の関数)
104
+
105
+ なので、staticなメソッド内で自分クラスのメンバを使いたい場合でもインスタンス化(オブジェクトを生成すること)が必要です。
106
+
107
+ 今回のように、paaクラスのjankenメソッドはstaticになっています。
108
+ そのため、ある意味、別のクラスからアクセスしているようなものとなり、
109
+ 「おいおい、staticなやつから非staticなやつにアクセスできんぞ」と言っているのです。
110
+
111
+ クラスを組んだからOOP……ではありません。
112
+
113
+ **フィールドとメソッドをひとまとめにして、そのオブジェクトに管理や処理を任せるための発想法がOOPです**。

1

修正

2021/09/10 05:51

投稿

BeatStar
BeatStar

スコア4962

answer CHANGED
@@ -6,6 +6,6 @@
6
6
 
7
7
  とあるので、場合によってはうまくいかない可能性もありますね。
8
8
 
9
- (今回そんなに問題なさそだけど)
9
+ **文字列を比較するときequalsメソッドを使いましょ。**
10
10
 
11
11
  それに他の方も仰っているように、「フィールドpon が初期化も代入されていない」ですね。