復習ーI (General Review I) クラスとオブジェクトの概念 Concepts of class and object クラスの宣言とオブジェクトの生成 Definition of a class and creation of an object コンストラクタとメソッドのオーバーロー Constructor and method overloading インスタンスとクラスの変数とメソッド Instance and static/class variable & method スーパークラスとサブクラス Super-class and sub-class 継承とメソッドオーバーライド Inheritance and method overriding アクセス制御修飾子 Access control: default, public, private, protect 抽象クラスとインタフェース abstract class and interface クラス(class)とオブジェクト(object)/ インスタンス (instance) class object instance String Professor Hello Java Ohmori, Kunii Rectangle インスタンス(オブジェクト)は具体的な特定のもの 同じクラスのインスタンス(オブジェクト)は共通の 性質を持つ クラス宣言 – Definition of a class class クラス名 { 変数 (variable) の宣言 メソッド(method) の宣言 } 引数 arguments class Rectangle { // 長方形 int width; // 変数width(幅)の宣言 int height; // 変数height(高さ)の宣言 void setSize( int w, int h) { // setSizeメソッドの宣言 width = w; // width(幅)の設定 値を返さ height = h; // height(高さ)の設定 ない } int getArea() { // getAreaメソッドの宣言 return width * height; // 面積を計算して返す } } int型の値 を返す インスタンス(オブジェクト)の作り方 (create objects) 引数なし Rectangle r = new Rectangle(); r.width = 123; // r.setSize(123, 45);でもよい r.height = 45; メソッドの呼出し r new object reference 0 0 123 45 void setSize(int w, int h) { this.width = w; this.height = h; } 実引数 r.width r.height thisはインスタンス自身 r.setSize(123, 45)の呼 び出しの中では thisとrは同じ コンストラク(constructor) – create objects class Rectangle { .... Rectangle( ) { setSize(10, 20); } Rectangle(int w, int h) { width = w; // setSize(w, h);でも height = h; } .... } Rectangle r1 = new Rectangle(); Rectangle r2 = new Rectangle(12, 56); インスタンスを生成し 変数の初期化を行う メソッドとの違い ・コンストラクタの名前 はクラス名と同じ ・戻り値の型がない r1 10 20 r2 12 56 コンストラクタの多重定義 (overload) 名前は同じで引数の 型や個数が違う クラス変数(class variable / static variable) クラス変数 class Rectangle { .... static int counter = 0; インスタンス 変数 int number; Rectangle( ) { width=10; height=20; counter++; number = counter; Rectangle Rectangle.counter r1 r1.number 10 20 1 r2.number 10 20 2 r2 } } Rectangle r1 = new Rectangle(); Rectangle r2 = new Rectangle(); Rectangle r3 = new Rectangle(); インスタンス変数はインスタンスごと クラス変数はクラスに1つ、 can’t be accessed via object 3 r3 r1.counter (x) r2.counter (x) r2.number r3.counter (x) 10 20 3 クラスメソッド (class/static method) class Rectangle { クラス変数 .... static int counter = 0; クラス int number; メソッド .... static int getCounter( ) { インスタンス メソッド return counter;} int getArea() { return width*height; } .... } Rectangle r1 = new Rectangle(); int i = Rectangle.getCounter(); int j = r1.getArea(); Rectangle counter getCounter 3 Rectangle.counter Rectangle.getCounter() r1 number getArea r1.counter (X) r1.getCounter() (x) 10 20 1 インスタンスメソッドはインスタンスごと クラスメソッドはクラスに1つ(インスタンス変数に直接アクセスは不可) インスタンスメソッドとクラスメソッド instance method and class/static method class Rectangle { インスタンス int width; メソッド int height; …… int getArea( ) { return width * height; } static int getArea(Rectangle r ) { return r.width * r.height; } } Rectangle r1 = new Rectangle(); int a1 = r1.getArea(); Rectangle r2 = new Rectangle(); int a2 = Rectangle.getArea(r2); クラス メソッド final(定数) class Rectangle { final int INITIAL_WIDTH = 10; final int INITIAL_HEIGHT = 20; int width; int height; Rectangle( ) { width = INITIAL_WIDTH; height = INITIAL_HEIGHT; } .... } INITIAL_WIDTH = 10; //defined INITIAL_WIDTH = 100; // エラー 一般に finalと宣言されたものの内容 を変更することはできない。 ・final変数 (constant) finalと宣言された変数 に代入はできない。 すなわち、定数である。 ・finalメソッド finalと宣言されたメソッド をサブクラスで オーバーライドできない。 ・finalクラス finalと宣言されたクラス のサブクラスを作ること はできない。 スーパークラスとサブクラス(super class & subclass) class Rectangle { .... } class NamedRectangle extends Rectangle { .... } クラス階層 class hierarchy classA Rectangle スーパークラス classB classD NamedRectangle サブクラス classC classE classF 継承(inheritance) class Rectangle { int width; int height; void setSize(int w, int h) { .... int getArea( ) { .... } } class NamedRectangle extends Rectangle { .... } NamedRectangle nr = new NamedRectangle(); nr.setSize(123, 45); System.out.println(“width=“ + nr.width); サブクラスは スーパークラス の変数やメソッド を継承する スーパークラス の持つ変数や メソッドを サブクラスも 持っている スーパークラスとサブクラスのコンストラクタ Constructors in super class and subclass class Rectangle { コンストラクタは …… 継承されない Rectangle( ) { setSize(10, 20); スーパークラスの } コンストラクタの Rectangle(int w, int h) { setSize(w, h); } 呼出しには } super(...); を使う class NamedRectangle extends Rectangle { String name; NamedRectangle( ) { 自動的に super(); が挿入される name = “NO NAME”; 自分のクラスの } コンストラクタの NamedRectangle(String s, int w, int h ) { 呼出しには super(w, h); name = s; this(...); を使う } } スーパークラスのコンストラクタの呼出し 継承(is-a関係)と合成(has-a関係) class NamedRectangle extends Rectangle { String name; // width and height are inherited from Rectangle class NamedRectangle() { super(); name=“NO NAME”; } .….. } (すでに存在する)クラスの利用法 class NamedRectangle { ・継承(is-a関係) String name; そのクラスのサブクラスを作る Rectangle r; // has a rectangle サブクラスはスーパークラスの //object as a variable 性質を継承する NamedRectangle() { サブクラスはスーパークラスの r = new Rectangle(); 一種である name= “NO NAME”; ・合成(has-a関係) } そのクラスのインスタンスを持つ .... クラスを作る } メソッドのオーバーライド(上書き定義) class Rectangle { .... void setSize(int w, int h) { .... } // (1) void setSize() { .... } // (2) } class NamedRectangle extends Rectangle { .... void setSize(int w, int h) { .... } // (3) } オーバーライド (override) 継承したメソッド を変更する (名前も引数の 型と個数も同じ) 例: (1)を(3)で オーバーロード (overload) 同じ名前で引数 の型や個数が 違う。例: (1)と(2) Rectangle r = new Rectangle(); NamedRectangle nr = new NamedRectangle(); 多態性(多相性)polymorphism r.setSize(123, 45); // (1) 多様な型の値をとる。多様な型として見る nr.setSize(123, 45); // (3) r = nr; // Rectangleクラスとして見る。r.nameはエラー r.setSize(123, 45); //(3) 実行時に呼ばれるメソッドはインスタンスで決る private(アクセス制御/access control:情報隠蔽) class Rectangle { private int width; private int height; void setSize(int w, int h) { width = w; height = h; } int getWidth() { return width; } int getHeight() { return height; } } class NamedRectangle extends Rectangle { .... int i = width; // コンパイルエラー int j = getHeight(); // ok } privateと宣言されているものは 他のクラスから(サブクラスからも) 直接は使えない(アクセスできない) アクセス メソッド (アクセス 用の メソッド) public: どのクラス からも アクセス できる protected: サブクラス及び 同じpackage内のクラス 以外からはアクセスできない 宣言がなければprotected 抽象クラス (abstract class) abstract class Shape{ 抽象クラス宣言の キーワード 抽象メソッド宣言 のキーワード public double x, y; public Shape(double x, double y) { this.x = x; this.y = y;} abstract String getName(); } Public class Rectangle extends Shape{ double w, h; Rectangle(double x, double y, class Test1{ public static void main(String args[]){ Shape s1 = new Rectangle(2, 5, 10, 20); double w, double h { super(x,y); this.w=w;this.h=h; } String getName(){return “Rectangle”;} } 抽象メソッドの再定義 sysetm.out.println(“s1=“+s1.getName()); } メソッドの呼び出し Output: s1=Rectangle 実行時に呼ばれるメソッ ドはインスタンスで決る インタフェース (interface) final (定数)キーワード を省略する interface Calculation{ double PI = 3.14; インタフェーす宣 言のキーワード public abstract class Shape{ public double x, y; double area(); public Shape(double x, double y) { this.x = x; this.y = y;} } public abstract String getName(); 抽象メソッド宣言 のキーワードを 省略する } インタフェー スの実装 public class Rectangle extends Shape implements Calculation{ サブクラスの コンストラクタ public class Test2{ public static void main(String args[]){ public double w, h; Rectangle r1 = new Rectangle(100, 100, 10, 20); public Rectangle(double x, double y, double w, double h){ Shape s1 = r1; super(x, y); this.w = w; this.h = h; Calculation c1 = r1; } System.out.println(“This object r1 is a ” + s1.getName() + public String getName(){ return “Rectangle”; } “, area = ” + c1.area()); public double area(){ return w*h; } } } } 抽象メソッド の再定義 インタフェース の使い方 出力: This object r1 is a Rectangle, area = 200.0 メソッドの 呼び出し 課題 (Exercise) 1. 次のクラスの宣言を完成しなさい。 class Rectangle{ private int width; private int height; private int number; static int counter=0; Rectangle(){ ??? } Rectangle(int w, int h){ ??? } void setSize(int w, int h){ ??? } int getWidth() { ??? } int getHeight() {??? } int getArea() { ??? } public String toString(){ ??? // number,width, height, area } } 2. 次のサブクラスの宣言を完成しなさい。 class NamedRectangle extends Rectangle{ String name; NamedRectangle(){ ??? // no name } NamedRectangle(String s, int w, int h){ ??? } void scaleSize(int s){ ??? //拡大又は縮小 s 倍 } public String toString(){ ??? //name, number, width, height, area を出力 } } 3. RectangleとNamedRectangleのいくつかのオブジェクトの生成と生成したオブジェクトの出 力のJava application プログラムを作成しなさい。 public class RectangleCreationApplication { ??? // main メソッド ??? // Rectangle() コンストラクタ 使って、 Rectangleのオブジェクトを生成します ??? // Rectangle(int w, int h) コンストラクタ 使って、 Rectangleのオブジェクトを生成します ??? // NameRectangle() コンストラクタ 使って、 NamedRectangleのオブジェクトを生成します ??? // NamedRectangle オブジェクトを二倍で拡大します ??? // NamedRectangle(String s, int w, int h)コンストラクタ 使って、 Rectangleのオブジェクトを生成します ??? // 生成したオブジェクトを出力しなさい ??? // static変数counterを使って、生成したオブジェクトの数を出力しなさい }
© Copyright 2024 ExpyDoc