🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

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

Q&A

解決済

2回答

451閲覧

Object型配列にインスタンスの生成

tm.sato

総合スコア1

Java

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

0グッド

0クリップ

投稿2020/11/24 06:56

前提・実現したいこと

テキストファイルの行ごとに対応するオブジェクトを生成し、Object型配列に格納、中身を出力したいです。

test.txt

1数学,80,山田太郎 2英語,72,山田太郎 3数学,90,鈴木一郎

Test

1package test; 2import java.io.*; 3public class Test { 4 public static void main ( String[ ] args ) { 5 try { 6 File file = new File( "test.txt" ); 7 dataRoad( file ); 8 9 } catch ( IOException e ) { 10 } 11 } 12 13 public static void dataRoad ( File file ) throws IOException { 14 BufferedReader bufferedReader = new BufferedReader ( new InputStreamReader ( new FileInputStream ( file ), "UTF-8" )); 15 Object[ ] text = new Object[3]; 16 String textfile; 17 String[ ] splitLine = new String[3]; 18 int count = 0; 19 while (( textfile = bufferedReader.readLine() ) != null ) { 20 splitLine = textfile.split( ",", 0 ); 21 22 if ( splitLine[0].equals( "数学" )) { 23 text[count] = new Math( splitLine[1], splitLine[2] ); 24 } 25 else if ( splitLine[0].equals( "英語" )) { 26 text[count] = new English( splitLine[1], splitLine[2] ); 27 } 28 29 count++; 30 } 31 bufferedReader.close(); 32 System.out.println(text[0].toString()); 33 System.out.println(text[1].toString()); 34 System.out.println(text[2].toString()); 35 } 36 37}

Math

1package test; 2public class Math { 3 private static String score; 4 private static String name; 5 6 public Math ( String score, String name ) { 7 this.score = score; 8 this.name = name; 9 } 10 11 public String toString() { 12 return "点数=" + this.score + ", 氏名=" + this.name; 13 } 14 15}

English

1package test; 2public class English { 3 private static String score; 4 private static String name; 5 6 public English ( String score, String name ) { 7 this.score = score; 8 this.name = name; 9 } 10 11 public String toString() { 12 return "点数=" + this.score + ", 氏名=" + this.name; 13 } 14 15} 16

上記のTest.javaを実行すると以下のように出力されて欲しいのですが
点数=80, 氏名=山田太郎
点数=72, 氏名=山田太郎
点数=90, 氏名=鈴木一郎

実際には
点数=90, 氏名=鈴木一郎
点数=72, 氏名=山田太郎
点数=90, 氏名=鈴木一郎
と出力されてしまいます。

while文の中でString配列splitLineの要素を変更していることが原因と考えたのですが、それだと出力結果の2行目も点数=90, 氏名=鈴木一郎と出力されるのではないかと思いました。
なぜ同じclass型のオブジェクトの場合だけ、内容が最後に生成したオブジェクトのものに統一されてしまうのでしょうか。

わかりづらい質問かもしれませんが何卒よろしくおねがいします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

MathやEnglishのメンバ変数がstaticで宣言されています。Mathの新規インスタンスを生成する際に名前と点数を代入していますが、その代入先がインスタンスごとに独立しておらず、共通の変数に代入することになってしまいます。
当該staticを削除してください。

投稿2020/11/24 07:29

swordone

総合スコア20669

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

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

tm.sato

2020/11/24 07:35

ご回答ありがとうございます。staticの理解が乏しかったです。staticを削除すると上手く出力されました。ありがとうございました。
guest

0

Math/Englishname/scorestaticだからです

投稿2020/11/24 07:26

ozwk

総合スコア13551

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

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

tm.sato

2020/11/24 07:35

ご回答ありがとうございます。staticの理解が乏しかったです。staticを削除すると上手く出力されました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問