オートアンボクシング

20 04 2010
  1. public static void main(String[] args){
  2.     Boolean b = new Boolean ("true");
  3.     System.out.println(b?"t":"f");
  4. }
t
広告




変数の初期化

19 04 2010
インスタンス変数(メンバ変数)は変数の宣言時に自動でデフォルト値が入る

参照変数 null
byte,short,int,long 0
float,double 0.0
boolean false
char ‘\u0000’

ローカル変数については何も入らないので初期化すべし

インスタンスな配列については
int[] array;←この時点でnull値。オブジェクトだかららしい。
array = new int[5];←この時点で全ての要素にintの初期値,0が入る。

  1. static int[] a;
  2. public static void main(String[] args){
  3.     System.out.println(a==null?"a is null":"");
  4.     a=new int[1];
  5.         System.out.println(a[0]);
  6. }

a is null
0

 

  1. class tes{
  2.     private int num=0;
  3.     void setNum(int x){
  4.         num=x;
  5.     }
  6.     int getNum(){
  7.         return num;
  8.     }
  9. }
  10. public class test {
  11.     public static void main(String[] args){
  12.         tes a = new tes();
  13.         tes b = a;
  14.         b.setNum(100);
  15.         int c=a.getNum();
  16.         int d=b.getNum();
  17.         System.out.println(c+"+"+d);
  18.     }
  19. }
100+100




ダウンキャスト

10 02 2010
アップキャストする場合は暗黙でOK
ダウンキャストする場合は予めアップキャストされたもの
ifとinstanceofで中身確認してからだと確実
みすったダウンキャストはコンパイルは通るけど例外が投げられる




うん

7 02 2010
  1. abstract class Animal{}
  2. class Bear extends Animal{}
  3. public class Test {
  4.     Animal go(){
  5.         return new Bear();
  6.     }
  7.     public static void main(String[] args){
  8.         Test test=new Test();
  9.         if(test.go() instanceof Animal){
  10.             System.out.println("Animal型です");
  11.         }
  12.     }
  13. }
  14. //Animal型です

BearはAnimalを継承
戻り値を暗黙的にキャストできるらしい





さて

7 02 2010
共変戻り値のてすと

  1. class Alpha{
  2.     Alpha doStuff(){
  3.         return new Alpha();
  4.     }
  5. }
  6. public class Beta extends Alpha {
  7.     Beta doStuff(){
  8.         return new Beta();
  9.     }
  10.     public static void main(String[] args){
  11.         Beta beta=new Beta();
  12.         if(beta.doStuff() instanceof Beta){
  13.             System.out.println("Beta型です");
  14.         }
  15.         Alpha alpha=new Alpha();
  16.         if(alpha.doStuff() instanceof Alpha){
  17.             System.out.println("Alpha型です");
  18.         }
  19.         Alpha alta=new Beta();
  20.         if(alta.doStuff() instanceof Beta){
  21.             System.out.println("Beta型です");
  22.         }
  23.     }
  24. }
  25. //Beta型です
  26. //Alpha型です
  27. //Beta型です

つまりだー
オーバーライドは戻り型も正確に一致させないといけないはずなんだけど
Java1.5ではスーパークラスのメソッドに宣言された戻り値型のサブタイプに変更するのはOKなんだってー