Javaの資料
知識科学教育研究センター
金井 秀明
内容
K227の資料です.
高橋「やさしい
Java」の基づいてま
す.
実習の準備#1
電算室のPCにloginする.
ユーザ名: 各自のユーザアカウント パスワード: 各自のパスワードサーバへリモートデスクトップ接続する.
コンピュータ名:ts-ksc-0.jaist.ac.jp実習の準備#2
Java言語
プログラミング言語の1つ
1995年Sun Microsystemsが発表
特徴
オブジェクト指向言語
マルチプラットフォーム(Write once, run anywhere)
Javaの実行の流れ
Javaソー スコード バイトコード コンパイラ javac インタプリタ java 実行Javaソースコード
ソースコード:テキスト形式のプログラム
例)ファイル名:Sample1.java
class Sample1 {
public static void main (String args[])
{
System.out.println(”ようこそJavaへ!”);
コンパイル
コンパイル:ソースコードをバイトコード
に変換すること.
コンパイラー:コンパイルするためのソフ
トウェア(javac)
例)Sample1.javaをコンパイルする.
コンパイルの後
コンパイル後に生成されるファイルのこ
とを「クラスファイル」とよぶ.
例)Sample1.javaをコンパイルした後
Sample1.classというファイルが生成され る.プログラムの実行
例)Sample1.javaを実行する.
例)Sample1.javaの実行結果
実習の準備#1
電算室のPCにloginする.
ユーザ名: 各自のユーザアカウント パスワード: 各自のパスワード
実習の準備 #2
Javaコードの編集
エディタ(ワードパッド,メモ帳など)を使う
Javaコードのコンパイル&実行
実習の準備#3
Java環境(コンパイラなど)の整備
Java環境のDownload 環境変数「PATH」の設定(例えば) 環境変数「CLASSPATH」の設定(場合によって) C:¥Program Files¥Java¥jdk1.5.0_06¥bin; http://java.sun.com/j2se/1.5.0/ja/download.html .;例
// 画面に文字を出力するコード class Sample1
{
public static void main (String args[]) {
System.out.println(”ようこそJavaへ!”);
System.out.println(”Javaをはじめましょう”); }
コードの要素
クラス名「Smaple1」:プログラムグロック
の基本単位,ファイル名
main()メソッド:プログラムの処理が始まる
「{ }」で囲まれた部分:ブロック
文:1つの処理の単位,文の最後は「;」で
終わる.
リテラル
Javaのコードないで,特定の文字や数値の
表記のこと.
いわゆる,定数のこと
種類
文字リテラル: a か 文字列リテラル: JAIST 金井例題
以下のように,画面上に表示するプロ
グラムを作成する.
変数とは?
文字列や数値を保存するための場所
何かを入れておく「箱」のようなもの
その箱に対する操作
箱を作る(変数宣言) 箱に値を入れる(代入)箱を作る:変数宣言
箱に名前をつける
英数字,「_」等 Javaの予約語は使っては駄目(class return...) 数字で始まっては駄目箱の種類(大きさ)を指定する
箱の種類:変数の型
型 記憶できる値の範囲 整数 byte 1バイト(-27∼+27-1) short 2バイト(-215∼+215-1) int 4バイト(-231∼+231-1) long 8バイト(-263∼+263-1) 浮動小数点 float 4バイト単精度浮動小数点 double 8バイト倍精度浮動小数点 文字 char 2バイト文字データ(1文字)Javaでの変数宣言
文法
例:
型名 変数名; 型名 変数名1, 変数名2, , ; int number; char c;箱に値を入れる:代入
文法
例:
変数名=式; number = 10; c = ‘金’; f1 = 1.41;変数宣言かつ代入:
変数の初期化
文法
例:
型 変数名=式; 型 変数名1=式1, ...,変数名n=式n; int number = 10;箱の値を見る:参照
文法
例:
変数名 int number = 10; System.out.println(number);その他の操作
変数の値の変更する
他の変数の値を代入する
double f1 = 3.14, f2=0.9; int number = 10; System.out.println(number); number = 30; System.out.println(number);型変換:1
大きなサイズの型の変数に,小さなサイ
ズの型の値を代入する場合:
例:
自動的に,型変換が行われる.
int num = 10; double d = num; System.out.println(num); System.out.println(d); 10 10.0型変換:2
小さなサイズの型の変数に,大きなサイ
ズの型の値を代入する場合:
例:
明示的に,型変換の操作(キャスト)を
書いておく
double pi = 3.14;型変換:まとめ
小
大
小
大
キャストする
Javaにおける「式」
演算子とオペランドの組合わせ.
演算子(operator):演算するもの オペランド(operand):演算対象例:
1 + 2 オペランド オペランド 演算子「式」の評価
式を計算すること.
ただし,ここでの「計算」は,算術演算だ 1 + 2 3 評価演算子:1
算術演算子
加算(+),減算(ー),乗算(*),除 算(/),剰余算(%),インクリメント (++),デクリメント(ーー)代入演算子:=
代入演算子のバリエーション:+=,ー =,*=,/=,...算術演算での注意
異なる型どうしの演算では,
例:
一方のオペランドを大きなサイズの型に
変換してから演算を行う.
int d = 2; double pi = 3.14; 6.28練習1
半径10センチの円周と円の面積を求める
プログラムを作成する.
円周=2*半径*円周率 円の面積=半径*半径*円周率 円周率=3.14練習2
次のプログラムの実行結果を示せ
public class rensyu2 {
public static void main(String args[]) {
System.out.println(5/2*3);
System.out.println(5/2*3.0);
System.out.println(5.0/2*3);
System.out.println(5/2.0*3);
演算子:2
関係(比較)演算子
等価(==),不等価(!=),より大き い(>),より小さい(<),以上(= >),以下(<=)論理(条件)演算子
論理積(&&),論理和(||),NOT (!)ビット演算子
補足:演算子1
インクリメント・デクリメント演算子
演算子 使用例 説明 ++ i ++ 変数iの値を返してから,1を加算する ++i 変数iに1を加算し,その値を返す --i-- 変数iの値を返してから,1減算する --i 変数iから1を減算し,その値を返す補足:演算子2
複合代入演算子
演算子 使用例 等価な式 += a += 2 a = a + 2 -= a -= 3 a = a - 3 *= a *= 2 a = a * 2 /= a /= 10 a = a / 10 %= a %= 5 a = a % 5キーボードからの入力
import java.io.*;
public class クラス名 {
public static void main(String args[]) throws IOException {
...
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
System.out.println(str +”が入力されました.”);
練習3
次のように画面上に出力するプログラ
ムを記述せよ.
What is your name ? Hideaki
整数の入力
import java.io.*;
public class クラス名 {
public static void main(String args[]) throws IOException {
...
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
int num =Integer.parseInt(str);
System.out.println(num +”が入力されました.”);
文字列を他の型に変換
文字列をint型に変換
文字列をdouble型に変換
int num = Interger.parseInt(str);
練習4
半径rをキーボードから入力し,その円周
と円の面積を求めるプログラムを作成す
る.
円周=2*半径*円周率 円の面積=半径*半径*円周率 円周率=3.142つ以上の入力
import java.io.*;
class test1 {
public static void main(String args[]) throws IOException {
...
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
String str1 = br.readLine();
String str2 = br.readLine();
System.out.println(“最初に”+str1+”が入力されました.”);
練習5
台形の面積を求めるプログラムを作成する.
プログラムの基礎構造
順次構造:
記述した順番に処理が実行される構造選択構造:
特定の状況に応じて,特定の処理が実行さ れる構造反復構造
選択構造
特定の状況に応じて,特定の処理が実
行される.
その状況の記述=条件文
例:試験の点数が60点未満の場合 YES(真, true):落第する. NO (偽, false):合格する. 処理1 条件 処理2 YES NO条件文
条件記述には,「関係演算子」,「論
理演算子」が使われる.
評価 > 点数 60 true 評価 < 点数 60 false演算子:2
関係(比較)演算子
等価(==),不等価(!=),より大き い(>),より小さい(<),以上(= >),以下(<=)論理(条件)演算子
論理積(&&),論理和(||),NOT関係演算子
演算子 式がtrueとなる場合 == 左辺と右辺が等しい != 左辺と右辺が等しくない > 左辺が右辺より大きい >= 左辺が右辺より大きいか等しい < 左辺が右辺より小さい <= 左辺が右辺より小さいか等しいif文
1つの文を処理する場合
複数の文を処理する場合
if(条件) { � 文; } if(条件) { 文1; 文2; 条件 文1 false true 条件 文 false trueif∼else文
ifの条件が偽(false)のときにも,何
らかの処理をしたいとき.
if(条件) { 文1; } else { 文2; } if(条件) { 文1; � ... } else { 文2; ... 条件 文1 false true ... 文2 ...if∼else if ∼else
2つ以上の条件を判
定させ,処理をし
たいとき.
if(条件1) { 文1; � ... } else if (条件2) { 文2; ... } ... else { 条件2 文2 false 文 false 条件1 true 文1 true複雑な条件判断
論理積 (&&):(条件1)かつ(条件2)
天気が晴れ,かつ,時間があれば, ーー>外に遊びに行く論理和 (¦¦):(条件1)または(条件2)
天気が晴れ,または,時間があれば, ーー>外に遊びに行く論理演算子
演算子 条件がtrueとなる場合
&& 左辺と右辺がともにtrueの場合
|| 左辺と右辺のどちらかがtrueの場合
! 右辺がfalseの場合
if (num !=1 && num != 2){}
if (num ==1 || num ==2 || num =3) {} if (!(num ==1)) {}
switch文
選択肢から1つを選んで実行する.
値は数値,文字.
if文と同じことができる.
switch(式) { case 値1: � 文1 break; case 値2: 文2 break; default: 文; case2 文2 false 文 false case1 true 文1 true default: break: break:繰返し処理
for
while
do∼while
処理の流れを変更する文
breakfor文
for (初期式; 条件式; 変化のための式) { � 文; � ... } 条件 文 false true forforの例
class test {
� public static void main(String args[]) {
� for (int i = 1; i < 4; i++) {
� System.out.println(i); } } } 1 2
for文のネスト
for (初期式1; 条件式1; 変化のための式1) { � ... for (初期式2; 条件式2; 変化のための式2) { � ... � } }for (int i = 0; i < 3; i++) {
� for (int j = 1; j < 3; j++) {
while文
条件がtrueである
限り,文を繰り返
し処理する.
while(条件) { 文; ... } 条件 文 false true whilefor文とwhile文:1
条件 文 false true while 条件 文 false true forfor文
while文
for文とwhile文:2
for文
while文
int i=1; while (i < 4) { � System.out.println(i); � i++; }for(int i=1; i<4; i++) {
� System.out.println(i);
do∼while文
条件を判断する前
に,文の処理が行
われる.
最低1回
は文の処理が行わ
れる.
do { � 文; ... } while(条件); int i=1; do { � System.out.println(i);whileとdo∼while:1
条件 文 false true whilewhile文
do∼while文
条件 false true while 文 dowhileとdo∼while:2
int i=1; do { � System.out.println(i); � i++;while文
int i=1; while (i < 4) { � System.out.println(i); � i++; }do∼while文
break文
処理の流れを強制終了し,ブロックから抜
ける.
int i=1; while (true) { � if (i == 4) break; � System.out.println(i); � i++;continue文
繰り返しの内の処理をスキップし,ブ
ロックの最初に戻り,次の処理を続け
る.
for (i = 1; i < 4; i++) { � if (i == 2) continue; � System.out.println(i);配列とは?
変数に整理番号を付けて並べたもの.
変数の「箱」の列
同じ型の値を複数まとめて記憶する.
配列にまつわる操作
配列の宣言 配列の要素の確保 変数 A復習:変数とは?
文字列や数値を保存するための場所
何かを入れておく「箱」のようなもの
その箱に対する操作
箱を作る(変数宣言) 箱に値を入れる(代入)復習:変数のときは
変数を作る(宣言)
int i;変数に入れる(代入・初期化)
i = 1;変数の中身を見る(参照)
配列の宣言等
配列の宣言:箱の種類を指定する
型名 配列変数名[];
int ten[]; or int [] ten;
要素の確保:箱の数を指定する
配列変数名 = new 型名 [要素数]; ten = new int[3];
配列の宣言等
配列の宣言と要素の確保:箱の種類とそ
の数を指定する.
型名 配列変数名[] = new 型名[要素数]; int ten[] = new int[4];
配列の要素に代入
配列変数名[添字] = 式; ten[0] = 90; ten[1] = 80; ten[2] = 70; ten[3] = 60; ten[0] 90 ten[1] 80 ten[2] 70 ten[3] 60配列の宣言等
配列の宣言,要素の確保,値の代入
型名 配列変数名[] = {値1, 値2, ...} int ten[] ={90, 80, 70, 60};
配列の要素の参照
配列変数名[添字] ten[2];
配列の要素と変数の比較
int[]型の変数 int型の変数
宣言 int ten[]; or int [] ten; int i, j, k;
確保 ten = new int[3]; 不要
代入 ten[0] = 90; ten[1] = 80; ten[2] = 70; i = 90; j = 80; k = 70; System.out.println(ten[0]); System.out.println(i);
多次元配列
1次元配列:一列の箱
多次元配列:2次元以上に箱が並ぶ
2次元配列:表のイメージ 3次元配列:立体のイメージ (X軸, Y軸, Z軸) 1次元配列 2次元配列ten[0][0] ten[0][1] ten[0][2] ten[1][0] ten[2][0] ten[1][1] ten[2][1] ten[1][2] ten[2][2]
多次元配列の準備
宣言
型名 配列変数名[][]; int ten[][];要素の確保
配列変数名 = new 型名[要素数][要素数]; ten[][] = new int[3][3];値の代入と参照
値の代入
値の参照
ten[0][1]; ten[1][2]; int ten[][] = {{90, 80, 70}, {20, 40, 80}. {40, 30, 80}};配列の長さ
配列変数名.length
例:1次元配列
int a[] = {10, 20, 30} a.lengthは3例:2次元配列
int ten[3][2] ten[0][0] ten[0][1] ten[1][0] ten[1][1]補足
要素数が一定でない配列
ten.lengthは3 ten[0].lengthは3 ten[1].lengthは2 ten[2].lengthは1ten[0][0] ten[0][1] ten[0][2] ten[1][0]
ten[2][0]
オブジェクト指向
Javaはオブジェクト指向言語
オブジェクト指向:オブジェクトをプ
ログラミングの中心に置き,オブジェ
クトを記述すること.
従来の手続き型言語:手続きをプログ
ラミングの中心に置き....
クラスとオブジェクト
クラス:同じ特性
をもつモノの集合
に名前を付けたも
の.オブジェクト
の特性を抽象化し
たもの.
オブジェクト(イ
フィールドとメソッド
フィールド:クラスの「性質」(属性)
(それは何か?)
メソッド:クラスの「機能」,操作,手
続き.(それをどうするのか?)
クラス「科目」の例
フィールド:科目名,成績,...
オブジェクト(インスタンス):
「Javaプログラミング,80点」
メソッド:科目名や成績を表示する
(toStringメソッド)
クラスの宣言
class クラス名 { � 型名 フィールド名1; � 型名 フィールド名2; ...; � 戻り値型名 メソッド名(引数リスト) { � ...; � } � ...; }クラス「Car」の例
class Car { � int num; // ナンバープレート番号 � double gas; //ガソリン量 }�オブジェクトの作成
オブジェクトを扱う変数を宣言する.
オブジェクトを作成し,その変数を扱え
るようにする.
Car car1;
car1 = new Car();
クラス名 変数名 クラス名 変数名= new クラス名
フィールドの参照
オブジェクトをさす変数名.フィールド名
Car car1 = new Car(); Car car2 = new Car();
car1.num = 1234; car1.gas = 20.5; car2.num = 2344; car2.gas = 100.5;
System.out.println(car1.num+ + car1.gas); System.out.println(car2.num + + car2.gas);
メソッド
class クラス名 { � 型名 フィールド名1; � 型名 フィールド名2; � ...; � 戻り値型名 メソッド名(引数リスト) { � ...; � } � ...; }メソッドの例
「車クラスのフィールド値を出力する」
class Car { � int num; // ナンバープレート番号 � double gas; //ガソリン量 � � void show() { � System.out.println( ナンバーは +num); � System.out.println( ガソリン量は +num);メソッドの呼び出し
Car car1 = new Car(); Car car2 = new Car();
car1.num = 1234; car1.gas = 20.5; car2.num = 2344; car2.gas = 100.5; car1.show();
メソッドの引数
引数:メソッドに何らかの情報(値)を
渡すとき使う.その情報のこと.
class Car {
int num; double gas; void setNum(int n) {
� num =n;
� }
class test {
public static void main(...
� int number = 2344;
� Car car1 = new Car();
� Car car2 = new Car();
� car1.setNum(1234);
メソッドの戻り値
戻り値:メソッドから返される情報(値)
戻り値型名 メソッド名(引数リスト) { � ...; � return 式; } int getNum() { � System.out.println( ナンバーの値を戻す ); � return num; }カプセル化
フィールドとメソッド
を一体化してクラスを
定義し,クラス内の細
かい仕様や構造を外部
から隠す.
クラス外からは許可さ
れた方法でしかフィー
カプセル化の利点
オブジェクト内部の仕様の変更が外のプロ
グラム対して影響しなくなる.
保守性が高まりプログラムの再利用が簡単
に行えるようになる.
メンバへのアクセス制限
private:クラスの外からアクセスできない
public:クラスの外からアクセスできる
フィールド メソッド privateメンバ publicメンバメソッドのオーバーロード
同じメソッド名で複数のメソッドを宣言
できる.(多重定義)
各メソッドの引数の型と個数を異なるよ
うに定義する必要がある.
例:Carクラスに値を代入するメソッド
setCar (int n) //ナンバーの値を代入 setCar(double g) //ガソリン量の値を代入コンストラクタ
クラスのオブジェクトが作成されたと
きに,オブジェクトの初期化をする仕
組み.
普通,オブジェクトのメンバに自動的
に初期値を設定するために使われる.
ただし,コンストラクタを省略しても,引 数のないデフォルトコンストラクタが自動コンストラクタ
メソッドとの相違点
コンストラクタには戻り 型がない. コンストラクタの名前は クラス名と同じ.メソッド同様オーバー
class Car {� private int num;
� ...; � public Car() { � ...; � } � public Car(int ...) { � ...; � }
インスタンス変数とクラス変数
インスタンス変数(インスタンス
フィールド)
通常のフィールドクラス変数(クラスフィールド)
static という修飾子が変数宣言につくインスタンス変数とクラス変数
インスタンス変数 (インスタンスフィールド) オブジェクト(インスタン ス)ごとに,情報を保持 クラス変数 (クラスフィールド) クラス全体でその情報を保持クラスメソッド
static という修飾子がつけられる.
クラスメソッド内では,thisは使えな
い.
クラスライブラリ
ある特定の機能を持ったプログラムを,
クラスとして部品化,関連する複数のク
ラスを1つのファイルにまとめたもの.
Javaでは,たくさんのクラスが用意さ
れている.
http://java.sun.com/j2se/1.5.0/ja/docs/クラスライブラリの例
Stringクラス(文字列を扱う)
Mathクラス(数学的な計算を扱う)
...
クラス型変数
car1とcar2は同じオブジェクトをさし
ている.
car1のフィールドの値を変更すると,car2の 対応するフィールドの値も変更される.変数の場合は異なるものをさしている.
Car car1 = new Car(); Car car2;
int i = 10; int ii;
オブジェクトの配列
複数のオブジェクトをまとめて扱うため
につかう.
配列を準備
オブジェクトを作成し,その配列の要素に代入 int test[]= new int[5];
test[0]=80;
Car cars[]=new Car[3] cars[1]= new Car();
内容
継承
メンバーへのアクセス
オーバーライド
継承
あるクラスの属性(データ)と機能(メ
ソッド)を土台にして,新しいクラスを作
ること.
土台となるクラス=スーパ(親)クラス 新しいクラス=サブ(子)クラスJavaでは,単一継承だけ
クラスの継承
class サブクラス名 extends スーパークラス名{ � 型名 フィールド名1; � ...; � 戻り値型名 メソッド名(引数リスト) { � ...; � } � ...; }継承の例:属性
class Car {
� int num; // ナンバープレート番号
� double gas; //ガソリン量
}�
class RacingCar extends Car {
� int course; // コース番号
スーパークラス「Car」
サブクラスのオブジェクトの作成
いままでのオブジェクトの作成と同じ.
オブジェクトを作成し,その変数を扱え
るようにする.
RacingCar rccar1; クラス名 変数名 変数名= new クラス名 クラス名 変数名= new クラス名 RacingCar rccar1サブクラスのオブジェクトの作成
最初に,スーパクラスのコンストラク
タが自動的に呼び出される.
指定しない:
引数なしのコンストラクタが呼び出される.指定:
super(引数リスト)より,呼び出すコンス トラクタを指定できる.サブクラスのオブジェクトの作成
どのコンストラクタを使うか指定がな
いとき:
最初に,「スーパクラスの引数なしのコンス トラクタ」を呼び出す.指定:
super(引数リスト) によって,どのコン ストラクタを呼び出すか指定できる.メンバへのアクセス
private:
同一クラス内からのアクセスのみ可能protected:
同一クラス内,そのサブクラスからのアクセ スが可能メッソドのオーバーライド
スーパークラスで定義されたメソッド
と「同じメソッド名・引数の数・型」
をもつメソッドをサブクラスで定義で
きる.
サブクラスのオブジェクでメソッドを
呼び出すと,サブクラスのメソッドが
superとthis
super
サブクラスからスーパークラスの{変数,メ ソッド,コンストラクタ}にアクセするときthis
同一クラスの{変数,メソッドコンストラク タ}にアクセするとき.super
super.変数名スーパークラスの変数へアクセスする方法
スーパークラスのメソッドにアクセスする方法
super.メソッド名スーパークラスのコンストラクタにアクセスする
方法
this
this.変数名自クラスの変数へアクセスする方法
自クラスのメソッドにアクセスする方法
this.メソッド名自クラスのコンストラクタにアクセスする方法
finalキーワード
finalでメソッドを修飾すると
そのサブクラスからオーバーライドできな い.finalでクラスを修飾すると
そのクラスを継承できないfinalでフィールドを修飾すると
Objectクラスの継承
Objectクラスはすべてのクラスのスー
パークラス
主なメソッド
String toString()
12章インタフェース
抽象クラス
多重継承
抽象クラス
#1
ある共通の性質/特性をもつクラスを
まとめる.
抽象クラス「ほ乳類」(乳を飲ませて子を 育てる).サブクラス「クジラ」, 「犬」.. 「犬」:母親が添い寝をしながら,乳を飲 ませる.抽象クラス#2
概念としてのみ存在するクラス
abstractでクラスを修飾:抽象クラス
オブジェクトを作成できないクラスabstractでメソッドを修飾
処理内容が定義されていないメソッドを持って いる.(抽象メソッド)abstractで変数を修飾できない
抽象クラス
Vehicle Car Plane 抽象メソッド Show() メソッドsetSpeed(int) Planeクラスで定義した Show()メソッドが実行 Carクラスで定義した Show()メソッドが実抽象クラスの宣言
abstract class クラス名 { � フィールド宣言 � メソッド宣言 � abstract 戻り値の型 メソッド名(引数名); � .... }抽象クラスでない場合
Vehicle Car Plane 親クラスで定義したShow() Planeクラスでは,親ク Carクラスでオーバラinstanceof 演算子
あるオブジェクトがどのクラスを元に
生成されたのかが知りたいときに使
う.
例:instanceof
class A { //super-class } class AA extends A { //sub-class } class test_instance_of {public static void main(String args[]) {
� A objA = new A(); AA objAA = new AA();
� System.out.println(objAA instanceof A);
インタフェース
フィールドは必ず「定数」
メソッドは必ず「抽象メソッド」(実装
の記述はない)
オブジェクトは作れない
継承あり
インタフェースの宣言
interface インタフェース名 � extends スーパーインタフェース名1, … { � 型名 フィールド = 式(定数); � ... � 戻り値の型 メソッド名(引数名); � .... }インタフェースの実装
インタフェースを利用するためには,
「implements」を使い,そのクラで
は,インタフェースのメソッドを実装
する.
例:implements
interface MyIF {
� int num = 100;
� void mymethod();
}
class MyClass implements MyIF {
� public void mymethod() {
� System.out.println( num = + MyIF.num);
クラスとインタフェース
クラス インタフェース
オブジェクト できる できない
メソッド いろいろ 必ずabstract
フィールド いろいろ 必ずpublic static final
スーパクラス 1つだけ 持てない
スーパインタ 複数可能
多重継承
多重継承:2つ以上のクラスを継承す
ること.
Javaの継承「extends」では多重継承
は認めていない.
ただし,interfaceを使うことで,擬
似的に多重継承を行うことができる.
多重継承の実装
class クラス名 implements インタフェース名1, インタフェース名2, … { � ...; } インタフェース1 インタフェース2 クラス多重継承の例
Car
iVehicle iMaterial
抽象メソッドmShow() 抽象メソッドvShow()
例:インタフェース
interface MyIF { � int num = 100; � void mymethod(); } interface MyIF1 {} interface MyIF2{}interface MyIF extends MyIF1, MyIF2 { }