javaSE筆記試験問題のまとめ

8118 ワード


目次
基本データタイプとそれに対応するオブジェクト類の比較  
FloatとDoubleの微妙な関係
i++と+i
final
continue lableとbreak lableの考察
ブロック、スタティックブロック、スタティック属性の出力順序を構成する方法。
方法スタック
try-finallyの戻り値
  • 基本データタイプとその対応するオブジェクトタイプの比較  
  • Integer  a = 25;
    Integer  b = 25;
    System.out.println(a == b);              answer:true
    System.out.println(a.equals(b));         answer:true
    System.out.println(a.equals("25"));      answer:false
    System.out.println(a.equals(25));        answer:true
    
    Integer  a = 135;
    Integer  b = 135;
    System.out.println(a == b);               answer:false
    System.out.println(a.equals(b));          answer:true
    System.out.println(a.equals("135"));      answer:false
    System.out.println(a.equals(135));        answer:true
    
    
    Integer a = new Integer(25);
    Integer b = new Integer(25);
    Long c = new Long(25);
    System.out.println(a == b);              answer:false
    System.out.println(a == 25);             answer:true //  Integer     ,   int, 
                                                                   
    System.out.println(c == 25);             answer:true //Long    ,int      long 
                                                                
    System.out.println(a.equals(b));         answer:true
    System.out.println(a.equals("25"));      answer:false
    System.out.println(a.equals(25));        answer:true
    
    
    Short a = 25;
    Short b = 25;
    System.out.println(a == b);              answer:true
    System.out.println(a.equals(b));         answer:true
    System.out.println(a.equals("25"));      answer:false
    System.out.println(a.equals(25));        answer:false
    
    P.S以下はInteger類のequalsソースとIntegerの自動箱詰めで呼び出されたValueOfメソッドです。またShotのequalsメソッドも列挙しました。
    //Integer equal  
    public boolean equals(Object obj) {
            if (obj instanceof Integer) {
                return value == ((Integer)obj).intValue();
            }
            return false;
        }
    //       
        public static Integer valueOf(int i) {
            if (i >= IntegerCache.low && i <= IntegerCache.high)  //IntegerCache.low = -128
                return IntegerCache.cache[i + (-IntegerCache.low)];//IntegerCache.high = 127
            return new Integer(i);
        }
    //Short  equals  
     public boolean equals(Object obj) {
            if (obj instanceof Short) {
                return value == ((Short)obj).shortValue();
            }
            return false;
        }
    (1)Integer類equalsソース:ObjではなくStringタイプであれば、直接falseに戻ります。Shottと同じです。
    (2)JVMは8種類の基本タイプの常量池を自動的に維持し、int定数池では-128~127の範囲を初期化しますので、Integer i=127の場合、自動箱詰め中は定数池の値を取っていますが、Integer i=128の場合は定数池の範囲内にないので、自動箱詰め中はnew 128が必要です。
  • FloatとDoubleとの微妙な関係
    float i = 25; //    
    Float i = 25; //    
    Float i = 25f;//    
    float i = 25.5;//    
    float i = 25.5f;//    
    float i = 42E3;//    
    double i = 42E3;//    
    float i = 25.5D//    
    double i = 25.5D//    
    double i = 25.5//    
    ----------------------------------------------------------------------
    float i = 25;
    System.out.print(i == 25);//true
    
     
  • i++i
  • public class Test{
    
     public static void main(String [] args){
    
      int i = 1;
    
      int s = ++i;
    
      int x= i++;
    
      System.out.printLn(i);//3
    
      System.out.printLn(s);//2
    
      System.out.printLn(x);//2
    
     }
    
    }
     PS:+iは変更しても変数を変更します。i++は辺iだけ変更して、変数を変更しません。
  • final
  • class finalTest{ 
        final int i;
        public void doSomeThing(){
            System.out.println("i="+i);
        }
    }
    P.S:このプログラムはエラーが発生します。finalで修飾されたメンバー変数は手動で値を割り当てなければなりません。メンバー変数のfinalを削除するとエラーが発生しません。プログラムはiにデフォルト値0を設定します。final修飾基本データタイプは変更できません。オブジェクト参照は変更できませんが、オブジェクトの内容は変更できます。
  • continue lableとbreak lableの考察
  • break--label
  • label1: //  1
     while (true) {
                    //    
                    for (int i = 0; i <= 8; i++) {
                        System.out.println("i=" + i);
                        if (i == 5) {
                            break label1;
                        }
                    }
                    System.out.println("WAIT UP");
                }
        PS:break label labelのラベルで定義されたコードブロックから飛び出すことができます。
         ケーブル1は位置1に置いて、0、1、2、3、4を出力します。
         ケーブル1は位置2に置いて、出力0,1,2,3,4 WAIT UP...サイクル
          2.continue--label
    for (int i = 0; i < 10; i++) {
                    System.out.println("i = " + i);
                    label1: for (int x = 0; x < 10; x++) {
                        System.out.println("x = " + x);
                        continue label1;
                    }
                }
    
    
      :
    for (int i = 0; i < 10; i++) {
                    System.out.println("i = " + i);
                    for (int x = 0; x < 10; x++) {
                        System.out.println("x = " + x);
                     
                    }
                }
    ---------------------------------------------------------------------------------------
    
     label1: for (int i = 0; i < 10; i++) {
                    System.out.println("i = " + i);
                   for (int x = 0; x < 10; x++) {
                        System.out.println("x = " + x);
                        continue label1;
                    }
                }
        ,  lable1    , :0,0,1,0,2,0...         
    
    
       :label1:
               for (int i = 1; i < 10; i++) {
                   lable2:
                   System.out.println("i="+i);
                   for (int j = 0; j < 10; j++) {
                       if(j == 9) continue  label1;
                   }
    
               }
    continue      ,      ,   continue  label1  lable2       
  • 構成方法は、ブロック、スタティックブロック、スタティック属性の出力順序
  • を構成する。
    public class App extends  HelloA{
        public  App(){
            System.out.println(9);
        }
        {
            System.out.println(6);
        }
       static {
           System.out.println(4);
       }
        private static int b  = getStaticB();
    
        public  static  int getStaticB(){
            b = 10;
            System.out.println(b);
            return b;
        }
    
        public static void main(String[] args) {
            System.out.println(1); //3,4,1,2,8,6,9,2,8,9,6,5
            new App();
            new App();
            System.out.println("5");
        }
    
    }
    class HelloA{
    
        {
            System.out.println(2);
        }
        public HelloA(){
            System.out.println(8);
        }
    
        static {
            System.out.println(3);
        }
        private static int a  = getStaticA();
    
        public  static  int getStaticA(){
            a = 11;
            System.out.println(a);
            return a;
        }
    }
    
    出力:3 11 4 10 1 2 8 9 2 8 6 6 9 5
    結論:1.例示的な化学種の場合、このクラスがロードされていない場合は、最初に親のクラスのオブジェクトをロードし、その後にサブクラスのオブジェクトをロードし、次に親クラスを実例化し、最後のインスタンスの化学子類は、このクラスがロードされている場合は、もはや親クラスとサブクラスのクラスのオブジェクトをロードしない。2.クラスオブジェクトをロードする場合、まず静的ブロックを実行し、その後静的属性を初期化する。オブジェクトを実例化する場合は、まずブロックを構成し、構造方法を実行します。(構造ブロックは必ず構造方法の前で実行されます)。
  • 方法スタック、スタック、スタックの考察
  • public class Example{  
      String str=new String("good");  
      char[]ch={'a','b','c'};  
      public static void main(String args[]){  
        Example ex=new Example();  
        ex.change(ex.str,ex.ch);  
        System.out.print(ex.str+" and ");  
        Sytem.out.print(ex.ch);  
      }  
      public void change(String x,char y[]){  
        x="test ok";  
        y[0]='g';  
      }  
    }
    
    
       good and gbc
     実際には、方法スタックは方法の消失とともに、方法スタックの変数も消失する。
  • try-finallyの戻り値
  •       
     public static void main(String[] args) {
            int i = tryFinallyReturn();
            System.out.println(i);
        }
    
        public static  int tryFinallyReturn(){
            int i = 0;
            try{
                return ++i;//  1
            }
            finally {
                i++;//  2
            }
    
        }
    //   1,    1  i++    0
       P.S:finally総会が実行します。この行は位置1(ここでは一時変数がキャッシュされます。)で、位置2です。ここでiの値は2で、位置1に再実行されると、一時変数が返されます。したがって、位置2は、どんな操作をしてもリターン値には影響がありません。
     public static void main(String[] args) {
            int i = tryFinallyReturn();
            System.out.println(i);
        }
    
        public static  int tryFinallyReturn(){
            int i = 0;
            try{
                return ++i;//  1
            }
            finally {
                return ++i;//  2
            }
    
        }
    //      2
    P.Sのこのときの実行順序は、実行位置1であり、このときiは1を加算し、位置2に実行すると、プログラムはそのままリセットされます。