1
- 目指せ脱初心者!! - クイズで覚える Java プログラミング 日本オラクル株式会社オラクルユニバーシティ #jdt2014_e3 2
以下の事項は 弊社の一般的な製品の方向性に関する概要を説明するものです また 情報提供を唯一の目的とするものであり いかなる契約にも組み込むことはできません 以下の事項は マテリアルやコード 機能を提供することをコミットメント ( 確約 ) するものではないため 購買決定を行う際の判断材料になさらないで下さい オラクル製品に関して記載されている機能の開発 リリースおよび時期については 弊社の裁量により決定されます Oracle は 米国オラクル コーポレーション及びその子会社 関連会社の米国及びその他の国における登録商標または商標です 他社名又は製品名は それぞれ各社の商標である場合があります 3
Agenda Part 1. 基本文法編 Part 2. オブジェクト指向プログラミング編 4
Part 1. 基本文法編 5
Quiz.1 変数はどこをさしている? 次のコードの実行結果として正しいものはどれですか? 1. public class Test { 2. int num; 3. void methoda() { 4. int num = 2; 5. methodb(); 6. System.out.print(num); 7. } 8. void methodb() { 9. num = 3; 10. } 11. public static void main(string[] args) { 12. Test test = new Test(); 13. int num = 1; 14. System.out.print(test.num); 15. test.methoda(); 16. System.out.print(num); 17. System.out.print(test.num); 18. } 19. } [ 選択肢 ] 1.1233 が出力される 2.0213 が出力される 3.1213 が出力される 4.0333 が出力される 6
Quiz.1 答え 変数はどこをさしている? 次のコードの実行結果として正しいものはどれですか? 1. public class Test { 2. int num; 3. void methoda() { 4. int num = 2; 5. methodb(); 6. System.out.print(num); 7. } 8. void methodb() { 9. num = 3; 10. } 11. public static void main(string[] args) { 12. Test test = new Test(); 13. int num = 1; 14. System.out.print(test.num); 15. test.methoda(); 16. System.out.print(num); 17. System.out.print(test.num); 18. } 19. } [ 選択肢 ] 1.1233 が出力される 2.0213 が出力される 3.1213 が出力される 4.0333 が出力される 7
プログラミングのポイント 変数のスコープ 変数のスコープ 変数が見える (= 特定の識別子で参照できる ) 範囲 インスタンス変数 / static 変数 クラス内の全てのブロックからアクセス可能 ローカル変数 メソッドやif 文などの特定のブロック内でのみアクセス可能 1. public class Test { 2. int num; 3. public static void main(string[] args) { 4. Test test = new Test(); 4. int num = 1; 5. System.out.print(num); 6. System.out.print(test.num); 7. } 8. } ローカル変数 num の有効範囲 インスタンス変数 num の有効範囲 8
もう一度コードを良く見てみよう 次のコードの実行結果として正しいものはどれですか? 1. public class Test { 2. int num; 3. void methoda() { 4. int num = 2; 5. methodb(); 6. System.out.print(num); 7. } 8. void methodb() { 9. num = 3; 10. } 11. public static void main(string[] args) { 12. Test test = new Test(); 13. int num = 1; 14. System.out.print(test.num); 15. test.methoda(); 16. System.out.print(num); 17. System.out.print(test.num); 18. } 19. } test num (main() のローカル変数 ) num ( インスタンス変数 ) num (methoda() のローカル変数 ) 0 2 1 3 9
Quiz.2 66666 + 44444 と表示したいのだけれど 次のコードの実行結果として正しいものはどれですか? 1. public class Test { 2. public static void main(string[] args) { 3. System.out.println(12345 + 54321); 4. System.out.println(" "); 5. System.out.println(01234 + 43210); 6. } 7. } [ 選択肢 ] 1.66666 44444 2.66666 43878 3.17777 44444 4.17777 43878 10
Quiz.2 答え 66666 44444 と表示したいのだけれど 次のコードの実行結果として正しいものはどれですか? 1. public class Test { 2. public static void main(string[] args) { 3. System.out.println(12345 + 54321); 4. System.out.println(" "); 5. System.out.println(01234 + 43210); 6. } 7. } [ 選択肢 ] 1.66666 44444 2.66666 43878 3.17777 44444 4.17777 43878 11
プログラミングのポイント リテラル リテラルとは値を文字で表したもの 例 : 整数型 (byte, short, int, long) のリテラル 10 進数表記 int i = 10; 8 進数表記 int i = 010; 16 進数表記 int i = 0x10; 12
プログラミングのポイント Java SE 7 の新機能 リテラルに関する拡張 バイナリリテラル 整数型 (byte, short, int, long) を 2 進数で表記 int i1 = 0b1010; または int i2 = 0B1010; アンダースコアつきリテラル int i = 0x5_2; // 16 進数 float pi = 3.14_15f; リテラルは "0b" または "0B" で開始 TIPS: アンダースコア付きリテラルを使えない場所 数値リテラルの始まりと終わり 小数点に接する位置 float や long をあらわす接頭辞 (f,f,l,l) の直前 16 進数などの接頭辞 (0x) の途中 13
Quiz.2 修正版 66666 44444 と表示したいのだけれど 次のコードの実行結果として正しいものはどれですか? 1. public class Test { 2. public static void main(string... args) { 3. System.out.println(12345 + 54321); 4. System.out.println(" "); 5. System.out.println(1234 + 43210); 6. } 7. } One Point: Long 型のリテラルは末尾に エル (L, l) を付記しますが 小文字の l は 数字の いち (1) と見間違えやすいので なるべく大文字の L を使いましょう 14
Quiz. 3 オブジェクトは等しいのか? 次のコードの実行結果として正しいものはどれですか? 1. String str1 = "Java"; 2. String str2 = "Java"; 3. String str3 = new String("Java"); 4. 5. if (str1 == str3) { 6. System.out.print(str1 + " == " + str2 +, "); 7. } 8. if (str2.equals(str3)) { 9. System.out.println(str1 + " equals " + str3); 10. } 1. Java == Java, 2. Java == Java, Java equals Java 3. Java equals Java 4. 何も出力されない 15
Quiz. 3 答え オブジェクトは等しいのか? 次のコードの実行結果として正しいものはどれですか? 1. String str1 = "Java"; 2. String str2 = "Java"; 3. String str3 = new String("Java"); 4. 5. if (str1 == str3) { 6. System.out.print(str1 + " == " + str2 +, "); 7. } 8. if (str2.equals(str3)) { 9. System.out.println(str1 + " equals " + str3); 10. } 1. Java == Java, 2. Java == Java, Java equals Java 3. Java equals Java 4. 何も出力されない 16
プログラミングのポイント == と equals == 演算子 オブジェクトの同一性 String a = new String("Java"); String b = new String("Java"); String c = "Java"; System.out.println(a == b); // false System.out.println(a == c); // false equals メソッド オブジェクトの等価性 One Point: String str1 = "Java"; は特殊なインスタンス化方法 直接文字列を指定する場合は String str2 = "Java"; のように複数回宣言してもインスタンスは毎回生成されず 同じインスタンスを参照する == 演算子で比較しても true になる String str3 = new String("Java"); のように通常の参照型と同じインスタンス化を行った場合は毎回インスタンスが生成される == 演算子で比較すると false になる Object クラスの equals メソッド 同じオブジェクトを参照しているか (== と同じ ) ラッパークラスと String クラスの equals メソッド 同じ値をあらわしているか ユーザー定義クラスの equals メソッド 必要に応じてオーバーライド equals メソッドをオーバーライドする場合は hashcode() もオーバーライド 17
Quiz 4 オートボクシングの落とし穴 次のコード断片を実行した結果として正しいものはどれですか? 1. public class Test { 2. public static void main(string[] args) { 3. int a = 127; 4. int b = 127; 5. System.out.print(a == b); System.out.print(", "); 6. System.out.print(equals(a, b)); 7. } 8. public static boolean equals(integer a, Integer b) { 9. return a == b; 10. } 11. } 1. true, true 2. true, false 3. false, true 4. false, false 18
Quiz 4 答え オートボクシングの落とし穴 次のコード断片を実行した結果として正しいものはどれですか? 1. public class Test { 2. public static void main(string[] args) { 3. int a = 127; 4. int b = 127; 5. System.out.print(a == b); System.out.print(", "); 6. System.out.print(equals(a, b)); 7. } 8. public static boolean equals(integer a, Integer b) { 9. return a == b; 10. } 11. } 1. true, true 2. true, false 3. false, true 4. false, false 19
プログラミングのポイント プリミティブ型と参照型 インスタンス変数 var へのアクセスは v1.var または v2.var プリミティブ型 ( 基本データ型 ) 値そのものを格納する 参照型 整数型 (byte, short, int, long) 浮動小数点型 (float, long) boolean 型 プリミティブ型に対応したラッパークラスがある オートボクシングにより相互代入可能 オブジェクトの参照情報を格納する 全ての参照型のスーパークラスは java.lang.object クラス 初期値は null v1 コピー v2 SomeClass のインスタンス int var = 10; 参照型の v1 を v2 にコピーすると同じオブジェクトを参照する 20
プログラミングのポイント ラッパークラスのオブジェクトは == で比較しない Integer 型のオートボクシングは Integer.valueOf() で処理される Integer.valueOf() は -128 から 127 までキャッシュされるため == で比較しても true になる ( この範囲外の値では false になる ) One Point: 参照型の等価性比較は equals メソッドを使用しましょう 21
Quiz 4 修正版 オートボクシングの落とし穴 次のコード断片を実行した結果として正しいものはどれですか? 1. public class Test { 2. public static void main(string[] args) { 3. int a = 127; 4. int b = 127; 5. System.out.println(a == b); 6. System.out.println(equals(a, b)); 7. } 8. public static boolean equals(integer a, Integer b) { 9. return a.equals(b); 10. } 11. } 22
Quiz. 5 switch 文を使用する 次のコードの実行結果を正しく説明しているものはどれですか? 1. String abbrev = new String("NEWS"); 2. switch (abbrev.substring(1, 2)) { 3. case "N": System.out.print("North "); break; 4. case "E": System.out.print("East "); 5. case "W": System.out.print("West "); break; 6. case "S": System.out.print("South "); 7. default: 8. System.out.println("North, South, East and West"); 9. } 1. North 2. East West 3. North, South, East and West 4. このコードはコンパイルエラーになるので実行できない 23
Quiz. 5 答え switch 文を使用する 次のコードの実行結果を正しく説明しているものはどれですか? 1. String abbrev = new String("NEWS"); 2. switch (abbrev.substring(1, 2)) { 3. case "N": System.out.print("North "); break; 4. case "E": System.out.print("East "); 5. case "W": System.out.print("West "); break; 6. case "S": System.out.print("South "); 7. default: 8. System.out.println("North, South, East and West"); 9. } 1. North 2. East West 3. North, South, East and West 4. このコードはコンパイルエラーになるので実行できない 24
プログラミングのポイント switch 文 switch による分岐処理 switch の判定条件に String を使用可能 (Java SE 7 の新機能 ) char, byte, short, int, enum + String (char, byte, short, int はラッパークラスも使用可 ) switch 文の制御 case に break が記述されていないと後続の case が処理される break; の書き忘れに注意!! 25
Quiz. 6 多次元配列の処理 次のコードの実行結果を正しく説明しているものはどれですか? 1. int[][] dimention = { { 1, 5 }, { 2, 7 }, { 8, 3 } }; 2. for (int[] xx : dimention) { 3. for (int yy : xx) { 4. System.out.print(yy); 5. } 6. System.out.print(" "); 7. } 1. 5 7 3 2. 15 27 83 3. 128 573 4. 実行時に ArrayIndexOutOfBoundsException がスローされる 26
Quiz. 6 答え 多次元配列の処理 次のコードの実行結果を正しく説明しているものはどれですか? 1. int[][] dimention = { { 1, 5 }, { 2, 7 }, { 8, 3 } }; 2. for (int[] xx : dimention) { 3. for (int yy : xx) { 4. System.out.print(yy); 5. } 6. System.out.print(" "); 7. } 1. 5 7 3 2. 15 27 83 3. 128 573 4. 実行時に ArrayIndexOutOfBoundsException がスローされる 27
プログラミングのポイント 配列の宣言 配列の宣言 int[] a; // 配列の宣言 a = new int[4]; // 配列の生成 int[] a = new int[4]; // 配列の宣言と生成 a[0] = 10; // 配列要素へのアクセス arr TIPS: 配列の添字 (Index) は 0 から開始配列の要素数 : arr.length 4 [0] [1] [2] [3] 初期化子 直接データを代入して配列を生成する方法 int[] b = {10, 20, 30, 40}; // 初期化子による配列の宣言と生成 28
プログラミングのポイント 多次元配列 多次元配列は 配列の配列 int[][] arr ={{0,1,2}, {3,4,5,6}}; // 初期化子による多次元配列の初期化と生成 System.out.println(arr[0][1]); // 配列要素へのアクセス arr [0] [1] arr[0] arr[1] [0] [1] [2] [0] [1] [2] [3] 29
プログラミングのポイント 拡張 for 文 拡張 for 文 配列や Collection の要素を 1 つずつ処理するための新構文 for ( 型変数名 : 式 ) { // 処理 } 式には 配列や java.util.iterable インタフェースを実装したクラスを指定 反復変数は for 文内でのみ使用可能 // 同等の処理 (Collection) for (Iterator i = list.iterator(); i.hasnext(); ) { // 拡張 for 文 (Collection) for (Iterator I : list) { One Point: 拡張 for 文は要素を 1 つずつ順番に処理するために使用します逆順処理や条件付きで要素を処理する ( フィルタ処理 ) 場合は 通常の for 文を使用しましょう 30
Part 2. オブジェクト指向プログラミング編 31
Quiz 7 オブジェクトは初期化される? 次のコードを正しく説明しているものはどれですか? 1. public class Test { 2. public static void main(string[] args) { 3. Fruits fruits = new Fruits(); 4. for(string item: fruits.getfruits()) { 5. System.out.print(item + ", "); 6. } 7. } 8. } 9. class Fruits { 10. private String[] fruits = new String[2]; 11. public void Fruites() { 12. fruits[0] = "apple"; fruits[1] = "orange"; 13. } 14. public String[] getfruits() { 15. return fruits; 16. } 17. } [ 選択肢 ] 1.apple, orange, が出力される 2. 何も出力されない 3.null, null, が出力される 4. 実行例外がスローされる 32
Quiz 7 答え オブジェクトは初期化される? 次のコードを正しく説明しているものはどれですか? 1. public class Test { 2. public static void main(string[] args) { 3. Fruits fruits = new Fruits(); 4. for(string item: fruits.getfruits()) { 5. System.out.print(item + ", "); 6. } 7. } 8. } 9. class Fruits { 10. private String[] fruits = new String[2]; 11. public void Fruites() { 12. fruits[0] = "apple"; fruits[1] = "orange"; 13. } 14. public String[] getfruits() { 15. return fruits; 16. } 17. } [ 選択肢 ] 1.apple, orange, が出力される 2. 何も出力されない 3.null, null, が出力される 4. 実行例外がスローされる 33
プログラミングのポイント コンストラクタ コンストラクタ インスタンス生成時に初期化処理を行う メソッドのように引数リストはとれる ( オーバーロードも可 ) が 戻り値は返せない クラス名 ( 引数リスト ) { // 初期化処理 } 初期化の処理順は 初期化子 コンストラクタの順 コンストラクタは継承されない点に注意 One Point: オーバーロードのルール 同一クラスのメソッド名が同じで引数リスト ( 引数の型 数 順序 ) が異なる 引数リストが同じで戻り値が異なるメソッドは定義できない 34
Quiz 7 修正版 オブジェクトは初期化される 次のコードを正しく説明しているものはどれですか? 1. public class Test { 2. public static void main(string[] args) { 3. Fruits fruits = new Fruits(); 4. for(string item: fruits.getfruits()) { 5. System.out.print(item + ", "); 6. } 7. } 8. } 9. class Fruits { 10. private String[] fruits = new String[2]; 11. public Fruites() { 12. fruits[0] = "apple"; fruits[1] = "orange"; 13. } 14. public String[] getfruits() { 15. return fruits; 16. } 17. } 35
Quiz. 8 そのキャストは正しい? 次のコードの 5 10 行目で正しく実行できるものはどれですか? 1. public class Test { 2. public static void main(string[] args) { 3. A a = new B(); 4. T t = new B(); 5. a.method(); 6. (T) a.method(); 7. ((T) a).method(); 8. t.method(); 9. (T) t.method(); 10. ((T) t).method(); 11. } 12. } 13. class A { } 14. class B extends A implements T { 15. public void method() { 16. System.out.println("B#method"); 17. } 18. } 19. interface T { 20. public void method(); 21. } [ 選択肢 ] 1. 5. a.method(); 2. 6. (T) a.method(); 3. 7. ((T) a).method(); 4. 8. t.method(); 5. 9. (T) t.method(); 6.10. ((T) t).method(); 36
Quiz. 8 答え そのキャストは正しい? 次のコードの 5 10 行目で正しく実行できるものはどれですか? 1. public class Test { 2. public static void main(string[] args) { 3. A a = new B(); 4. T t = new B(); 5. a.method(); 6. (T) a.method(); 7. ((T) a).method(); 8. t.method(); 9. (T) t.method(); 10. ((T) t).method(); 11. } 12. } 13. class A { } 14. class B extends A implements T { 15. public void method() { 16. System.out.println("B#method"); 17. } 18. } 19. interface T { 20. public void method(); 21. } [ 選択肢 ] 1. 5. a.method(); 2. 6. (T) a.method(); 3. 7. ((T) a).method(); 4. 8. t.method(); 5. 9. (T) t.method(); 6.10. ((T) t).method(); 37
プログラミングのポイント 参照型のキャスト 参照型のキャスト ( 型変換 ) クラスは継承関係またはインタフェース実装が前提 スーパークラス型に代入したオブジェクトをサブクラス型に再入する場合は明示的にキャストが必要 Oya oya = new Ko(); Ko ko = (Ko)oya; スーパークラス インタフェース 暗黙の型変換 代入 キャストによる型変換 サブクラス 実装クラス One Point: キャストしたクラスに互換性がなければ実行時に ClassCastException がスローされる SomeClass sc = new SomeClass(); AnotherClass ac = new AnotherClass(); ac = (AnotherClass)sc; // 型に互換性がない 38
プログラミングのポイント参照型のキャスト class B extends A implements T A a (T) a T t One Point: キャスト演算子の対象に注意 (T) a.method(); ( (T)a ).method(); メソッドの戻り値に対してキャスト 変数に対してキャスト class A interface T void method(); 実行時はオーバーライドされたメソッドが呼び出される @Override void method() { } 39
もう一度コードを良く見てみよう そのキャストは正しい? 次のコードの 5 10 行目で正しく実行できるものはどれですか? 1. public class Test { 2. public static void main(string[] args) { 3. A a = new B(); 4. T t = new B(); 5. a.method(); // クラスAには method() メソッドは定義されていない 6. (T) a.method(); // method() の戻り値 void に対してキャストはできない 7. ((T) a).method(); 8. t.method(); 9. (T) t.method(); // method() の戻り値 void に対してキャストはできない 10. ((T) t).method(); 11. } 12. } 13. class A { } 14. class B extends A implements T { 15. public void method() { 16. System.out.println("B#method"); 17. } 18. } 19. interface T { 20. public void method(); 21. } 40
Quiz. 9 オーバーライドされている? 次のコードの実行として正しいものはどれですか? 1. public class Test { 2. public static void main(string[] args) { 3. Parent p = new Child(); 4. System.out.println(p.name + ", " + ((Child)p).name); 5. } 6. } 7. class Parent { 8. String name = "Parent"; 9. } 10. class Child extends Parent { 11. String name = "Child"; 12. } [ 選択肢 ] 1. Parent, Parent 2. Child, Child 3. Child, Parent 4. Parent, Child 41
Quiz. 9 答え オーバーライドされている? 次のコードの実行として正しいものはどれですか? 1. public class Test { 2. public static void main(string[] args) { 3. Parent p = new Child(); 4. System.out.println(p.name + ", " + ((Child)p).name); 5. } 6. } 7. class Parent { 8. String name = "Parent"; 9. } 10. class Child extends Parent { 11. String name = "Child"; 12. } [ 選択肢 ] 1. Parent, Parent 2. Child, Child 3. Child, Parent 4. Parent, Child 42
プログラミングのポイント フィールド ( 変数 ) は隠蔽される 継承関係にあるクラスの同じ名前の変数はオーバーライドされない 値は参照する変数の型に依存する B b A a b.name a.name class B extends A String name = "Child"; class A String name = "Parent"; One Point: 継承関係にあるクラスで同じ名前の変数を定義すると どちらかの変数は隠蔽されてしまう 同じ名前の変数の宣言は避けましょう 43
Quiz. 10 戻り値は何? 次のコードを正しく説明しているものはどれですか? 1. public class Test { 2. public static void main(string[] args) { 3. System.out.println(checkSomething()); 4. } 5. public static boolean checksomething() { 6. try { 7. return true; 8. } finally { 9. return false; 10. } 11. } 12. } 1. true が出力される 2. false が出力される 3. 6 行目でコンパイルエラーが発生する 4. 8 行目でコンパイルエラーが発生する 44
Quiz. 10 答え 戻り値は何? 次のコードを正しく説明しているものはどれですか? 1. public class Test { 2. public static void main(string[] args) { 3. System.out.println(checkSomething()); 4. } 5. public static boolean checksomething() { 6. try { 7. return true; 8. } finally { 9. return false; 10. } 11. } 12. } 1. true が出力される 2. false が出力される 3. 6 行目でコンパイルエラーが発生する 4. 8 行目でコンパイルエラーが発生する 45
プログラミングのポイント 例外処理の基本 例外 プログラムで発生する予期せぬ事象をあらわすオブジェクト 例外を発生させる = スロー (throw) 例外を補足して処理する = キャッチ (catch) 例外処理 try-catch 構文 メソッド内で例外処理しない場合はメソッド宣言で throws キーワードを指定 メソッドの呼び出し側に例外処理の必要性を伝える public void methodx() throws Exception { // 例外が発生する可能性がある処理 // (try-catch 不要 ) } try { 例外 // 処理 } catch(exception e) { // 例外処理 } finally { // 終了処理 } try-catch 構文 One Point: 例外が発生してもしなくても finally 句は必ず処理されます finally 句での return 処理は避けましょう 46
プログラミングのポイント Java SE 7 での新機能 Java SE 7 における例外処理の拡張 try-with-resources AutoCloseable オブジェクトを暗黙的にクローズ multi-catch 節 同じ処理を行う catch 句をまとめて記述 } catch( 例外 1 例外 2 ex) { 再スロー時の型推論の改善 Exception オブジェクトを再スロー可能 1. public static void exec() throws IOException, SQLException { 2. try { 3. // 例外が発生する処理 ; 4. } catch (Exception e) { 5. // 例外処理 6. throw e; 7. } 8. } 47
最後に 48
本セッションの内容は OCJP Silver SE 7 相当です 是非チャレンジしてみてください! Gold 試験は どちらもかなり手強いです しっかり準備して試験に備えましょう! Bronze と Silver の試験範囲はほとんど同じです プログラミング経験がある方は Silver からスタートしましょう 1Z0-804: Java SE 7 Programmer II Oracle Certified Java Programmer, Gold SE 7 これから資格取得を目指す方 1Z0-803: Java SE 7 Programmer I Oracle Certified Java Programmer, Silver SE 7 1Z0-805: Upgrade to Java SE 7 Programmer 1Z0-802: Java SE 7 Bronze Exam オンライン試験有り Oracle Certified Java Programmer, Bronze SE 7 OCJ-P/SJC-P 資格取得者 ( バージョンは問わない ) 資格名 試験名 一試験で移行可能! 49
認定資格試験の学習方法 試験情報は受験前に必ず確認しましょう できるだけ実際にプログラムを作成しましょう ソースコードを 読む力 は試験でも実務でも役に立ちます 試験のための学習は Java SE API & ドキュメントを参照しましょう Oracle Technology Network > Java にはお役立ち情報が満載です 市販の書籍を活用して試験の出題傾向をつかみましょう オラクル認定資格教科書 Javaプログラマ Silver SE 7 ( 翔泳社 ) オラクル認定資格教科書 Javaプログラマ Silver SE7 スピードマスター問題集 ( 翔泳社 ) 50
Java プログラミングのおともには? 日本語化された API ドキュメントを読んでみよう 51
52