質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

17429閲覧

別クラスから、メソッドの参照方法。

TA-KEY

総合スコア21

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2018/01/23 07:01

編集2018/01/23 07:43

###前提・実現したいこと
java初心者です。
Javaで簡単なパワプロくんみたいなゲームを作っています。
MainクラスでHeroクラスをインスタンス化しました(Hero h = new Hero();)。ManagrクラスでもHeroクラスのaddHP()メソッドを使いたいのですが、h.addHPでもHero.addHPでも上手くいきません。
ManagerクラスでHeroをインスタンス化せずに、HeroクラスのaddHPメソッドを使いたいんですが、どうすればいいんでしょうか。助けて欲しいです。

[追記]
ManagerクラスもMainクラスでインスタンス化するキャラクターの一人です。HeroのHPを回復するメソッドを持っています。

###発生している問題・エラーメッセージ

hを解決できません。static参照することはできません。

###該当のソースコード

java

1public class Hero { 2 3 public Hero(String name){ 4 this.name = name; 5 this.HP = 100; 6 } 7 8 public void addHP(int num){ 9 this.HP += num; 10 } 11} 12 13————————————————————— 14public class Manager { 15 16 public Manager(String name) { 17 this.name = name; 18 } 19 20 public void recovery(){ 21 h.addHP(40); 22 } 23} 24————————————————————— 25 26public class Main { 27 public Main(){ 28 Hero h = new Hero("Test1"); 29 Manager m = new Manager("Test2"); 30 m.recovery(); 31 } 32}

###試したこと
(Managerクラス内の)h.addHP(40)→Hero.addHP(40)
にしてみましたが、「型Heroの非staticメソッドaddHP(int)をstatic参照することはできません」とエラー。
一応、HeroクラスのHPとaddHPメソッドをstaticにしてみると、Hero.addHP(40);でエラーは消えましたが、これでは、Mainクラスでインスタンス化した(Hero)hの体力が回復するわけではないですよね?

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

JavaScriptはJavaと一切関係ないので、タグを外してください。


Managerインスタンスからhを参照できる必要があります。
次のどちらかを選択し実装してください。

  • Managerにprivateフィールドheroを作る
  • メソッドrecoveryの引数としてheroを渡す

どちらが良いかは設計に依ります。
Managerが何のマネージャかわからないので、私には選べません。

追記:
マネージャが文字通り部活動のマネージャーを指しているのですね。
それだったら後者の方が素直な設計な気がします。

あるいは、回復量を返すメソッドをManagerに用意するのもありです。
この場合、Hero#addHPをプライベートメソッドに出来るというメリットがあります。


一応、HeroクラスのHPとaddHPメソッドをstaticにしてみると、Hero.addHP(40);でエラーは消えましたが、これでは、Mainクラスでインスタンス化した(Hero)hの体力が回復するわけではないですよね?

回復しますよ。
ただ、ヒーローが複数いた場合、彼らのHPが全て共有されてしまいます。

staticをむやみに使うことはオブジェクト指向に反します。
よく分からないで使っているのなら、やめといた方がいいです。

投稿2018/01/23 07:04

編集2018/01/23 07:36
LouiS0616

総合スコア35658

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LouiS0616

2018/01/23 07:10

あ、マネージャーって本当に部活のマネージャーを指すのですね。 パワプロの場合チームメイトやマネージャー、監督やスカウトなどがいますが、それのスーパークラスを作った方が分かりやすそうですね。勉強にもなって一石二鳥です。
TA-KEY

2018/01/23 07:34

public class Hero { public Hero(){ this.HP = 100; } public void addHP(int num){ this.HP += num; } } ———————————————————— public class Manager { public Manager(String name) { this.name = name; } public void recovery(Hero h){ h.addHP(40); } } ———————————————————— public class Main { public Main(){ Hero h = new Hero("TEST1”); Manager m = new Manager(“TEST2”); m.recovery(h); } } まず、タグのご指摘ありがとうございました。 そして、コードはこういうことですね!!ありがとうございます! staticはむやみに使うものではないという指摘もとてもためになりました。 簡単のために継承してる記載は消しましたが、勉強のためにスーパークラス作ってます!頭痛いですが楽しいです。
LouiS0616

2018/01/23 07:45

学習目的で同様のプログラムを数年前に書こうとしたのでなんだか懐かしいです。(私の場合はパワプロではなくパワポケでした。) 途中で投げ出してしまったのですが... まだあのコードあるかなぁ。 楽しめているようで何よりです。 困難なことを楽しめるということは立派な才能です、頑張ってくださいね。応援しています。
guest

0

まったく意味がわからん。

[元のコード]:

Java

1public class Hero { 2 3 public Hero(){ 4 this.HP = 100; 5 } 6 7 public void addHP(int num){ 8 this.HP += num; 9 } 10} 11 12————————————————————— 13public class Manager { 14 15 public Manager(String name) { 16 this.name = name; 17 } 18 19 public void recovery(){ 20 h.addHP(40); 21 } 22} 23————————————————————— 24 25public class Main { 26 public Main(){ 27 Hero h = new Hero("TEST"); 28 } 29}

Hero::Hero() や Hero::addHP() では this.HP なんちゃら~ とやっているけど、

HP って言うメンバ ( メソッドやフィールド ) 無いよ?

Manager::recavery() でh.addHP(40) ってやっているけど、hって何?

もしかして Main::Main() Hero h = new Hero( "Test" ) っていうやつ?

というか、これコンパイル通るの?

Hero::Hero の引数は無い。それなのに Main::Mainでは Stringを渡そうとしている。

それに加えて、Manager::recavery() で h.addHP(40) ってあるけどhが定義されていない。

これではエラーになる。

投稿2018/01/23 07:38

BeatStar

総合スコア4958

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LouiS0616

2018/01/23 07:41

質問者はコンパイルエラーの原因を理解した上で、それを避ける方法を質問しているようです。
guest

0

メインクラスとManagerクラスの役割が良く分かりません。Managerクラスにおいてメインクラスでインスタンス化したHeroオブジェクトを使用したいのであれば、メインクラスでManagerクラスのメソッドを呼び出す時に引数でHeroオブジェクトを渡せば良いと思います。

投稿2018/01/23 07:07

unz.hori

総合スコア1057

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問