JAVA初心者がオブジェクトの記述について質問

このQ&Aのポイント
  • JAVA初心者がオブジェクトの記述について質問しています。記述方法を試している中でエラーメッセージが出たり、出なかったりする現象に疑問を抱いています。
  • クラスの宣言やインスタンスの生成について、いくつかの例を挙げて説明しています。特に、main関数の中での記述方法について疑問を持っています。
  • C言語の経験からすると、エラーメッセージが出るべき場所で出ないなど、予想と異なる状況が生じていることに戸惑っています。理由を教えてください。
回答を見る
  • ベストアンサー

オブジェクトの記述(初歩的な質問です)

JAVA初心者。C言語を経験し、現在、 JAVA言語の記述方法を色々と試している所です。 (環境:Java SDK) さて。まず、以下の様なclassを宣言しました。 class Girl { String name ; double hight; double weight; Girl() { hight = 173.0 ; weight = 56.0 ; } } また、(同ファイル)別のクラスで class Sample15/* 例1 */ { Girl aiko ; aiko = new Girl() ; } としました所、「<identifier> がありません」というエラーメッセージが出ました。 しかし、以下の様な記述にすると…… class Sample15/* 例2 */ { Girl aiko = new Girl() ; } 何故か? エラーが出ません。しかし、 class Sample15/* 例3 */ { static void main(String[] args) { Girl aiko ; aiko = new Girl() ; } } とmain関数の中で/*例1*/のように記述すると、コンパイルが通りました。 これはどういう理由からなのでしょうか? (C言語等の経験からすると、なんだか釈然としません) 以上、よろしくお願いします。

  • No51
  • お礼率95% (198/208)
  • Java
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
  • hitomura
  • ベストアンサー率48% (325/664)
回答No.2

> 例1と例2は{}の中を「1行で書くか?2行で書くか?」 > の「書式の違い」だけだ、と思うのですが。 「『書式の違い』だけ」ではありません。 例1はaikoという名前のGirl型フィールドを定義し、その後でaikoに生成したGirlインスタンスの代入という処理を行おうとしています。しかし、例1の箇所では定義はできても処理は行えないためコンパイルエラーとなります。 その一方、例2はaikoという名前のGirl型フィールドを、Girl型インスタンスを生成して初期値とすることを含めて定義しています。実際にGirlインスタンスが生成されるのはSample15インスタンスを生成するときです。

No51
質問者

お礼

(1)「定義はしているが、メソッド内では無いので、代入処理は行えない」 (2)「初期値することを含めて、定義している」 こんな感じの理解でいいのでしょうか? ありがとうございました。

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

「<identifier> がありません」というエラーメッセージが出ました。 と書かれていますが, エラーメッセージには「どの行の」「どの辺に」エラーがあったのかを示すマーカもついているはずです. エラーは何行目のどの辺に出ていますか? それは本当にこの質問に挙げているところですか?

No51
質問者

お礼

その辺は何度も確認しました。 「<identifier> がありません、のエラーメッセージに惑わされたようです。 ありがとうございました。

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.1

C言語の学習経験がおありということですので、C言語の場合で以下の2つのコードの記述が可能かを考えてみてください。そうすれば例1のケースがエラーになっても不思議ではないことに納得がいくと思います。 (1) int g_value; g_value = 42; /* int g_value = 42; は問題ない */ (2) struct Sample15C { int value; value = 42; };

No51
質問者

お礼

ありがとうございます。 Tabが全部、消えてしまって、非常に見ずらいですね。 まず、書き直してみます。 例1: class Sample15/* × */ { Girl aiko ; aiko = new Girl() ; } 例2: class Sample15/* ○ */ { Girl aiko = new Girl() ; } 例1と例2は{}の中を「1行で書くか?2行で書くか?」 の「書式の違い」だけだ、と思うのですが。 しかし、それで結果が変わってしまうのは、 struct Sample15 { int i ; i = 0 ; } がNGなのに、 struct Sample15 { int i = 0 ; } なら、コンパイルを通ってしまうような「文法的な矛盾」を感じるのですが。

関連するQ&A

  • コンパイルエラー(匿名クラス)

    下記ソースがコンパイルエラーを起こしてどうしたらよいか分かりません。 下記エラー参照 Main.java:2: 型の開始が不正です。 new String(){ ^ Main.java:6: <identifier> がありません。 };ん。 (下記ソース) class NormalClass{ new String(){ public String ToString(int n){ return n + ""; } }; } class Main{ public static void main(String args[]){ NormalClass test = new NormalClass(); System.out.println(test.ToString(10)); } }

    • ベストアンサー
    • Java
  • classで、何故かString型の配列が使えず。

    以下の最終行のコードでコンパイルエラーとなります。 原因はわかりますでしょうか? (jdk1.7.0を使用)。 class Ctest { public static void main(String[] args) { System.out.println("Good Job!"); } } class Sample { String[] strArray = new String[10]; strArray[0] = "あいうえお"; } (エラーメッセージ) Ctest.java:13: エラー: ']'がありません strArray[0] = "あいうえお"; ^ Ctest.java:13: エラー: ';'がありません strArray[0] = "あいうえお"; ^ Ctest.java:13: エラー: 型の開始が不正です strArray[0] = "あいうえお"; ^ Ctest.java:13: エラー: <identifier>がありません strArray[0] = "あいうえお"; ^ エラー4個

    • ベストアンサー
    • Java
  • Javaの質問です。

    データに0より小さい数値がある場合、その行を取り除いて集計させ、エラーがある行だけを別ファイルに書きだしたいのですが、うまくいきません。 なにかアドバイスいただけますでしょうか? よろしくお願いします。 import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileWriter; import java.io.PrintWriter; class Data { double value; Data(double value) { this.value = value; } void setData(double value) { this.value = value; } public String toString() { return String.format("%5.1f", value); } } class Statistics { Data min = new Data(999.9); Data max = new Data(0.0); double total = 0.0; void add(double value) { if (min.value > value) { min.setData(value); } if (max.value < value) { max.setData(value); } total += value; } } class Category { String category; Statistics height = new Statistics(); Statistics weight = new Statistics(); Statistics bmi = new Statistics(); int num = 0; Category(String category) { this.category = category; } void add(double height, double weight) { this.height.add(height); this.weight.add(weight); this.bmi.add(weight / (height / 100.0 * height / 100.0)); num++; } public String toString() { return category + "," + "身長" + "," + "最高" + "," + height.max + "\n" + category + "," + "身長" + "," + "最低" + "," + height.min + "," + "\n" + category + "," + "身長" + "," + "平均" + "," + String.format("%5.1f\n", height.total / num) + category + "," + "体重" + "," + "最高" + "," + weight.max + "," + "\n" + category + "," + "体重" + "," + "最低" + "," + weight.min + "\n" + category + "," + "体重" + "," + "平均" + "," + String.format("%5.1f\n", weight.total / num) + category + "," + "BMI" + "," + "最高" + "," + bmi.max + "\n" + category + "," + "BMI" + "," + "最低" + "," + bmi.min + "\n" + category + "," + "BMI" + "," + "平均" + "," + String.format("%5.1f\n", bmi.total / num); } } class Health { Category male = new Category("男"); Category famale = new Category("女"); Category total = new Category("全体"); void add(String sex, double height, double weight) { if (sex.equals("男")) { male.add(height, weight); } else { famale.add(height, weight); } total.add(height, weight); } public String toString() { return "" + male + "\n" + famale + "\n" + total + "\n"; } } public class Main { static final String FILENAME = "hw.csv"; static final String SEPARATOR = ","; static final int SEX = 2, HEIGHT = 3, WEIGHT = 4; public static void main(String[] args) throws Exception { Health health = new Health(); String line; BufferedReader file = new BufferedReader(new FileReader(FILENAME)); for (int number = 1; (line = file.readLine()) != null; number++) { String[] item = line.split(SEPARATOR); try { if(Integer.parseInt(item[HEIGHT]) <= 0 || Integer.parseInt(item[WEIGHT]) <= 0 || item[HEIGHT] == null || item[WEIGHT] == null) { PrintWriter pw = new PrintWriter( new BufferedWriter (new FileWriter("out_error.csv"))); pw.println(number); pw.close(); health.add(item[SEX],Double.parseDouble(item[HEIGHT]),Double.parseDouble(item[WEIGHT])); } } catch (Exception e) { } } file.close(); PrintWriter pw = new PrintWriter( new BufferedWriter (new FileWriter("out.csv"))); pw.println(health); pw.close(); } }

  • 初歩的な質問ですみません。

    はじめまして。Javaの初心者です。 初歩的なことで、どうしてもわからないことがあります。 以下のような場合、 *************************************** class Oya { void func() { System.out.println("Oya"); } } class Ko extends Oya { Ko() { this.func(); } } class Main { public static void main(String[] args) { new Ko(); } } *************************************** Koクラスが初期化を完了していないのにもかかわらず func()メソッドを呼びさせてしまう理由がわかりません。なぜなのでしょうか?どうか教えてください。

    • ベストアンサー
    • Java
  • オブジェクトの関連について

    クラスAAAとクラスBBBをインスタンス化し、それぞれ、aとbのオブジェクトとします。 mainメソッドから、bのbmethメソッドを呼び出し、さらに、Amethメソッドを呼び出し また、mainからもaのAmethメソッドを呼び出し可能にする方法はありませんでしょうか? まだ、Java初心者なもので説明も不十分かと思いますがよろしくお願いします。 class AAA{ void Ameth() { System.out.println("Aメソッド"); } } class BBB{ public AAA a; void bmeth(){ a.Ameth(); } } public class test{ public static void main(String arg[]) { AAA a = new AAA(); BBB b = new BBB(); b.bmeth(); a.Ameth(); } }

  • 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
  • コンパイルエラー(Threadオブジェクト化)

    Runnableを継承したNormalClassをThreadとしてオブジェクト化しようとしているのですが、コンパイルエラーが出現して困っています。どうすればいいでしょうか? 下記エラー参照 Main.java:1: NormalClass は abstract でなく、java.lang.Runnable 内の abstract メソッド run() をオーバーライドしません。 下記ソース class NormalClass implements Runnable{ } class Main extends Thread{ public static void main(String args[]){ test = new Thread(new NormalClass()); } }

    • ベストアンサー
    • Java
  • オブジェクトクラスとオーバースライド

    Objectクラスを継承させてオーバースライドさせるプログラムを下記に作成したのですがSandaiクラスのオブジェクトstudent[1]の.student[1].inputNumber("09H999");が「シンボルが見つかりません」とエラーが表示されます。これはどこが足りないのですか?ご連絡をお願いします。 結果   student[0]: 身長: 180.2 cm, 体重: 70.3kg   student[0] はclass Personです   student[1]: 学籍番号:09H999, 身長: 168.3 cm, 体重: 55.2kg   student[1] はclass Sandaiです class Person { private double height, weight; public void inputData(double ht, double wt) { height = ht; weight = wt; } public void showData() { System.out.println("身長: " + height + "cm, 体重:"+ weight + "kg"); } } class Sandai extends Person { private String number; public void inputNumber(String num) { number=num; } public void showData() { System.out.print("学籍番号:"+number+", "); super.showData(); } } class K13_2 { public static void main(String args[]) { Person student[] = new Person[2]; student[0] = new Person(); student[0].inputData(180.2, 70.3); student[1] = new Sandai(); student[1].inputData(168.3, 55.2); student[1].inputNumber("09H999"); for(int i=0; i<student.length; i++){ System.out.print("student["+(i)+"]:"); student[i].showData(); Class c1 = student[i].getClass(); System.out.println("student["+(i)+"]は"+c1+"です。"); } } }

    • ベストアンサー
    • Java
  • かなり初歩的なプログラミング(Java)についての質問です。

    かなり初歩的なプログラミング(Java)についての質問です。 お恥ずかしながら、かなり初歩ではありますが躓いております・・・。 import java.util.Scanner; class OddEven{ public static void main(String args[]){ Scanner sc = new Scanner(System.in); System.out.println("整数を入力してください。"); String str1=sc.next(); int i = Integer.parseInt(str1); if(i%2==0){ System.out.println(i+"は偶数です。"); } else { System.out.println(i+"は奇数です。"); } } } } 以上のような内容なのですがコンパイルしようとすると 「OddEven.java:21: class、interface、または enum がありません。」 といったエラーがでます。 文法などは間違ってない!・・・と思うのですが・・・。 ご指摘していただきたいです。 あともう一つ質問です。じつはこっちが聞きたかったり・・・。 上記のソースコードを見ていただければわかると思いますが 「import java.util.Scanner;」 と最初の部分に記述していますが、これは授業で教師が教えてくれたもので手持ちの参考書では 「import java.io*;」 と記述されています。(もしかして今回のエラーもここから・・・?) この二つの違いは・・・聞いても正直分かりそうにはないので どっちを使っていけばいいか、などを教えていただきたいです。

    • ベストアンサー
    • Java
  • getInsets() メソッドの使い方について

    JAVA言語を勉強中の者です getInsets() メソッドでフレームの外周に空白部分を 作るのですが、その場合は以下のように   public Insets getInsets(){     return new Insets(40,10,10,10);   } とオーバーライドするとあります。 オーバーライドのみで外周に空白ができるのを確認できたのですが このオーバーライドされたメソッドをフレームのコンストラクター内等でgetInsets(); とメソッドを書かなければ, このメソッドはフレームに反映されなのではないかと考えているのですが、 実際は書かなくても外周の空白はきっちりととれます。 どうしてオーバーライドのみでこのメソッドは実行結果に反映されるのでしょうか。 よろしくお願いします   MyFrame(String ss){     .............     getInsets(); //この記述不要で動作します     .............   } 簡単なソースを記述しました import java.awt.*; public class Sample{   public static void main(String args[]){     MyFrame frame = new MyFrame("Sample.java");     frame.setSize(200,200);     frame.setVisible(true);   } } class MyFrame extends Frame{   Button b1, b2, b3, b4;   MyFrame(String ss){     super(ss);     setLocation(100,100);     setLayout(new GridLayout(2,2));     //getInsets(); この記述がないと外周空白はできないと考えています     add(b1=new Button("1"));     add(b2=new Button("2"));     add(b3=new Button("3"));     add(b4=new Button("4"));   }   public Insets getInsets(){     return new Insets(40,10,10,10);   } }

    • ベストアンサー
    • Java

専門家に質問してみよう