クラス(class)とインスタンス(instance)

復習ー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を使って、生成したオブジェクトの数を出力しなさい
}