コンポジションについて

このQ&Aのポイント
  • コンストラクタと継承を使用せずにPersonクラスとそれを拡張したStudentクラスを表すプログラムの作成方法
  • 初心者向けの解決方法をご紹介します
  • コンポジションを利用して、name_とage_を持つPersonオブジェクトをStudentクラス内で使用する方法について説明します
回答を見る
  • ベストアンサー

コンポジションについて

public class Person{ public String name_ ; public int age_ ; public Person(){ name_ = "Asaya"; age_ = 61; } } public class Student{ public Person person_; public int grade_; public Student(){ person_.name_ = "Moto"; person_.age_ =2; grade_ = 0; } } public class SamConp1{ public static void main(String[] args){ Person person_ = new Person(); Student asaya_ = new Student(); System.out.println(asaya_.person_.name + asaya_.person_.age_+asaya_.grade__); } } 3つのプログラムを見るようにコンストラクタに引数を使わず、又継承を使わないでPerson クラスのname_ age_ それを拡張したStudetクラスのgrade_をmain関数で表したいのですが(希望としてはname_ "Moto" age_ 2 grade_ 0) 結果としては、 exception in thread "main" java.lang.nullpointerexception at student.<int>(Student.java:6) at SamConp1.main(SampConp1.java:4) となります。 まだ初心者で良く分りません。解決方法をお願いします。

  • Java
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • tom11
  • ベストアンサー率53% (134/251)
回答No.1

よく解りませんが、 とりあえず、コンパイル実行できるようにしました。 class Person { public String name_; public int age_; public Person() { name_ = "Asaya"; age_ = 61; } } class Student { public Person person_; public int grade_; public Student() { person_ = new Person(); person_.name_ = "Moto"; person_.age_ = 2; grade_ = 0; } } public class goo_test13 { public static void main(String[] args) { Student asaya_= new Student(); System.out.println(asaya_.person_.name_+" "+asaya_.person_.age_+" "+asaya_.grade_); } } 実行結果 Moto 2 0 作り方にもよるのですけど、 class Person、class Student はpublicを外しています。 一つのJavaファイルに書くと、外さないとエラーになります。

PHYOPHYO
質問者

お礼

ご回答ありがとうございました。引数のないコンストラクタでは分りましたが、今度は引数がある場合のコンポジションについて考えて見ましたが分りませんので、今度は引数がある場合について投稿しました。解決できましたらご回答願います。 ありがとうございました。

関連するQ&A

  • コンポジション コンストラクタに引数がある場合

    class Person{ public String name_; public int age_; public Person(String n,int a){ name_ = n; age_ = a; } } class Student{ public Person person_; public int grade_; public Student(Person p,int g){ person_ = new Person("MOTO",2); grade_ = g; } } public class Samconp2{ public static void main(String[] args){ Student asaya_ = new Student(p,0); } System.out.println(asaya_.person_.name+asaya_.person_.age_+asaya_.grade__); } 3のプログラムを見るようにコンストラクタに引数使い、又継承を使わないでPerson クラスのname_ age_ それを拡張したStudetクラスのgrade_をmain関数で表したいのですが(希望としてはname_ "Moto" age_ 2 grade_ 0) 結果としては、System.out.println(asaya_.personn_.name_ + asaya_.person_.age_ +asaya_grade_);で<identifierがありません>となります。 まだ初心者で良く分りません。解決方法をお願いします。

    • ベストアンサー
    • Java
  • クラスの拡張について

    Teacher クラスを変更し、newTeacher()の時は、名前「TARO」、年齢「25」、科目「国語」で初期化し、newTeacher(名前、年齢、科目)のときはそれぞれのパラメータでオブジェクトを作るようにしたい。 Person クラスのコンストラクタが使ってもかまわない という問題で //ClassRoom3.java class Person{ String name; int age; Person(String name,int age){ this.name = name; this.age = age; } void print(){ System.out.println("[Name]"+name); System.out.println("[age]"+age); } } class Teacher extends Person{ String subject; void print(){ System.out.println("私は"+name+" といいます。"); System.out.println("年齢は"+age+" 才です。"); System.out.println(subject+" を教えています。"); } } class ClassRoom3{ public static void main(String args[]){ Teacher obj1 = new Teacher(); Teacher obj2 = new Teacher("JIRO",27,"算数"); obj1.print(); System.out.println(); obj2.print(); } } /* 実行例 >java ClassRoom3 私は TARO といいます。 年齢は 25 才です。 国語 を教えています。 私は JIRO といいます。 年齢は 27 才です。 算数 を教えています。 */ という出力結果をだしたいのですが、なんどもやっても失敗してしまい。なかなかできません。 どう直したらよいのですか?

  • java 入力命令

    以下うまくどうさしません、教えてください。 public class Main { public static void main(String[] args){ System.out.println("名前"); String name = new java.util.Scanner(System.in) .nextLine(); System.out.println("年齢"); int age = new java.util.Scanner(System.in) .nextInt(); System.out.println (age + name); } }

  • 空白にはなにを入れればいいのでしょうか?

    [A君,50,60,70] -> 180 [Bさん,90,70,80] -> 240 [C君,30,40,45] -> 115 という3教科の試験の合計点を学生毎に表示するものですが、<?>の部分になんと書けばいいのかわかりません。。教えてください。 import java.lang.*; import java.io.*; import java.util.*; class Student { private String name; private int[] score; public Student (String name, int[] score){ this.name = name; this.score = score; } public Student(String name, int x, int y, int z){ this.score = new int[3]; } public String toString(){ String s = "[" + name; for (int i=0; i < score.length; i++){ s += “ , “ + score[1]; } s += "]"; return s; } public int total(){ int sum = 0; for (int i=0; i<<?>; i++){ <?> } return sum; } } class StudentTest { public static void main(String[] args){ Student[] data = { new Student("A君",50,60,70), new Student("Bさん",90,70,80), new Student("C君",30,40,45), }; for (int i=0; i<data.length; i++){ System.out.println("" + data[i] + "\t-> " + data[i].total()); } } }  

    • ベストアンサー
    • Java
  • C# override

    某C#の入門書のサンプルですが、overrideがよくわかりません。 using System; using System.Collections.Generic; using System.Text; namespace PersonList {   class Person   {     public string name;     public int age;     public Person(string nam, int ag)     {       name = nam;       age = ag;     }     public override string ToString()     {       return String.Format("{0}({1})", name, age);     }   }   class Program   {     static void Main(string[] args)     {       List<Person> p = new List<Person>();       p.Add(new Person("Pochi", 3));       p.Add(new Person("Kenta", 5));       p.Add(new Person("Mari", 4));       p.Add(new Person("Wanko", 1));       p.Add(new Person("Doggy", 4));       p.ForEach(Console.WriteLine);     }   } } 1.overrideをしないと 「PersonList.Person」が出力されてしまうのですが  なぜToString()をoverrideするのかがわかりません。 2.override しないですべての内容を出力するためにはどうしたら  いいのでしょうか?

  • JavaのArrays.sortについて教えてください

     Javaを勉強している初心者です。 次のプログラムはある学校のある学年の梅組の生徒5人のデータ(出席番号 no、氏名 name、身長 height)を 身長の低い順に並べ替えようとするものです。クラスMainでArrays.sort(ume);を実行するとどんな処理が行われるのか、またクラスStudentのメソッドcompareTo(Object o)はどう関係するのかご教示ください。 import java.util.Arrays; class Student implements Comparable { private int no; private String name; private double height; public Student(int no, String name, double height) { this.no = no; this.name = name; this.height = height; } public int compareTo(Object o) { double h1 = this.height; double h2 = ((Student)o).height; if(h1 == h2) { return 0; } else if(h1 > h2) { return 1; } else { return -1; } } } public class Main { public static void main(String[] args) { Student[] ume = new Student[5]; ume[0] = new Student(2, "木下 薫", 141.5); ume[1] = new Student(5, "湯水 敦", 145.0); ume[2] = new Student(1, "相田 徹", 152.5); ume[3] = new Student(4, "田中 大", 136.0); ume[4] = new Student(3, "橋 航", 145.0); Arrays.sort(ume); } }

  • スタックで成績表を作るプログラム。

    成績表を作りたい。Studentのクラスを要素とするクラスStackを完成させてプログラムが動作するようにせよという問題なのですがprivateの物をどうやって要素にすればよいのでしょうか? class Student { private int id; private String name; private int eng; private int math; private int kokugo; Student(int i,String nm,int e,int m,int k) { id=i;name=nm;eng=e;math=m;kokugo=k; } void show(){ System.out.println("("+id+","+name+","+ eng+","+ math+","+ kokugo+")"); } } class Stack { } class Sample { public static void main(String[] args) { Stack ss=new Stack(3); ss.push(new Student(1,"A",10,10,10)); ss.push(new Student(2,"B",20,10,10)); ss.push(new Student(3,"C",30,10,10)); ss.push(new Student(4,"D",40,10,10)); ss.pop(); ss.pop(); ss.pop(); ss.pop(); } }

    • ベストアンサー
    • Java
  • Vectorを用いた問題

    JAVAをはじめたばかりなのですが、以下の問題が分かりません。 Lessonクラス内のaddメソッドにおいてaddした結果が常に学籍番号の小さい順にソートしたいのですが、どうもVectorの使い方がわからず四苦八苦しております。 import java.util.Vector; class main { public static void main(String argv[]){ Lesson l = new Lesson("Kokugo","Tanaka",100); l.add(new Student("00005","Suzuki",100)); l.add(new Student("00002","Sato",64)); l.add(new Student("00003","Ito",43)); l.add(new Student("00007","Endo",92)); l.print(); } } class Lesson { private String name; // 課題名 private String teacher; // 担当者 private int max; // 最大履修者数 private int num; // 登録履修者数 Vector<Student> st; // Student class の配列 public Lesson(String l,String t,int n){ name=l; teacher=t; max=n; num=0; st=new Vector<Student>();// 配列の確保 } public boolean add(Student s){ if(num>=max){ return false;} else { if(num==0){st.insertElementAt(s,num++);} else{ for(int i=0;i<num;i++){ String p=(st.elementAt(i)).id; if(p.compareTo(s.id)>=0){ st.insertElementAt(s,i); } } } return true;} } public void print() { System.out.println("Lesson :"+name); System.out.println("Teacher :"+teacher); System.out.println("students:"+num); for(int i=0;i<num;i++){ st.elementAt(i).print_short(); } System.out.println(); System.out.println("----------"); } } class Student{ public String id; // 学籍番号 private String name; // 名前 private int grade; // 成績 Student(String i,String n, int g){ id=i; name=n; if(g<0)grade=0; else if (g>100) grade=100; else grade=g; } public void print_short() { System.out.println(id+","+name+","+grade); } } 実行結果 Lesson :Kokugo Teacher :Tanaka students:1 00002,Sato,64 ---------- 学籍番号の順にソートしたいのですが、どうやら学籍番号の一番小さいものしか表示されていないようです。どのようにしたらよいのか教えていただけないでしょうか?

    • ベストアンサー
    • Java
  • Javaのクラス作成について。

    現在、Javaで新規クラスを作成しています。 「String型の変数を受け取ってトリミングしてString型で返す」と言うプログラムを作成したいのですが、なかなかうまくいきません。 現在、考えているのは --- Trimming.java --- public class Trimming{ String new_id; public String TrimmingId(String id){ id = new_id; String idtrim = new_id.trim(); idtrim = id; return id; } } --- Test.java --- class Test{ public static void main(String[] args) { String id = " Trimming "; Trimming ID = new Trimming(); System.out.println(ID.TrimmingId(id)); } } --- 現在、出ているエラーは Exception in thread "main" java.lang.NullPointerException at Trimming.TrimmingId(Trimming.java:6) at Test2.main(Test2.java:6) です。 よろしくお願いします。

    • ベストアンサー
    • Java
  • javaのEclipseの問題がわからない

    Human.javaで記述されたクラスを継承し、継承したクラスをインスタンス化して、利用できるHumanクラスのメンバをすべて使用するプログラムを作成せよ。クラス名は、継承したクラスをPerson とし、そのクラスをインスタンス化するクラスをQuestion13_1として、実行結果も記述すること public class Human { private String name = "デフォルトの名前"; protected int age = 22; public int height = 170; final public int weight = 55; public String GetName(){ return name; } public void setName(String name){ this.name = name; } } 結果何を出せば良いのわかりません。

専門家に質問してみよう