SlideShare una empresa de Scribd logo
1 de 54
Descargar para leer sin conexión
JJaavvaa  PPuuzzzzlleerrss    
AAttttaacckk  ooff  tthhee  OObbjjeecctt##CClloonnee  

櫻庭 祐一  
寺田 佳央
コード中に発生する勘違い  
—  JJaavvaa  プログラミングのパズル  
—  奇妙な振る舞いをする小さなプログラム  
—  複数の選択肢から、何が表示される?  
—  ミステリーの解明  
—  問題の解決方法  
—  教訓
ルール:全て4択です  
public class JavaPuzzlers {

  public static void main(String... args) { "
     http://www.java-users.jp   "
     System.out.println(“Japan Java User Group Presents!”); } "
} "

11)) 
22)) 
33)) 
44)) 

JJaappaann  JJaavvaa  UUsseerrss  GGrroouupp  PPrreesseennttss!!  
JJaavvaa  PPuuzzzzlleerrss  
00xxccaaffeebbaabbee  
その他  

全員参加です
11  問目
1..  FFiinnddRRoooottss      
class Ancestor {"
String name = "祖先”;"
1)  祖先:祖先
String getName() {return name;}"
2)  ⼦子孫:⼦子孫
}"
3)  祖先:⼦子孫
class Descendant extends Ancestor {"
4)  ⼦子孫:祖先
String name = "子孫";"
@Override"
String getName() {return name;}"
}"
"
public class FindRoots {"
public static void main(String argv[]) {"
Ancestor person = new Descendant();"
System.out.println("
person.name + ":" + person.getName());"
}"
}"
正解は
1..  FFiinnddRRoooottss      
class Ancestor {"
String name = "祖先”;"
String getName() {return name;}"
}"
3)  祖先:⼦子孫
class Descendant extends Ancestor {"
String name = "子孫";"
@Override"
String getName() {return name;}"
}"
"
public class FindRoots {"
public static void main(String argv[]) {"
Ancestor person = new Descendant();"
System.out.println("
person.name + ":" + person.getName());"
}"
}"
11.解説  
—  フィールドはコンパイル時に親クラスの情報を引き継ぎます  
—  メソッドは実行時に上書きしたメソッドを呼び出します  
—  仮にどうしても子のフィールドにアクセスしたい場合、   
キャストして取得します
1..  解決方法  
class Ancestor {"
String name = "祖先”;"
String getName() {return name;}"
}"
3)  祖先:⼦子孫
class Descendant extends Ancestor {"
String name = "子孫";"
@Override"
String getName() {return name;}"
}"
"
public class FindRoots {"
public static void main(String argv[]) {"
Ancestor person = new Descendant();"
System.out.println("
((Descendant)person).name + ":" + person.getName());"
}"
}"
1.教訓  
  

—  フィールドは隠蔽し直接アクセスしないようにしてください
22  問目
22.MMaajjoorriittyyVVoottee  

11))  YYEESS  
22))  NNOO  
33))  場合による  
44))  tthhrrooww  EExxcceeppttiioonn  

public class MajorityVote {"
public static void main(String... args) {"
   Random[] randoms = new Random[10];"
    for (int i = 0; i < 10; i++)"
     randoms[i] = new Random(System.currentTimeMillis());"
"
int count = 0;"
    boolean option = randoms[0].nextBoolean();"
    for (int i = 1; i < 10; i++)"
      if (option == randoms[i].nextBoolean()) count++;"
"
    System.out.println((count > 5)? "YES": "NO");"
  }"
}"
正解は
22.MMaajjoorriittyyVVoottee  

11))  YYEESS  

public class MajorityVote {"
public static void main(String... args) {"
   Random[] randoms = new Random[10];"
    for (int i = 0; i < 10; i++)"
     randoms[i] = new Random(System.currentTimeMillis());"
"
int count = 0;"
    boolean option = randoms[0].nextBoolean();"
    for (int i = 1; i < 10; i++)"
      if (option == randoms[i].nextBoolean()) count++;"
"
    System.out.println((count > 5)? "YES": "NO");"
  }"
}"
22.解説  
—  RRaannddoommのコンストラクタは、乱数シードを指定します  
—  ループは11  ミリ秒の間に処理が完了します  
→  乱数シードが全て同一となります  

—  デフォルトコンスタクタはSSyysstteemm..nnaannooTTiimmee(())を使用  
します
22..  解決方法  
public class MajorityVote {"
public static void main(String... args) {"
   Random[] randoms = new Random[10];"
    for (int i = 0; i < 10; i++)"
     randoms[i] = new Random();"
"
int count = 0;"
    boolean option = randoms[0].nextBoolean();"
    for (int i = 1; i < 10; i++)"
      if (option == randoms[i].nextBoolean()) count++;"
"
    System.out.println((count > 5)? "YES": "NO");"
  }"
}"
22.教訓  
  

—  デフォルトのコンストラクタを使用してください  
  

—  テスト時など乱数系列をあえて同一にするテクニックもあり
ます
33  問目
33.CCuuttAAnnddPPaassttee  

11))  112233  
22))  112233445566  
public class CutAndPaste{

33))  コンパイル・エラー  
public static void main(String... argv) {"
44))  ランタイム・エラー  
  

String firstLine = "1,2,3";

  String secondLine = "4,5,6";

   List<String> firstList = "
 

Arrays.asList(firstLine.split(”,"));

List<String> secondList = "

Arrays.asList(secondLine.split(”,"));

   firstList.addAll(secondList);

   for(String data : firstList){

 
System.out.print(data);

   }

  }

}"
正解は
33.CCuuttAAnnddPPaassttee  

  
  
public class CutAndPaste {

  
public static void main(String argv[]){"
44))  ランタイム・エラー  
   String firstLine = "1,2,3";

  String secondLine = "4,5,6";

   List<String> firstList = "
"Arrays.asList(firstLine.split(","));

 
List<String> secondList ="
"Arrays.asList(secondLine.split(","));

   firstList.addAll(secondList);

   for(String data : firstList){

 
System.out.print(data);

   }

  }

}"

UUnnssuuppppoorrtteeddOOppeerraattiioonnEExxcceeppttiioonn  を送出
33..  解説  
—  AArrrraayyss..aassLLiisstt  は固定サイズのリストを生成します  
—  aassLLiisstt(())で取得したリストに対して,,  aadddd,,  aaddddAAllll  等は    
実行できません
33..  解決方法  
public class CutAndPaste {

public static void main(String argv[]) {"
  

String firstLine = "1,2,3";

  String secondLine = "4,5,6";

   List<String> firstList = new ArrayList<>("
 

Arrays.asList(firstLine.split(",")));

List<String> secondList = "

Arrays.asList(secondLine.split(","));

   firstList.addAll(secondList);

   for(String data : firstList){

 
System.out.print(data);

   }

  }

}"

固定サイズのリストから、新たな可変リストを生成
33..  教訓  
—  可変のリストを作成したい場合は、固定サイズのリストより
新たな可変リストのコピーを生成します
4  問目
44..  WWaallttzzRRhhyytthhmm  
public class WaltzRhythm {"
public static void main(String... args) {"
int count = 0;"
for (int i = 0; i < Integer.MAX_VALUE; i += 3) {"
count++;"
}"
System.out.println(count);"
}"
}"
11))  771155882277888822  ((==  IInntteeggeerr..MMAAXX__VVAALLUUEE//33))  
22))  771155882277888833  ((==  IInntteeggeerr..MMAAXX__VVAALLUUEE//33  ++  11))  
33))  無限ループ  
44))  それ以外
正解は
44..  WWaallttzzRRhhyytthhmm  
public class WaltzRhythm {"
public static void main(String... args) {"
int count = 0;"
for (int i = 0; i < Integer.MAX_VALUE; i += 3) {"
count++;"
}"
System.out.println(count);"
}"
}"

44))  それ以外  ((--771155882277888833))
44..  解説  
—  IInntteeggeerr..MMAAXX__VVAALLUUEE  ==  22114477448833664477  
—  ffoorr  ((iinntt  ii  ==  00;;  ii  <<  IInntteeggeerr..MMAAXX__VVAALLUUEE  ;;  ii  ++==  33))  {{  
—    

  ++33  インクリメントし  ccoouunntt  として771155882277888822を期待します  

counter	
 1	
 2	
 3	
 4	
 5	
 6	
 7	
0	
 3	
 6	
 9	
 12	
 15	
18	

i	

715827883	
・・・・・・・・・	
 2147483646	

—  CCoouunntteerr  がオーバフロー  
—  ffoorr  文の終了条件までIInntteeggeerr..MMIINN__VVAALLUUEE  -->>  IInntteeggeerr..MMAAXX__VVAALLUUEE  を繰り返し
ます
44..  解説  
ffoorr  ((iinntt  ii  ==  00;;  ii  <<  IInntteeggeerr..MMAAXX__VVAALLUUEE  ;;  ii  ++==  33))  
counter	
 1	
 2	
 3	
 4	
 5	
 6	
 7	
715827883	
i	

0	
 3	
 6	
 9	
 12	
 15	
18	

・・・・・・・・・	
 2147483646	
MAX_VALUE -1	

counter	
 715827884	
i	

715827885	

2147483642	
 2147483645	
-2147483647	
 -2147483647	
・・・・・・・・・	

MIN_VALUE +2	
counter	
 -2147483647	
 -2147483646	

i	

2147483647	
 -2147483648	

MAX_VALUE -2	
-715827884	
 -715827883	

2147483641	
 2147483644	
-2147483648	
 -2147483645	
・・・・・・・・・	
MIN_VALUE +1
44..  解決方法  
public class WaltzRhythm {"
public static void main(String... args) {"
int count = 0;"
for (int i = 0; i < Integer.MAX_VALUE -3 ; i += 3) {"
count++;"
}"
System.out.println(count);"
}"
}"
44..  教訓  
—  bbyyttee,,  cchhaarr,,  iinntt  ,,  lloonngg  ((プリミティブ型))  を扱う場合、  
桁のオーバフローを考慮した実装が必要です  

—  オーバフローを引き起こさないために  BBiiggIInntteeggeerr  を使う方
法もあります
5  問目
55..  UUppppeerrLLoowweerrMMaattcchh  
public class UpperLowerMatch {"
public static void main(String argv[]){"
Integer a1 = 10; Integer a2 = 129;"
int b1 = 10; int b2 = 129;"
Integer c1 = 10; Integer c2 = 129;"
"
System.out.print((a1==b1));"
System.out.print("t”+(a1==c1));"
"
System.out.print("t”+(a2==b2));"
System.out.println("t”+(a2==c2));" 11))  ttrruuee  ttrruuee  ttrruuee  ttrruuee  
}"
22))  ffaallssee  ttrruuee  ffaallssee  ttrruuee  

33))  ttrruuee  ffaallssee  ttrruuee  ffaallssee  
44))  ttrruuee  ttrruuee  ttrruuee  ffaallssee
正解は
55..  UUppppeerrLLoowweerrMMaattcchh  
public class UpperLowerMatch {"
public static void main(String argv[]){"
Integer a1 = 10; Integer a2 = 129;"
int b1 = 10; int b2 = 129;"
Integer c1 = 10; Integer c2 = 129;"
"
System.out.print((a1==b1));"
System.out.print("t”+(a1==c1));"
"
System.out.print("t”+(a2==b2));"
System.out.println("t”+(a2==c2));"   
}"
  

  
44))  ttrruuee  ttrruuee  ttrruuee  ffaallssee
55..  解説  
—  AAuuttooBBooxxiinngg    
—  プリミティブとオブジェクトの比較は、プリミティブで計算し比較  
—  オブジェクトとオブジェクトの比較は、オブジェクトの参照で比較  

—  JJaavvaa..llaanngg..IInntteeggeerr  は--112288  から  112277  の値の範囲でオブ
ジェクト  IIDDの値をキャッシュしており、その比較を実施し
ます  
—  つまり値が  --112288  から  112277  の範囲か否かで結果が異なります  
Cache to support the object identity semantics of
autoboxing for values between -128 and 127 (inclusive)
as required by JLS. "
キャッシュ範囲は -XX:AutoBoxCacheMax で変更可能"
55..  解決方法  
public class UpperLowerMatch {"
public static void main(String argv[]){"
Integer a1 = 10; Integer a2 = 129;"
int b1 = 10; int b2 = 129;"
Integer c1 = 10; Integer c2 = 129;"
"
System.out.print((a1==b1));"
System.out.print("t” + (a1.intValue()==c1.intValue()));"
"
System.out.print("t” +  (a2==b2));"
System.out.println((a2.intValue()==c2.intValue()));"
}"
55..  教訓  

—  オートボクシングを使え便利になっていますが、      
比較においては、pprriimmiittiivvee  と  OObbjjeecctt  の比較は     
十分に注意してください  

—  IInntteeggeerr  の比較を行う際には  iinnttVVaalluuee(())  での比較をお薦め
します
6  問目
66..  WWrraappWWrraappWWrraapp

11)) 
22)) 
33)) 
44)) 

66  
112233  
CCoommppiillee  EErrrroorr  
tthhrrooww  EExxcceeppttiioonn  

public class WrapWrapWrap<T> {"
String wrap(Collection<?> objs) {"
String result = "";"
for (Object o: objs) result += o;"
return result;"
}
"
int wrap(List<Integer> numbers) {"
int result = 0;"
for (int num: numbers) result += num;"
return result;"
}
"
public static void main(String... args) {"
List<String> strings = Arrays.asList("1", "2", "3");"
System.out.println(new WrapWrapWrap().wrap(strings));"
}"
}"
正解は
66..  WWrraappWWrraappWWrraapp
public class WrapWrapWrap<T> {"
String wrap(Collection<?> objs) {"
44))  tthhrrooww  EExxcceeppttiioonn  
String result = "";"
for (Object o: objs) result += o;"
return result;"
}
"
int wrap(List<Integer> numbers) {"
int result = 0;"
for (int num: numbers) result += num;"
return result;"
}
"
public static void main(String... args) {"
List<String> strings = Arrays.asList("1", "2", "3");"
System.out.println(new WrapWrapWrap().wrap(strings));"
}"
}"
66..  解説  
—  ジェネリクスを指定しない場合、RRaaww  型といいます  
—  RRaaww  型の場合、ジェネリクスの型情報が消失します  
つまり以下のクラスと同様になります  

  
  
  

public class WrapWrapWrap {"
String wrap(Collection objs) {...}
int wrap(List numbers) {...}
"
..."
}"
	

"

—  そのため、SSttrriinngg  のリストでも、iinntt  wwrraapp((LLiisstt  nnuummbbeerrss))が   
実行され、実行時にCCllaassssCCaassttEExxcceeppttiioonnが発生します
66..  解決方法
public class WrapWrapWrap<T> {"
String wrap(Collection<?> objs) {"
String result = "";"
for (Object o: objs) result += o;"
return result;"
}"
int wrap(List<Integer> numbers) {"
int result = 0;"
for (int num: numbers) result += num;"
return result;"
}"
public static void main(String... args) {"
List<String> strings = Arrays.asList("1", "2", "3");"
System.out.println(new WrapWrapWrap<String>().wrap(strings));"
}"
}"
66..  教訓  
—  ジェネリクスのパラメータは正しく指定しましょう  
—  JJaavvaa  SSEE  77  からはダイヤモンド演算子が利用可能です
7  問目
77..  LLoossttAAnnddFFoouunndd    

JJaavvaa  SSEE  6で実行  

public class LostAndFound {"
static int getArticles(List<String> list) { return 100; }"
static long getArticles(List<Integer> list) { return 200; }"
public static void main(String argv[]){"
List<String> listStr = new ArrayList<String>();"
List<Integer> listInt = new ArrayList<Integer>();"
System.out.println(getArticles(listStr));"
System.out.println(getArticles(listInt));"
}"
}"
1)  100  ,  200

2)  200  ,  100
3)  コンパイルエラー
4)  ランタイムエラー
正解は
77..  LLoossttAAnnddFFoouunndd    

JJaavvaa  SSEE  6で実行  

public class LostAndFound {"
static int getArticles(List<String> list){ return 100;}"
static long getArticles(List<Integer> list) { return 200; }"
public static void main(String argv[]){"
List<String> listStr = new ArrayList<String>();"
List<Integer> listInt = new ArrayList<Integer>();"
System.out.println(getArticles(listStr));"
System.out.println(getArticles(listInt));"
}"
}"

4)  ランタイムエラー
77..  解説  
—  TTyyppee  EErraassuurree  ::    
—  ジェネリクスはコンパイル時に解決され、コンパイル後型情報
は消えます。そのためこれをイレイジャ方式と呼びます  

—  JJDDKK  55,,  66  では、同じイレイジャ・シグネチャを持つ、異な
る返り値を持つメソッドの定義が可能でしたが、これは間違
いで、JJDDKK  77  で修正されました。((RRFFEE  ::  66118822995500))
77..  解決策  

JJaavvaa  SSEE  77で実行  

public class LostAndFound {"
static int getArticles(List<String> list) { return 100; }"
static long getArticles(List<Integer> list) { return 200; }"
public static void main(String argv[]){"
List<String> listStr = new ArrayList<>();"
List<Integer> listInt = new ArrayList<>();"
System.out.println(getArticles(listStr));"
System.out.println(getArticles(listInt));"
}"
}"
77..  教訓  
—  JJaavvaa  SSEE  77  へ移行してください  ((コンパイルエラー))  
LostAndFound.java:8: エラー: 名前が競合しています。
getArticles(List<Integer>)とgetArticles(List<String>)は削除後の名前が
同じです	
static long getArticles(List<Integer> list) { return 200; }"
^"
エラー1個	

—  JJaavvaa  のバージョン・アップ時には  JJaavvaa  の互換性・非互換
性情報も必ずご確認ください  
http://www.oracle.com/technetwork/java/javase/
compatibility-417013.html#incompatibilities
JJaavvaa  PPuuzzzzlleerrss    
AAttttaacckk  ooff  tthhee  OObbjjeecctt##CClloonnee  

櫻庭 祐一  
寺田 佳央

Más contenido relacionado

La actualidad más candente

C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~Fujio Kojima
 
Shibuya JVM Groovy 20150418
Shibuya JVM Groovy 20150418Shibuya JVM Groovy 20150418
Shibuya JVM Groovy 20150418Uehara Junji
 
C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020
C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020
C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020Fujio Kojima
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11nekko1119
 
Java SE 7 InvokeDynamic in JRuby
Java SE 7 InvokeDynamic in JRubyJava SE 7 InvokeDynamic in JRuby
Java SE 7 InvokeDynamic in JRubyHiroshi Nakamura
 
C# LINQ ~深く知って、使いまくろう~
C# LINQ ~深く知って、使いまくろう~C# LINQ ~深く知って、使いまくろう~
C# LINQ ~深く知って、使いまくろう~Fujio Kojima
 
Async design with Unity3D
Async design with Unity3DAsync design with Unity3D
Async design with Unity3DKouji Hosoda
 
Xtend30分クッキング
Xtend30分クッキングXtend30分クッキング
Xtend30分クッキングShinichi Kozake
 
Xtend30分クッキング やきに駆動
Xtend30分クッキング   やきに駆動Xtend30分クッキング   やきに駆動
Xtend30分クッキング やきに駆動Shinichi Kozake
 
非同期処理の基礎
非同期処理の基礎非同期処理の基礎
非同期処理の基礎信之 岩永
 
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミングC++ マルチスレッドプログラミング
C++ マルチスレッドプログラミングKohsuke Yuasa
 
An other world awaits you
An other world awaits youAn other world awaits you
An other world awaits you信之 岩永
 
unique_ptrにポインタ以外のものを持たせるとき
unique_ptrにポインタ以外のものを持たせるときunique_ptrにポインタ以外のものを持たせるとき
unique_ptrにポインタ以外のものを持たせるときShintarou Okada
 
Java x Groovy: improve your java development life
Java x Groovy: improve your java development lifeJava x Groovy: improve your java development life
Java x Groovy: improve your java development lifeUehara Junji
 
Clojure programming-chapter-2
Clojure programming-chapter-2Clojure programming-chapter-2
Clojure programming-chapter-2Masao Kato
 
LINQソースでGO!
LINQソースでGO!LINQソースでGO!
LINQソースでGO!Kouji Matsui
 

La actualidad más candente (20)

C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
 
Shibuya JVM Groovy 20150418
Shibuya JVM Groovy 20150418Shibuya JVM Groovy 20150418
Shibuya JVM Groovy 20150418
 
C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020
C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020
C# ドキドキ ライブ コーディング!! ~ 小島の分 ~ | BuriKaigi 2020
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11
 
Java SE 7 InvokeDynamic in JRuby
Java SE 7 InvokeDynamic in JRubyJava SE 7 InvokeDynamic in JRuby
Java SE 7 InvokeDynamic in JRuby
 
C# LINQ ~深く知って、使いまくろう~
C# LINQ ~深く知って、使いまくろう~C# LINQ ~深く知って、使いまくろう~
C# LINQ ~深く知って、使いまくろう~
 
Async design with Unity3D
Async design with Unity3DAsync design with Unity3D
Async design with Unity3D
 
Xtend30分クッキング
Xtend30分クッキングXtend30分クッキング
Xtend30分クッキング
 
Xtend30分クッキング やきに駆動
Xtend30分クッキング   やきに駆動Xtend30分クッキング   やきに駆動
Xtend30分クッキング やきに駆動
 
Juliaで並列計算
Juliaで並列計算Juliaで並列計算
Juliaで並列計算
 
C++14 Overview
C++14 OverviewC++14 Overview
C++14 Overview
 
Bluespec @waseda(PDF)
Bluespec @waseda(PDF)Bluespec @waseda(PDF)
Bluespec @waseda(PDF)
 
非同期処理の基礎
非同期処理の基礎非同期処理の基礎
非同期処理の基礎
 
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミングC++ マルチスレッドプログラミング
C++ マルチスレッドプログラミング
 
An other world awaits you
An other world awaits youAn other world awaits you
An other world awaits you
 
unique_ptrにポインタ以外のものを持たせるとき
unique_ptrにポインタ以外のものを持たせるときunique_ptrにポインタ以外のものを持たせるとき
unique_ptrにポインタ以外のものを持たせるとき
 
C#6.0の新機能紹介
C#6.0の新機能紹介C#6.0の新機能紹介
C#6.0の新機能紹介
 
Java x Groovy: improve your java development life
Java x Groovy: improve your java development lifeJava x Groovy: improve your java development life
Java x Groovy: improve your java development life
 
Clojure programming-chapter-2
Clojure programming-chapter-2Clojure programming-chapter-2
Clojure programming-chapter-2
 
LINQソースでGO!
LINQソースでGO!LINQソースでGO!
LINQソースでGO!
 

Destacado

【18-C-2】オラクル統合後の Java の今後について
【18-C-2】オラクル統合後の Java の今後について【18-C-2】オラクル統合後の Java の今後について
【18-C-2】オラクル統合後の Java の今後についてYoshio Terada
 
Microsoft Love Java & OSS
Microsoft Love Java & OSSMicrosoft Love Java & OSS
Microsoft Love Java & OSSYoshio Terada
 
おまえらこのライブラリ使ってないの? m9 (2013-07)
おまえらこのライブラリ使ってないの? m9	(2013-07)おまえらこのライブラリ使ってないの? m9	(2013-07)
おまえらこのライブラリ使ってないの? m9 (2013-07)Toru Furukawa
 
オープンデータ動向 2013年8月
オープンデータ動向 2013年8月オープンデータ動向 2013年8月
オープンデータ動向 2013年8月Hal Seki
 
じっくりコトコト煮込んだJavaスープ
じっくりコトコト煮込んだJavaスープじっくりコトコト煮込んだJavaスープ
じっくりコトコト煮込んだJavaスープKazuhiro Serizawa
 
5分で作るMySQL Cluster環境
5分で作るMySQL Cluster環境5分で作るMySQL Cluster環境
5分で作るMySQL Cluster環境yoyamasaki
 
Hadoop and Storm - AJUG talk
Hadoop and Storm - AJUG talkHadoop and Storm - AJUG talk
Hadoop and Storm - AJUG talkboorad
 
Java EE 7 multi factor authentiaction with Microsoft Azure AD
Java EE 7 multi factor authentiaction with Microsoft Azure ADJava EE 7 multi factor authentiaction with Microsoft Azure AD
Java EE 7 multi factor authentiaction with Microsoft Azure ADYoshio Terada
 
ChordアルゴリズムによるDHT入門
ChordアルゴリズムによるDHT入門ChordアルゴリズムによるDHT入門
ChordアルゴリズムによるDHT入門Hiroya Nagao
 

Destacado (10)

【18-C-2】オラクル統合後の Java の今後について
【18-C-2】オラクル統合後の Java の今後について【18-C-2】オラクル統合後の Java の今後について
【18-C-2】オラクル統合後の Java の今後について
 
Microsoft Love Java & OSS
Microsoft Love Java & OSSMicrosoft Love Java & OSS
Microsoft Love Java & OSS
 
Grizzly1.9.3x
Grizzly1.9.3xGrizzly1.9.3x
Grizzly1.9.3x
 
おまえらこのライブラリ使ってないの? m9 (2013-07)
おまえらこのライブラリ使ってないの? m9	(2013-07)おまえらこのライブラリ使ってないの? m9	(2013-07)
おまえらこのライブラリ使ってないの? m9 (2013-07)
 
オープンデータ動向 2013年8月
オープンデータ動向 2013年8月オープンデータ動向 2013年8月
オープンデータ動向 2013年8月
 
じっくりコトコト煮込んだJavaスープ
じっくりコトコト煮込んだJavaスープじっくりコトコト煮込んだJavaスープ
じっくりコトコト煮込んだJavaスープ
 
5分で作るMySQL Cluster環境
5分で作るMySQL Cluster環境5分で作るMySQL Cluster環境
5分で作るMySQL Cluster環境
 
Hadoop and Storm - AJUG talk
Hadoop and Storm - AJUG talkHadoop and Storm - AJUG talk
Hadoop and Storm - AJUG talk
 
Java EE 7 multi factor authentiaction with Microsoft Azure AD
Java EE 7 multi factor authentiaction with Microsoft Azure ADJava EE 7 multi factor authentiaction with Microsoft Azure AD
Java EE 7 multi factor authentiaction with Microsoft Azure AD
 
ChordアルゴリズムによるDHT入門
ChordアルゴリズムによるDHT入門ChordアルゴリズムによるDHT入門
ChordアルゴリズムによるDHT入門
 

Similar a Java puzzlers 2013 at JavaFesta Japan

Javaセキュアコーディングセミナー東京第4回講義
Javaセキュアコーディングセミナー東京第4回講義Javaセキュアコーディングセミナー東京第4回講義
Javaセキュアコーディングセミナー東京第4回講義JPCERT Coordination Center
 
Javaセキュアコーディングセミナー東京第3回演習の解説
Javaセキュアコーディングセミナー東京第3回演習の解説Javaセキュアコーディングセミナー東京第3回演習の解説
Javaセキュアコーディングセミナー東京第3回演習の解説JPCERT Coordination Center
 
ネイティブコードを語る
ネイティブコードを語るネイティブコードを語る
ネイティブコードを語るKenji Imasaki
 
20190625 OpenACC 講習会 第3部
20190625 OpenACC 講習会 第3部20190625 OpenACC 講習会 第3部
20190625 OpenACC 講習会 第3部NVIDIA Japan
 
Javaセキュアコーディングセミナー東京第3回演習
Javaセキュアコーディングセミナー東京第3回演習Javaセキュアコーディングセミナー東京第3回演習
Javaセキュアコーディングセミナー東京第3回演習JPCERT Coordination Center
 
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_cccJEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_cccYujiSoftware
 
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。Satoshi Mimura
 
Java9直前!最近のJava復習ハンズオン
Java9直前!最近のJava復習ハンズオンJava9直前!最近のJava復習ハンズオン
Java9直前!最近のJava復習ハンズオンHiroto Yamakawa
 
Effective java 勉強会
Effective java 勉強会Effective java 勉強会
Effective java 勉強会Takinami Kei
 
ATN No.2 大阪から来たJavaPuzzlers
ATN No.2 大阪から来たJavaPuzzlersATN No.2 大阪から来たJavaPuzzlers
ATN No.2 大阪から来たJavaPuzzlersAdvancedTechNight
 
【Unity道場スペシャル 2017札幌】乱数完全マスター
【Unity道場スペシャル 2017札幌】乱数完全マスター 【Unity道場スペシャル 2017札幌】乱数完全マスター
【Unity道場スペシャル 2017札幌】乱数完全マスター Unity Technologies Japan K.K.
 
Let's scale-out PostgreSQL using Citus (Japanese)
Let's scale-out PostgreSQL using Citus (Japanese)Let's scale-out PostgreSQL using Citus (Japanese)
Let's scale-out PostgreSQL using Citus (Japanese)Noriyoshi Shinoda
 
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編【Unity道場スペシャル 2017京都】乱数完全マスター 京都編
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編Unity Technologies Japan K.K.
 
[TL06] 日本の第一人者が C# の現状と今後を徹底解説! 「この素晴らしい C# に祝福を!」
[TL06] 日本の第一人者が C# の現状と今後を徹底解説! 「この素晴らしい C# に祝福を!」[TL06] 日本の第一人者が C# の現状と今後を徹底解説! 「この素晴らしい C# に祝福を!」
[TL06] 日本の第一人者が C# の現状と今後を徹底解説! 「この素晴らしい C# に祝福を!」de:code 2017
 
for JSDeferred Code Reading
for JSDeferred Code Readingfor JSDeferred Code Reading
for JSDeferred Code ReadingKenichirou Oyama
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?Moriharu Ohzu
 

Similar a Java puzzlers 2013 at JavaFesta Japan (20)

Javaセキュアコーディングセミナー東京第4回講義
Javaセキュアコーディングセミナー東京第4回講義Javaセキュアコーディングセミナー東京第4回講義
Javaセキュアコーディングセミナー東京第4回講義
 
Javaセキュアコーディングセミナー東京第3回演習の解説
Javaセキュアコーディングセミナー東京第3回演習の解説Javaセキュアコーディングセミナー東京第3回演習の解説
Javaセキュアコーディングセミナー東京第3回演習の解説
 
ネイティブコードを語る
ネイティブコードを語るネイティブコードを語る
ネイティブコードを語る
 
20190625 OpenACC 講習会 第3部
20190625 OpenACC 講習会 第3部20190625 OpenACC 講習会 第3部
20190625 OpenACC 講習会 第3部
 
Javaセキュアコーディングセミナー東京第3回演習
Javaセキュアコーディングセミナー東京第3回演習Javaセキュアコーディングセミナー東京第3回演習
Javaセキュアコーディングセミナー東京第3回演習
 
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_cccJEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
JEP280: Java 9 で文字列結合の処理が変わるぞ!準備はいいか!? #jjug_ccc
 
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
 
Java9直前!最近のJava復習ハンズオン
Java9直前!最近のJava復習ハンズオンJava9直前!最近のJava復習ハンズオン
Java9直前!最近のJava復習ハンズオン
 
Effective java 勉強会
Effective java 勉強会Effective java 勉強会
Effective java 勉強会
 
ATN No.2 大阪から来たJavaPuzzlers
ATN No.2 大阪から来たJavaPuzzlersATN No.2 大阪から来たJavaPuzzlers
ATN No.2 大阪から来たJavaPuzzlers
 
Introduction of Python
Introduction of PythonIntroduction of Python
Introduction of Python
 
Java勉強会2017.3.17
Java勉強会2017.3.17Java勉強会2017.3.17
Java勉強会2017.3.17
 
【Unity道場スペシャル 2017札幌】乱数完全マスター
【Unity道場スペシャル 2017札幌】乱数完全マスター 【Unity道場スペシャル 2017札幌】乱数完全マスター
【Unity道場スペシャル 2017札幌】乱数完全マスター
 
Boost Tour 1.50.0 All
Boost Tour 1.50.0 AllBoost Tour 1.50.0 All
Boost Tour 1.50.0 All
 
Clojure
ClojureClojure
Clojure
 
Let's scale-out PostgreSQL using Citus (Japanese)
Let's scale-out PostgreSQL using Citus (Japanese)Let's scale-out PostgreSQL using Citus (Japanese)
Let's scale-out PostgreSQL using Citus (Japanese)
 
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編【Unity道場スペシャル 2017京都】乱数完全マスター 京都編
【Unity道場スペシャル 2017京都】乱数完全マスター 京都編
 
[TL06] 日本の第一人者が C# の現状と今後を徹底解説! 「この素晴らしい C# に祝福を!」
[TL06] 日本の第一人者が C# の現状と今後を徹底解説! 「この素晴らしい C# に祝福を!」[TL06] 日本の第一人者が C# の現状と今後を徹底解説! 「この素晴らしい C# に祝福を!」
[TL06] 日本の第一人者が C# の現状と今後を徹底解説! 「この素晴らしい C# に祝福を!」
 
for JSDeferred Code Reading
for JSDeferred Code Readingfor JSDeferred Code Reading
for JSDeferred Code Reading
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
 

Más de Yoshio Terada

AI-Java-for-Financial.pdf
AI-Java-for-Financial.pdfAI-Java-for-Financial.pdf
AI-Java-for-Financial.pdfYoshio Terada
 
Java-Virtual-Thread-LT.pdf
Java-Virtual-Thread-LT.pdfJava-Virtual-Thread-LT.pdf
Java-Virtual-Thread-LT.pdfYoshio Terada
 
Cloud Native Architecture ことはじめ 最適な実行環境を選ぶポイント
Cloud Native Architecture ことはじめ 最適な実行環境を選ぶポイントCloud Native Architecture ことはじめ 最適な実行環境を選ぶポイント
Cloud Native Architecture ことはじめ 最適な実行環境を選ぶポイントYoshio Terada
 
Jakarta EE Microproile Update JJUG 2020 May
Jakarta EE Microproile Update JJUG 2020 MayJakarta EE Microproile Update JJUG 2020 May
Jakarta EE Microproile Update JJUG 2020 MayYoshio Terada
 
Azure RedHat OpenShift - Red Hat Forum 2019
Azure RedHat OpenShift - Red Hat Forum 2019Azure RedHat OpenShift - Red Hat Forum 2019
Azure RedHat OpenShift - Red Hat Forum 2019Yoshio Terada
 
JakartaOne 2020 Japan Announce
JakartaOne 2020 Japan AnnounceJakartaOne 2020 Japan Announce
JakartaOne 2020 Japan AnnounceYoshio Terada
 
Jjug CCC 2019 Fall Azure Spring Cloud
Jjug CCC 2019 Fall Azure Spring CloudJjug CCC 2019 Fall Azure Spring Cloud
Jjug CCC 2019 Fall Azure Spring CloudYoshio Terada
 
Sapporo Developer Festa 2019
Sapporo Developer Festa 2019Sapporo Developer Festa 2019
Sapporo Developer Festa 2019Yoshio Terada
 
AKS (k8s) Hands on Lab Contents
AKS (k8s) Hands on Lab ContentsAKS (k8s) Hands on Lab Contents
AKS (k8s) Hands on Lab ContentsYoshio Terada
 
Oisix ra Daichi Microservice with Kubernetes
Oisix ra Daichi Microservice with Kubernetes Oisix ra Daichi Microservice with Kubernetes
Oisix ra Daichi Microservice with Kubernetes Yoshio Terada
 
Virtual Kubelet and Virtual Node
Virtual Kubelet and Virtual NodeVirtual Kubelet and Virtual Node
Virtual Kubelet and Virtual NodeYoshio Terada
 
Japan Container Day 2018
Japan Container Day 2018Japan Container Day 2018
Japan Container Day 2018Yoshio Terada
 
Java on Kubernetes on Azure
Java on Kubernetes on AzureJava on Kubernetes on Azure
Java on Kubernetes on AzureYoshio Terada
 
The Experience of Java on Kubernetes with Microservices from HackFest
The Experience of Java on Kubernetes with Microservices from HackFestThe Experience of Java on Kubernetes with Microservices from HackFest
The Experience of Java on Kubernetes with Microservices from HackFestYoshio Terada
 
Application Development Vision
Application Development VisionApplication Development Vision
Application Development VisionYoshio Terada
 
How to face the Kubernetes ?
How to face the Kubernetes ? How to face the Kubernetes ?
How to face the Kubernetes ? Yoshio Terada
 
JavaOne 2016 Report for Java EE
JavaOne 2016 Report for Java EEJavaOne 2016 Report for Java EE
JavaOne 2016 Report for Java EEYoshio Terada
 
Istio on k8s on Azure (AKS)
Istio on k8s on Azure (AKS)Istio on k8s on Azure (AKS)
Istio on k8s on Azure (AKS)Yoshio Terada
 

Más de Yoshio Terada (20)

AI-Java-for-Financial.pdf
AI-Java-for-Financial.pdfAI-Java-for-Financial.pdf
AI-Java-for-Financial.pdf
 
Java-Virtual-Thread-LT.pdf
Java-Virtual-Thread-LT.pdfJava-Virtual-Thread-LT.pdf
Java-Virtual-Thread-LT.pdf
 
Cloud Native Architecture ことはじめ 最適な実行環境を選ぶポイント
Cloud Native Architecture ことはじめ 最適な実行環境を選ぶポイントCloud Native Architecture ことはじめ 最適な実行環境を選ぶポイント
Cloud Native Architecture ことはじめ 最適な実行環境を選ぶポイント
 
Jakarta EE Microproile Update JJUG 2020 May
Jakarta EE Microproile Update JJUG 2020 MayJakarta EE Microproile Update JJUG 2020 May
Jakarta EE Microproile Update JJUG 2020 May
 
Azure RedHat OpenShift - Red Hat Forum 2019
Azure RedHat OpenShift - Red Hat Forum 2019Azure RedHat OpenShift - Red Hat Forum 2019
Azure RedHat OpenShift - Red Hat Forum 2019
 
JakartaOne 2020 Japan Announce
JakartaOne 2020 Japan AnnounceJakartaOne 2020 Japan Announce
JakartaOne 2020 Japan Announce
 
Jjug CCC 2019 Fall Azure Spring Cloud
Jjug CCC 2019 Fall Azure Spring CloudJjug CCC 2019 Fall Azure Spring Cloud
Jjug CCC 2019 Fall Azure Spring Cloud
 
Sapporo Developer Festa 2019
Sapporo Developer Festa 2019Sapporo Developer Festa 2019
Sapporo Developer Festa 2019
 
AKS (k8s) Hands on Lab Contents
AKS (k8s) Hands on Lab ContentsAKS (k8s) Hands on Lab Contents
AKS (k8s) Hands on Lab Contents
 
Java on Azure 2019
Java on Azure 2019Java on Azure 2019
Java on Azure 2019
 
Java on Azure 2019
Java on Azure 2019Java on Azure 2019
Java on Azure 2019
 
Oisix ra Daichi Microservice with Kubernetes
Oisix ra Daichi Microservice with Kubernetes Oisix ra Daichi Microservice with Kubernetes
Oisix ra Daichi Microservice with Kubernetes
 
Virtual Kubelet and Virtual Node
Virtual Kubelet and Virtual NodeVirtual Kubelet and Virtual Node
Virtual Kubelet and Virtual Node
 
Japan Container Day 2018
Japan Container Day 2018Japan Container Day 2018
Japan Container Day 2018
 
Java on Kubernetes on Azure
Java on Kubernetes on AzureJava on Kubernetes on Azure
Java on Kubernetes on Azure
 
The Experience of Java on Kubernetes with Microservices from HackFest
The Experience of Java on Kubernetes with Microservices from HackFestThe Experience of Java on Kubernetes with Microservices from HackFest
The Experience of Java on Kubernetes with Microservices from HackFest
 
Application Development Vision
Application Development VisionApplication Development Vision
Application Development Vision
 
How to face the Kubernetes ?
How to face the Kubernetes ? How to face the Kubernetes ?
How to face the Kubernetes ?
 
JavaOne 2016 Report for Java EE
JavaOne 2016 Report for Java EEJavaOne 2016 Report for Java EE
JavaOne 2016 Report for Java EE
 
Istio on k8s on Azure (AKS)
Istio on k8s on Azure (AKS)Istio on k8s on Azure (AKS)
Istio on k8s on Azure (AKS)
 

Último

Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールsugiuralab
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directoryosamut
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価sugiuralab
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 

Último (7)

Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
 
プレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツールプレイマットのパターン生成支援ツール
プレイマットのパターン生成支援ツール
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
 
プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価プレイマットのパターン生成支援ツールの評価
プレイマットのパターン生成支援ツールの評価
 
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 

Java puzzlers 2013 at JavaFesta Japan

  • 1. JJaavvaa PPuuzzzzlleerrss AAttttaacckk ooff tthhee OObbjjeecctt##CClloonnee 櫻庭 祐一 寺田 佳央
  • 2. コード中に発生する勘違い —  JJaavvaa プログラミングのパズル —  奇妙な振る舞いをする小さなプログラム —  複数の選択肢から、何が表示される? —  ミステリーの解明 —  問題の解決方法 —  教訓
  • 3. ルール:全て4択です public class JavaPuzzlers {
   public static void main(String... args) { "     http://www.java-users.jp   "     System.out.println(“Japan Java User Group Presents!”); } " } " 11))  22))  33))  44))  JJaappaann JJaavvaa UUsseerrss GGrroouupp PPrreesseennttss!! JJaavvaa PPuuzzzzlleerrss 00xxccaaffeebbaabbee その他 全員参加です
  • 5. 1.. FFiinnddRRoooottss class Ancestor {" String name = "祖先”;" 1)  祖先:祖先 String getName() {return name;}" 2)  ⼦子孫:⼦子孫 }" 3)  祖先:⼦子孫 class Descendant extends Ancestor {" 4)  ⼦子孫:祖先 String name = "子孫";" @Override" String getName() {return name;}" }" " public class FindRoots {" public static void main(String argv[]) {" Ancestor person = new Descendant();" System.out.println(" person.name + ":" + person.getName());" }" }"
  • 7. 1.. FFiinnddRRoooottss class Ancestor {" String name = "祖先”;" String getName() {return name;}" }" 3)  祖先:⼦子孫 class Descendant extends Ancestor {" String name = "子孫";" @Override" String getName() {return name;}" }" " public class FindRoots {" public static void main(String argv[]) {" Ancestor person = new Descendant();" System.out.println(" person.name + ":" + person.getName());" }" }"
  • 8. 11.解説 —  フィールドはコンパイル時に親クラスの情報を引き継ぎます —  メソッドは実行時に上書きしたメソッドを呼び出します —  仮にどうしても子のフィールドにアクセスしたい場合、    キャストして取得します
  • 9. 1.. 解決方法 class Ancestor {" String name = "祖先”;" String getName() {return name;}" }" 3)  祖先:⼦子孫 class Descendant extends Ancestor {" String name = "子孫";" @Override" String getName() {return name;}" }" " public class FindRoots {" public static void main(String argv[]) {" Ancestor person = new Descendant();" System.out.println(" ((Descendant)person).name + ":" + person.getName());" }" }"
  • 10. 1.教訓 —  フィールドは隠蔽し直接アクセスしないようにしてください
  • 12. 22.MMaajjoorriittyyVVoottee 11))  YYEESS 22))  NNOO 33)) 場合による 44)) tthhrrooww EExxcceeppttiioonn public class MajorityVote {" public static void main(String... args) {"    Random[] randoms = new Random[10];"     for (int i = 0; i < 10; i++)"      randoms[i] = new Random(System.currentTimeMillis());" " int count = 0;"     boolean option = randoms[0].nextBoolean();"     for (int i = 1; i < 10; i++)"       if (option == randoms[i].nextBoolean()) count++;" "     System.out.println((count > 5)? "YES": "NO");"   }" }"
  • 14. 22.MMaajjoorriittyyVVoottee 11))  YYEESS public class MajorityVote {" public static void main(String... args) {"    Random[] randoms = new Random[10];"     for (int i = 0; i < 10; i++)"      randoms[i] = new Random(System.currentTimeMillis());" " int count = 0;"     boolean option = randoms[0].nextBoolean();"     for (int i = 1; i < 10; i++)"       if (option == randoms[i].nextBoolean()) count++;" "     System.out.println((count > 5)? "YES": "NO");"   }" }"
  • 15. 22.解説 —  RRaannddoommのコンストラクタは、乱数シードを指定します —  ループは11 ミリ秒の間に処理が完了します → 乱数シードが全て同一となります —  デフォルトコンスタクタはSSyysstteemm..nnaannooTTiimmee(())を使用   します
  • 16. 22.. 解決方法 public class MajorityVote {" public static void main(String... args) {"    Random[] randoms = new Random[10];"     for (int i = 0; i < 10; i++)"      randoms[i] = new Random();" " int count = 0;"     boolean option = randoms[0].nextBoolean();"     for (int i = 1; i < 10; i++)"       if (option == randoms[i].nextBoolean()) count++;" "     System.out.println((count > 5)? "YES": "NO");"   }" }"
  • 17. 22.教訓 —  デフォルトのコンストラクタを使用してください —  テスト時など乱数系列をあえて同一にするテクニックもあり ます
  • 19. 33.CCuuttAAnnddPPaassttee 11)) 112233 22)) 112233445566 public class CutAndPaste{
 33)) コンパイル・エラー public static void main(String... argv) {" 44)) ランタイム・エラー    String firstLine = "1,2,3";
   String secondLine = "4,5,6";
    List<String> firstList = "   Arrays.asList(firstLine.split(”,"));
 List<String> secondList = " Arrays.asList(secondLine.split(”,"));
    firstList.addAll(secondList);
    for(String data : firstList){
   System.out.print(data);
    }
   }
 }"
  • 21. 33.CCuuttAAnnddPPaassttee public class CutAndPaste {
 public static void main(String argv[]){" 44)) ランタイム・エラー    String firstLine = "1,2,3";
   String secondLine = "4,5,6";
    List<String> firstList = " "Arrays.asList(firstLine.split(","));
   List<String> secondList =" "Arrays.asList(secondLine.split(","));
    firstList.addAll(secondList);
    for(String data : firstList){
   System.out.print(data);
    }
   }
 }" UUnnssuuppppoorrtteeddOOppeerraattiioonnEExxcceeppttiioonn を送出
  • 22. 33.. 解説 —  AArrrraayyss..aassLLiisstt は固定サイズのリストを生成します —  aassLLiisstt(())で取得したリストに対して,, aadddd,, aaddddAAllll 等は     実行できません
  • 23. 33.. 解決方法 public class CutAndPaste {
 public static void main(String argv[]) {"    String firstLine = "1,2,3";
   String secondLine = "4,5,6";
    List<String> firstList = new ArrayList<>("   Arrays.asList(firstLine.split(",")));
 List<String> secondList = " Arrays.asList(secondLine.split(","));
    firstList.addAll(secondList);
    for(String data : firstList){
   System.out.print(data);
    }
   }
 }" 固定サイズのリストから、新たな可変リストを生成
  • 24. 33.. 教訓 —  可変のリストを作成したい場合は、固定サイズのリストより 新たな可変リストのコピーを生成します
  • 26. 44.. WWaallttzzRRhhyytthhmm public class WaltzRhythm {" public static void main(String... args) {" int count = 0;" for (int i = 0; i < Integer.MAX_VALUE; i += 3) {" count++;" }" System.out.println(count);" }" }" 11)) 771155882277888822 ((== IInntteeggeerr..MMAAXX__VVAALLUUEE//33)) 22)) 771155882277888833 ((== IInntteeggeerr..MMAAXX__VVAALLUUEE//33 ++ 11)) 33)) 無限ループ 44)) それ以外
  • 28. 44.. WWaallttzzRRhhyytthhmm public class WaltzRhythm {" public static void main(String... args) {" int count = 0;" for (int i = 0; i < Integer.MAX_VALUE; i += 3) {" count++;" }" System.out.println(count);" }" }" 44)) それ以外 ((--771155882277888833))
  • 29. 44.. 解説 —  IInntteeggeerr..MMAAXX__VVAALLUUEE == 22114477448833664477 —  ffoorr ((iinntt ii == 00;; ii << IInntteeggeerr..MMAAXX__VVAALLUUEE ;; ii ++== 33)) {{ —  ++33 インクリメントし ccoouunntt として771155882277888822を期待します counter 1 2 3 4 5 6 7 0 3 6 9 12 15 18 i 715827883 ・・・・・・・・・ 2147483646 —  CCoouunntteerr がオーバフロー —  ffoorr 文の終了条件までIInntteeggeerr..MMIINN__VVAALLUUEE -->> IInntteeggeerr..MMAAXX__VVAALLUUEE を繰り返し ます
  • 30. 44.. 解説 ffoorr ((iinntt ii == 00;; ii << IInntteeggeerr..MMAAXX__VVAALLUUEE ;; ii ++== 33)) counter 1 2 3 4 5 6 7 715827883 i 0 3 6 9 12 15 18 ・・・・・・・・・ 2147483646 MAX_VALUE -1 counter 715827884 i 715827885 2147483642 2147483645 -2147483647 -2147483647 ・・・・・・・・・ MIN_VALUE +2 counter -2147483647 -2147483646 i 2147483647 -2147483648 MAX_VALUE -2 -715827884 -715827883 2147483641 2147483644 -2147483648 -2147483645 ・・・・・・・・・ MIN_VALUE +1
  • 31. 44.. 解決方法 public class WaltzRhythm {" public static void main(String... args) {" int count = 0;" for (int i = 0; i < Integer.MAX_VALUE -3 ; i += 3) {" count++;" }" System.out.println(count);" }" }"
  • 32. 44.. 教訓 —  bbyyttee,, cchhaarr,, iinntt ,, lloonngg ((プリミティブ型)) を扱う場合、   桁のオーバフローを考慮した実装が必要です —  オーバフローを引き起こさないために BBiiggIInntteeggeerr を使う方 法もあります
  • 34. 55.. UUppppeerrLLoowweerrMMaattcchh public class UpperLowerMatch {" public static void main(String argv[]){" Integer a1 = 10; Integer a2 = 129;" int b1 = 10; int b2 = 129;" Integer c1 = 10; Integer c2 = 129;" " System.out.print((a1==b1));" System.out.print("t”+(a1==c1));" " System.out.print("t”+(a2==b2));" System.out.println("t”+(a2==c2));" 11)) ttrruuee ttrruuee ttrruuee ttrruuee }" 22)) ffaallssee ttrruuee ffaallssee ttrruuee 33)) ttrruuee ffaallssee ttrruuee ffaallssee 44)) ttrruuee ttrruuee ttrruuee ffaallssee
  • 36. 55.. UUppppeerrLLoowweerrMMaattcchh public class UpperLowerMatch {" public static void main(String argv[]){" Integer a1 = 10; Integer a2 = 129;" int b1 = 10; int b2 = 129;" Integer c1 = 10; Integer c2 = 129;" " System.out.print((a1==b1));" System.out.print("t”+(a1==c1));" " System.out.print("t”+(a2==b2));" System.out.println("t”+(a2==c2));" }" 44)) ttrruuee ttrruuee ttrruuee ffaallssee
  • 37. 55.. 解説 —  AAuuttooBBooxxiinngg —  プリミティブとオブジェクトの比較は、プリミティブで計算し比較 —  オブジェクトとオブジェクトの比較は、オブジェクトの参照で比較 —  JJaavvaa..llaanngg..IInntteeggeerr は--112288 から 112277 の値の範囲でオブ ジェクト IIDDの値をキャッシュしており、その比較を実施し ます —  つまり値が --112288 から 112277 の範囲か否かで結果が異なります Cache to support the object identity semantics of autoboxing for values between -128 and 127 (inclusive) as required by JLS. " キャッシュ範囲は -XX:AutoBoxCacheMax で変更可能"
  • 38. 55.. 解決方法 public class UpperLowerMatch {" public static void main(String argv[]){" Integer a1 = 10; Integer a2 = 129;" int b1 = 10; int b2 = 129;" Integer c1 = 10; Integer c2 = 129;" " System.out.print((a1==b1));" System.out.print("t” + (a1.intValue()==c1.intValue()));" " System.out.print("t” + (a2==b2));" System.out.println((a2.intValue()==c2.intValue()));" }"
  • 39. 55.. 教訓 —  オートボクシングを使え便利になっていますが、       比較においては、pprriimmiittiivvee と OObbjjeecctt の比較は      十分に注意してください —  IInntteeggeerr の比較を行う際には iinnttVVaalluuee(()) での比較をお薦め します
  • 41. 66.. WWrraappWWrraappWWrraapp 11))  22))  33))  44))  66 112233 CCoommppiillee EErrrroorr tthhrrooww EExxcceeppttiioonn public class WrapWrapWrap<T> {" String wrap(Collection<?> objs) {" String result = "";" for (Object o: objs) result += o;" return result;" } " int wrap(List<Integer> numbers) {" int result = 0;" for (int num: numbers) result += num;" return result;" } " public static void main(String... args) {" List<String> strings = Arrays.asList("1", "2", "3");" System.out.println(new WrapWrapWrap().wrap(strings));" }" }"
  • 43. 66.. WWrraappWWrraappWWrraapp public class WrapWrapWrap<T> {" String wrap(Collection<?> objs) {" 44)) tthhrrooww EExxcceeppttiioonn String result = "";" for (Object o: objs) result += o;" return result;" } " int wrap(List<Integer> numbers) {" int result = 0;" for (int num: numbers) result += num;" return result;" } " public static void main(String... args) {" List<String> strings = Arrays.asList("1", "2", "3");" System.out.println(new WrapWrapWrap().wrap(strings));" }" }"
  • 44. 66.. 解説 —  ジェネリクスを指定しない場合、RRaaww 型といいます —  RRaaww 型の場合、ジェネリクスの型情報が消失します つまり以下のクラスと同様になります public class WrapWrapWrap {" String wrap(Collection objs) {...} int wrap(List numbers) {...} " ..." }" " —  そのため、SSttrriinngg のリストでも、iinntt wwrraapp((LLiisstt nnuummbbeerrss))が    実行され、実行時にCCllaassssCCaassttEExxcceeppttiioonnが発生します
  • 45. 66.. 解決方法 public class WrapWrapWrap<T> {" String wrap(Collection<?> objs) {" String result = "";" for (Object o: objs) result += o;" return result;" }" int wrap(List<Integer> numbers) {" int result = 0;" for (int num: numbers) result += num;" return result;" }" public static void main(String... args) {" List<String> strings = Arrays.asList("1", "2", "3");" System.out.println(new WrapWrapWrap<String>().wrap(strings));" }" }"
  • 46. 66.. 教訓 —  ジェネリクスのパラメータは正しく指定しましょう —  JJaavvaa SSEE 77 からはダイヤモンド演算子が利用可能です
  • 48. 77.. LLoossttAAnnddFFoouunndd JJaavvaa SSEE 6で実行 public class LostAndFound {" static int getArticles(List<String> list) { return 100; }" static long getArticles(List<Integer> list) { return 200; }" public static void main(String argv[]){" List<String> listStr = new ArrayList<String>();" List<Integer> listInt = new ArrayList<Integer>();" System.out.println(getArticles(listStr));" System.out.println(getArticles(listInt));" }" }" 1)  100  ,  200 2)  200  ,  100 3)  コンパイルエラー 4)  ランタイムエラー
  • 50. 77.. LLoossttAAnnddFFoouunndd JJaavvaa SSEE 6で実行 public class LostAndFound {" static int getArticles(List<String> list){ return 100;}" static long getArticles(List<Integer> list) { return 200; }" public static void main(String argv[]){" List<String> listStr = new ArrayList<String>();" List<Integer> listInt = new ArrayList<Integer>();" System.out.println(getArticles(listStr));" System.out.println(getArticles(listInt));" }" }" 4)  ランタイムエラー
  • 51. 77.. 解説 —  TTyyppee EErraassuurree :: —  ジェネリクスはコンパイル時に解決され、コンパイル後型情報 は消えます。そのためこれをイレイジャ方式と呼びます —  JJDDKK 55,, 66 では、同じイレイジャ・シグネチャを持つ、異な る返り値を持つメソッドの定義が可能でしたが、これは間違 いで、JJDDKK 77 で修正されました。((RRFFEE :: 66118822995500))
  • 52. 77.. 解決策 JJaavvaa SSEE 77で実行 public class LostAndFound {" static int getArticles(List<String> list) { return 100; }" static long getArticles(List<Integer> list) { return 200; }" public static void main(String argv[]){" List<String> listStr = new ArrayList<>();" List<Integer> listInt = new ArrayList<>();" System.out.println(getArticles(listStr));" System.out.println(getArticles(listInt));" }" }"
  • 53. 77.. 教訓 —  JJaavvaa SSEE 77 へ移行してください ((コンパイルエラー)) LostAndFound.java:8: エラー: 名前が競合しています。 getArticles(List<Integer>)とgetArticles(List<String>)は削除後の名前が 同じです static long getArticles(List<Integer> list) { return 200; }" ^" エラー1個 —  JJaavvaa のバージョン・アップ時には JJaavvaa の互換性・非互換 性情報も必ずご確認ください http://www.oracle.com/technetwork/java/javase/ compatibility-417013.html#incompatibilities
  • 54. JJaavvaa PPuuzzzzlleerrss AAttttaacckk ooff tthhee OObbjjeecctt##CClloonnee 櫻庭 祐一 寺田 佳央