プログラミング 第11回 クラスとインスタンス [email protected] プログラミング第11回 1 Rectangle クラス(List 11-1, p.8) class Rectangle{ int width; int height; void setSize(int w, int h){ width=w; setSizeメソッド height=h; } int getArea(){ return width*height; getAreaメソッド } } プログラミング第11回 2 setSizeメソッド • void setSize(int w, int h) – メソッド定義のヘッダ – 戻り値なし(void),仮引数が w, h でいずれも int型。 プログラミング第11回 3 getAreaメソッド • int getArea() – メソッド定義のヘッダ – 戻り値がint型,引数はとらない。 プログラミング第11回 4 インスタンスの作り方 • new Rectangle() とするだけでよい。 • インスタンスを生成して終わりということは あまりないから, • Rectangle r=new Rectangle() • とすると以後,変数rがこのインスタンスへ のハンドル(参照)になる。 プログラミング第11回 5 フィールドへのアクセス • r.width = 123; • r.height = 45; • これでもよいし, • r.setSize(123,45); • でもよい。 プログラミング第11回 6 this はどのようなときに使うか void setSize(int width, int height){ this.width=width; this.height=height; } 仮引数とインスタンスのフィールド名を同じにすることで, 意味を共有できる。thisがつくとインスタンスのフィールド を参照していることになる。 プログラミング第11回 7 コンストラクタ class Rectangle{ int width; int height; Rectangle(int w, int h){ width=w; height=h; } void setSize(int w, int h){ width=w; height=h; } int getArea(){ } return width*height; } プログラミング第11回 8 インスタンスの初期化 • Rectangle r=new Rectangle(123, 45); •は • Rectangle r=new Rectangle(); • r.width=123; • r.height=45; • あるいは • Rectangle r=new Rectangle(); • r.setSize(123,45); • と同等。 プログラミング第11回 9 引数なしのコンストラクタ class Rectangle{ int width; int height; Rectangle(){ setSize(10,20); } Rectangle(int w, int h){width=w; height=h;} void setSize(int w, int h){ width=w;height=h; } int getArea(){return width*height;} } プログラミング第11回 10 mainメソッドを設けて自立する Rectangle.java(List 11-7,p.20) class Rectangle{ int width; int height; Rectangle(){ setSize(10,20); } Rectangle(int w, int h){ width=w; height=h; } プログラミング第11回 11 Rectangle.java (2) void setSize(int w, int h){ width=w; height=h; } int getArea(){ return width*height; } プログラミング第11回 12 Rectangle.java (3) public static void main(String[] args){ Rectangle r1=new Rectangle(); System.out.println("r1.width="+r1.width); System.out.println("r1.height="+r1.height); System.out.println( "r1.getArea()="+r1.getArea()); プログラミング第11回 13 Rectangle.java (4) Rectangle r2=new Rectangle(123,45); System.out.println("r2.width="+r2.width); System.out.println("r2.height="+r2.height); System.out.println( "r2.getArea()="+r2.getArea()); } } プログラミング第11回 14 実行結果 r1.width=10 r1.height=20 r1.getArea()=200 r2.width=123 r2.height=45 r2.getArea()=5535 プログラミング第11回 15 インスタンスはどこに • Rectangle r1; • と変数が宣言されてもインスタンスは生成されな い。 • r1=new Rectangle(); • のようにnew演算子が実行されて始めてインスタ ンスが生成され,ハンドル(参照,ポインタ)がr1 に代入される。 • インスタンスはheap領域に作られ,プログラマが この領域を直接アクセスすることはない。 • 変数はスタック領域に確保される。 プログラミング第11回 16 クラスフィールドとは • クラスの全インスタンスに関する情報をク ラスとして管理したいことがある。 • 例えば,インスタンスには生成順に通し番 号を与えたいときなど。 • インスタンス変数だけでは,この目的は達 成できない。 プログラミング第11回 17 Rectangle.java(new version) class Rectangle{ static int counter=0; int number; int width; int height; static int getCounter(){ return counter; } プログラミング第11回 18 Rectangle.java(2) Rectangle(){ setSize(10,20); number=counter; counter++; } Rectangle(int w, int h){ width=w; height=h; number=counter; counter++; } プログラミング第11回 19 Rectangle.java(3) void setSize(int w, int h){ width=w; height=h; } int getArea(){ return width*height; } プログラミング第11回 20 Rectangle.java (4) public static void main(String[] args){ Rectangle r1=new Rectangle(); System.out.println("r1.width="+r1.width); System.out.println( "r1.height="+r1.height); System.out.println( "r1.getArea()="+r1.getArea()); System.out.println( "r1.number="+r1.number); プログラミング第11回 21 Rectangle.java (5) Rectangle r2=new Rectangle(123,45); System.out.println("r2.width="+r2.width); System.out.println("r2.height="+r2.height); System.out.println( "r2.getArea()="+r2.getArea()); System.out.println("r2.number="+r2.number); System.out.println( "Rectangle.counter="+Rectangle.counter); } } プログラミング第11回 22 実行結果 r1.width=10 r1.height=20 r1.getArea()=200 r1.number=0 r2.width=123 r2.height=45 r2.getArea()=5535 r2.number=1 Rectangle.counter=2 プログラミング第11回 23 課題 • 問題11-5を正しく直して,コンパイル,実 行してみよ。 • 問題11-7 • 余裕があったら,問題11-6,8.9 • Rectangle.java(new version) を試してみよ。 プログラミング第11回 24
© Copyright 2024 ExpyDoc