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

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

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

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

Q&A

解決済

3回答

2228閲覧

任意のクラスのインスタンス名を標準入力したい。

ogiogimaru

総合スコア39

Java

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

0グッド

0クリップ

投稿2020/05/16 06:28

編集2020/05/17 03:07

現在Javaを勉強し始めて2週間ほどです。
クラス名を入力し、その名前に応じた値を返すようにしたいと思ったのですが、クラスのインスタンス名を入力するにはどうすればいいんでしょうか。

String name = "インスタンス名"//ここで標準入力したい。

こうして、squareのgeArea()にアクセスしようと

double area = name.getArea();

としてもエラーでシンボルが見つからないといわれます。

いくつかクラスはあって、今回はそのうちの一つのSquareをもらっています。

以下がメインのコードです。

public class TestFigures{ public static void main(String[] args){ Shape shape = new Shape("Square"); Square square = new Square("Square",4); //以下数値を入力してく場所 String str = square.toString();//ここで任意のクラスを指定したい double area = square.getArea(); System.out.println(str+" "+area); } }

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

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

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

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

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

m.ts10806

2020/05/16 06:30

コードブロックはファイル毎に分けてください。
momon-ga

2020/05/16 22:09 編集

質問がわかってないのですが、標準入力から内部のインスタンス変数の名前(ここでは、shape、square) を指定してオブジェクトにアクセス(getAreaを呼ぶ)したいってことでしょうか? 単に、標準入力からStringを受け取りたいってこと? String name = "インスタンス名";は、エラーにならないんじゃ?
ogiogimaru

2020/05/17 03:10

大変失礼しました。質問文に不備がありました。 質問の意図に関してですが、全くその通りです! nameに標準入力からの(今回はsquare)を受け取って、name.gatArea()とするとシンボルが...、という状況です。
ozwk

2020/05/17 03:17

真っ当な方法では無理です ただの興味なのか、練習問題なのかどちらでしょう?
退会済みユーザー

退会済みユーザー

2020/05/17 03:23

ozwk リフレクションはまっとうな方法ですが
Zuishin

2020/05/17 04:01

リフレクションでもできますが、ファクトリーメソッドでいいんじゃないかという気もします。
guest

回答3

0

java リフレクション を機能を利用すれば可能です。
上記に対して勉強しましょう。

import java.util.*; import java.lang.reflect.*; public class Main { public static void main(String[] args) throws Exception { // Your code here! Main main = new Main(); Method m = main.getClass().getMethod("println"); m.invoke(main); } private Main() { } public void println() { System.out.println("Hello Refrect"); } }

投稿2020/05/17 03:51

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

ogiogimaru

2020/05/17 05:09

ありがとうございます! ちょっと難しそうですが勉強してみます!
guest

0

ベストアンサー

質問がちゃんと理解できてない可能性がありますが・・・
あと、なんでこんなことしたいのか、よくわからないけど。

標準入力は、javaと標準入力でググってください。定番。
文字列から指定のインスタンスにアクセスするには、仕掛けが必要です。

java

1Map<String, Object> mp = new HashMap<>(); 2 3Shape shape = new Shape("Square"); 4Square square = new Square("Square",4); 5 6mp.put("shape", shape); 7mp.put("square", square); 8 9String key = "shape"; // 本来は標準入力から受け取った文字列 shapeに仮置き 10 11// ここから下は微妙なコード、本来は、m.ts10806さんの回答にある通りオーバーライドされてれば簡単に書ける。 12Object tmp = mp.get(key); 13 14String str = tmp != null ? tmp.toString() : "null"; 15 16// ここでは文字列で判定しているが、instanceOfでも可(自分で調べてください) 17double area; 18if ("shape".equals(key)) { 19 area = ((Shape)tmp).getArea(); 20} else if("square".equals(key)) { 21 area = ((Square)tmp).getArea(); 22} else { 23 area = -1; 24} 25 26System.out.println(str+" "+area); 27

普通は、ポリモーフィズムを用いるのでif文は、いりません。

java

1Map<String, Shape> mp = new HashMap<>(); 2 3中略 4 5Shape tmp = mp.get(key); 6 7String str = tmp != null ? tmp.toString() : "null"; 8double area = tmp != null ? tmp.getArea() : -1; 9 10System.out.println(str+" "+area);

投稿2020/05/17 04:32

編集2020/05/17 05:14
momon-ga

総合スコア4820

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

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

momon-ga

2020/05/17 04:37

そもそも、インスタンスを生成したいって話であれば、asahina1979 さんの回答を参考に。 いずれにせよ、ShapeクラスにgetAreaがない時点で面倒な作業は多いと思いますが。
ogiogimaru

2020/05/17 05:02

なるほど...文字列比較して条件分岐という手段もあるのですね...。 参考になります!
momon-ga

2020/05/17 05:05

いえ。普通しません・・・
ogiogimaru

2020/05/17 05:09

そうなんですか? 普通は別の方法があるのでしょうか。もしくはそもそもクラスのインスタンス名は標準入力しないということですか?
guest

0

ちゃんとオーバーライドをアノテーションで伝えないといけない気がします。
toString()をオーバーライドして自身の情報を親切に伝える
なぜアノテーション@overrideを書かなければいけないのか

投稿2020/05/16 06:37

編集2020/05/16 06:40
m.ts10806

総合スコア80850

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

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

m.ts10806

2020/05/16 07:00

あと、もっと簡単なコードで確かめた方が良いですね。こんなにたくさんクラス作ってはどこに問題があるか見えなくなります。
ogiogimaru

2020/05/16 07:13

オーバーライドする場合には@overraideは必須なんですね…。ありがとうございます。修正します。
m.ts10806

2020/05/16 07:24

>@overraide 名前が決まっているものは何であろうとコピペしてください。 ミスを防ぐ常套手段です。
m.ts10806

2020/05/16 07:24

もちろんそれだけで解決するかというとそうではないかもしれませんが、 「もっと簡単なコードで確かめるべき」を優先してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問