Javaの配列とクラスについてのエラー

このQ&Aのポイント
  • Javaの配列とクラスに関するエラーが発生しています。コンパイル時に「シンボルを見つけられません」というエラーメッセージが表示されます。
  • エラーの原因は、変数numがabstract_classのクラスに存在しないためです。コード内でvar[i].numという形式でnumを参照していますが、abstract_classはnumという変数を持っていません。
  • このエラーを解決するには、abstract_classにnum変数を追加するか、var[i]の実際のクラス(subclassA、subclassB、subclassC)にnum変数を追加する必要があります。
回答を見る
  • ベストアンサー

javaの配列とクラス

abstract class abstract_class{ } class subclassA extends abstract_class{ int num = 1; } class subclassB extends abstract_class{ int num = 2; } class subclassC extends abstract_class{ int num = 3; } class Main{ public static void main(String args[]){ int sum = 0; abstract_class var[] = new abstract_class[3]; var[0] = new subclassA(); var[1] = new subclassB(); var[2] = new subclassC(); for(int i=0;i<3;i++) sum += var[i].num; System.out.println(sum); } } これをコンパイルすると Main.java:23: シンボルを見つけられません。 シンボル: 変数 num 場所 : abstract_class の クラス for(int i=0;i<3;i++) sum += var[i].num; ^ エラー 1 個 というエラーが出るのはなぜでしょうか? var[i]はみなsubclassA,subclassB,subclassCが代入されているのに、numはabstract_classの変数となっています。 よくわかりません。 よろしくお願いします。

  • Java
  • 回答数3
  • ありがとう数0

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

var[] は abstract_class[] なので var[i] はabstract_classです。 abstract_class は num フィールドを持たないので エラーになります。 ちなみに、Javaのような「静的な型」の言語ではこのような場合は エラーになるのがお約束です。ダウンキャストが必要になります Javascriptやperlのような「動的な型」の言語では、 アクセスが可能です。

その他の回答 (2)

回答No.2

子供がみんな金持ってるからって、 親が金持ってるとは限らないでしょ?

  • phoenix343
  • ベストアンサー率15% (296/1946)
回答No.1

そりゃもちろん abstract_classにint numの宣言がないからですよ。 子のクラスにすべて同じ名前の変数があるからって その派生元のクラスにあるということにはなりません。

関連するQ&A

  • インターフェイス(独習JAVAのP234課題1について)

    インターフェイスの参照のコーディングについて質問です interface Locomotion{ void stop(); } interface Sound{ void beep(); } abstract class Robot{ } class RobotA extends Robot{ } class RobotA1 extends RobotA implements Sound{ public void beep(){ System.out.println("RobotA1: beep"); } } class RobotB extends Robot implements Locomotion{ public void stop(){ System.out.println("RobotB: stop"); } } class RobotC extends Robot implements Locomotion,Sound{ public void stop(){ System.out.println("RobotC: stop"); } public void beep(){ System.out.println("RobotC: beep"); } } class RobotType{ private final static int NUM = 4; public static void main(String args[]){ Robot robots[] = new Robots[NUM];     Robot robots[0] = new RobotA(); Robot robots[1] = new RobotA1(); Robot robots[2] = new RobotB(); Robot robots[3] = new RobotC(); //Soundインターフェイスを実装しているメソッドの呼び出し for(int i=0;i<NUM;i++){ if(robots[i] instanceof Sound){ Sound sound = (Sound)robots[i]; sound.beep(); } } for(int i=0;i<NUM;i++){ if(robots[i] instanceof Locomotion){ Locomotion locomotion = (Locomotion)robots[i]; locomotion.stop(); } } } } main処理でSoundインターフェイス等を参照する時に、 なぜ、Sound sound = (Sound)robots[i];の用に記述しないと駄目なのでしょうか? robots[i].beep();で参照できると思ったのですが、コンパイルエラーになってしまいます アドバイスよろしくお願い致します

  • Javaの文字列配列について質問です

    あは1行目の1つめです。 かは2行目の1つめです。 さは3行目の1つめです。 と表示させたいのですが、 Exception in thread "main" java.lang.NullPointerException at Nihongo.main(Nihongo.java:22) と出てきて出来ません。 どこが悪いのでしょうか? 22行目は「s[i].easyNihongo();」です。 class Hiragana { String boin; int num; int kaz; Hiragana(String b, int n, int k){ boin = b; num = n; kaz = k; } void easyNihongo(){ System.out.println(boin+"は"+num+"行目の"+kaz+"つ目です。"); } } class Nihongo{ public static void main(String [] args){ String aiueo[] = {"あ", "か", "さ"}; Hiragana [] s = new Hiragana[3]; for(int i=0; i<s.length; i++){ s[i] = new Hiragana(aiueo[i], 1, i++); s[i].easyNihongo(); } } }

    • ベストアンサー
    • Java
  • javaのローカル変数について

    基本的なことの質問ですがよろしくお願いいたします。 下記の様なソースコードでint y ;はローカル変数にあたると思いますが 確かローカル変数は初期化されないとコンパイルエラーになるはずなのですが どうもコンパイルも実行もできます。 どうしてでしょうか? よろしくお願いいたします。 class Test1{ static int x = 0; } public class Test extends Test1{ public static void main(String args[]){ Test i = new Test(); int y ; y = ++x; System.out.println( y ) ; } }

    • ベストアンサー
    • Java
  • 抽象クラスとオブジェクトを格納する配列(java)

    独習java第4版でわからない所があります。 abstract class Widget { String color; abstract int getMass(); public String toString() { return getClass().getName() + ": " + color + ", " + getMass(); } } class WidgetA extends Widget { final static int MASS = 4; WidgetA(String color) { this.color = color; } int getMass() { return MASS; } } class WidgetB extends Widget { final static int MASS = 1; WidgetB(String color) { this.color = color; } int getMass() { return MASS; } } class WidgetC extends Widget { final static int MASS = 5; WidgetC(String color) { this.color = color; } int getMass() { return MASS; } } class WidgetD extends Widget { final static int MASS = 17; WidgetD(String color) { this.color = color; } int getMass() { return MASS; } } class WidgetTypes { static int NUMWIDGETS = 6; public static void main(String args[]) { // 部品を格納する領域を宣言して割り当てる Widget widgets[] = new Widget[NUMWIDGETS]; // 部品を作成する widgets[0] = new WidgetC("Red"); widgets[1] = new WidgetA("Green"); widgets[2] = new WidgetD("Yellow"); widgets[3] = new WidgetB("Magenta"); widgets[4] = new WidgetA("Black"); widgets[5] = new WidgetC("White"); // 部品を処理する int totalMass = 0; for(int i = 0; i < NUMWIDGETS; i++) { Widget w = widgets[i]; System.out.println(w); totalMass += w.getMass(); } // 総重量を表示する System.out.println("Total mass = " + totalMass); } } これはある問題の解答ですが、僕にはどうしても理解出来ない部分があります。 mainのforループ内で Widget w = widgets[i]; totalMass += w.getMass(); となっています。 この仕組がわかりません。 まず Widget w = widgets[i] でWidget型の変数wにWidget型のwidget[i]を代入しているのにw.getMass()がエラーにならない理由がわかりません。(Widgetクラスは抽象クラスなのにwがWidgetクラスのインスタンスになっている?) これは 抽象メソッド( abstract int getMass() ) があるためでしょうか? ちなみにWidgetクラスとそのサブクラスからこの抽象メソッドを削除したらコンパイルエラーが出ました。 ではなぜ抽象クラスの抽象メソッドから、そのサブクラスのメソッドまで範囲が伸びるのでしょうか? どういう仕組でしょうか? この質問を書きながら思ったのですが、どうも配列の仕組みや抽象クラス・メソッドの仕組み、「オブジェクト」と「インスタンス」の違いがよくわかってないようです。 多分問題の本質はそこにあると思うんです。 駄文で申し訳ないです。 よろしくお願いします。

    • ベストアンサー
    • Java
  • javaプログラム 合ってるかお願いします

    プログラムは非常に苦手なため合ってないと思いますが、合ってないのは何が正解かを教えてください。 よろしくお願いします 1 ローカル変数を全て答えよ args,num 2 インスタンス変数を全て答えよ num 3 インスタンスメソッド名を答えよ Example2 4インスタンスメソッドを呼び出している行 public class Example2{ int num; public static viod main(String[] args){ Example2 ex2 = new Example2(5); int a = ex2.getNum(); System.out.println(a); } Example2(int num){ this.num=num; } int getNum(){ return this.num; } }

    • ベストアンサー
    • Java
  • コンパイル時のエラーについて

    Java超初心者の者です。 下記のコードどこか間違っていますか? class Sample4 { public static void main(String args[]) throws IOException { System.out.println("いくつまでの合計を求めますか?"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); int num = Integer.parseInt(str); int sum = 0; for(int i=1; i<=num; i++){ sum += i; } System.out.println("1から" + num + "までの合計は"      + sum + "です。"); } } テキスト通りに入力したつもりなのに何度確認して入力し直しても、 『'class'または'interface'がありません。』というエラーが 出てしまうのですが・・・ 色々ネットで検索して調べたのですが、分らなくて。

    • ベストアンサー
    • Java
  • 親クラスの型で子のオブジェクトを扱う

    ●下記のコードについての質問となります class Y { int num2 = 20; } class Z extends Y { int num3 = 30; } class Sample{ public static void main(String args[]){ --------------------------------------------- Y y1 = new Z(); --------------------------------------------- System.out.println(y1.num2); System.out.println(y1.num3); } } 「-----」で囲まれている部分になりますが、 親クラスの型で子のオブジェクトを扱おうと思うのですが、 「System.out.println(y1.num3);」 この部分において、コンパイルエラーとなります。 Zクラスから生成されたオブジェクトへの参照を Y型変数y1に代入していると思うのですが、 何故、「y1.num3」の値が表示されないのかを ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ お伺いしたいと思っております。 以上、宜しくお願い致します。

    • ベストアンサー
    • Java
  • 抽象クラス、インターフェイスについて

    少し長いですが、以下にコードを書きました。これでコンパイルすると、13個ほどエラーが出て、何がなんだかわかりません。何が間違っているのでしょうか?よろしくお願いします。ちなみに本を見ながらの独学です。 //のりものインターフェイス interface iVehicle { abstract void show(); } //車くらす class Car implements iVehicle { private int num; private double gas; public Car(int n, double g)) { num = n; gas = g; System.out.println("ナンバー" + num +"ガソリン量" + gas +"の車を作成しました"); } public void show() { System.out.println("車のナンバーは" + num +"です"); System.out.println("ガソリン量は" + gas +"です"); } } //飛行機クラス class Plane extends Vehicle { private int flight; public Plane(int f) { flight = f; System.out.println("便" + flight +"の飛行機を作成しました"); } public void show() { System.out.println("飛行機の便は" + flight +"です"); } } class sample8 { public static void main(String args[]) { iVehicle ivc[]; ivc = new iVehicle[2]; ivc[0] = new Car(1234, 20.5); ivc[1] = new Plane(232); for(int i=0; i<ivc.length; i++){ if(vc[i] instanceof Car) ivc[i].show(); } } }

    • ベストアンサー
    • Java
  • 配列で最大・最小値を求める

    import java.io.*; class Prog10_2 { public static void main(String args[])throws IOException { System.out.println("10個の整数を入力してください。"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int num[] = new int[10]; for(int i=0; i<num.length; i++){ String str = br.readLine(); int tmp = Integer.parseInt(str); num[i] = tmp; } int max = 0; int min = 0; for(int i=0; i<num.length; i++){ if(max < num[i]){ max = num[i]; } if(min > num[i]){ min = num[i]; } } System.out.println("最大値は"+max+"で、最小値は"+min+"です。"); } }   というコマンドを実行すると、最大値はちゃんと表示されるのですが、 最小値はいつも"0"しか表示されません。どこを修正すればいいのでしょうか? どなたか分かる方いらっしゃいましたら、よろしくお願いします。

    • ベストアンサー
    • Java
  • Javaで配列を定義する方法

    こんにちは、片岡といいます。 Java言語で配列を定義する場合、以下の二つの書式に違いはありますか。 違いがあるとすれば、どのような違いですか。 また、違いがないのならば、どちらの記述がよいのですか。 ご存知の方はいらっしゃいませんか。 (1) public class Main1 { public static void main(String[] args) { String str[] = new String[] { new String("itiban"), new String("niban"), new String("sanban"), }; for (int i = 0; i < str.length; i++ ) { System.out.println(str[i]); } } } (2) public class Main2 { public static void main(String[] args) { String str[] = { new String("itiban"), new String("niban"), new String("sanban"), }; for (int i = 0; i < str.length; i++ ) { System.out.println(str[i]); } } } なお、私の環境は以下の通りです。 OS: Microsoft Windows XP Professional SP2 java: java version "1.4.2_13" 検索エンジンで"配列 オブジェクト java"を検索しましたが、 解決に役立つ情報は見つかりませんでした。

    • ベストアンサー
    • Java

専門家に質問してみよう