JAVA常用知识总结(二)

  1. JAVA中的参数传递总结
    先看两道笔试题:
     1 public class Test2 { 
     2 
     3    public static void main (String [] args)  { 
     4          StringBuffer a = new StringBuffer ("A"); 
     5          StringBuffer b = new StringBuffer ("B"); 
     6          operate (a,b); 
     7          System.out.println(a+","+b); 
     8    }
     9 
    10    static void operate(StringBuffer x, StringBuffer y){ 
    11          x.append(y); 
    12          y = x; 
    13    }
    14 }

    该题会输出什么?

     1 public class Test2 { 
     2 
     3      public static void add3 (Integer i){ 
     4           int val=i.intValue();
     5           val += 3; 
     6           i = new Integer (val); 
     7       } 
     8 
     9      public static void main (String args [ ] )  { 
    10           Integer  i = new Integer (0); 
    11           add3 (i); 
    12           System.out.println (i.intValue ( )); 
    13      } 
    14 }

    这个又会输出什么?
    答案是: 1:AB,B       2:0
    首先我们应该明白JAVA中的参数传递全是以值传递的。是基本类型,就拷贝一个基本类型传进方法;是引用,就拷贝一个引用变量传进去方法,理解了这两点就能理解方法操作对象的相关问题了。最好能画出引用指向对象的图出来,就能完全理解了。

    第1题,调用operate方法时,传入了两个引用a,b的拷贝x,y,注意这里a,b不是基本类型而是引用!!作为拷贝,x和y也都是引用,指向对象StringBuffer("A")和StringBuffer("B"),这两个x,y都指向原a,b引用所指向的对象。x.append(y)对它指向的对象(即a指向的对象)进行了操作。而x=y,只是两个拷贝变量在赋值,并没有影响到原b所指向的对象。所以b所指向的对象仍然为B。

  

     第2题,i=new Integer(val)  这里等于重新把i的引用指向别的对象了,所以原有对象的数没改,而原来的i仍然是指向对象new Integer(0)的。

     把握住了JAVA都是传值并且传的都是拷贝的话,类似的题大家都能迎刃而解了。

  1. JAVA中的代码执行顺序
  2.  1 class SingleTon {
     2     private static SingleTon singleTon = new SingleTon();
     3     public static int count1;
     4     public static int count2 = 0;
     5 
     6     private SingleTon() {
     7         count1++;
     8         count2++;
     9     }
    10 
    11     public static SingleTon getInstance() {
    12         return singleTon;
    13     }
    14 }
    15 
    16 public class Test {
    17     public static void main(String[] args) {
    18         SingleTon singleTon = SingleTon.getInstance();
    19         System.out.println("count1=" + singleTon.count1);
    20         System.out.println("count2=" + singleTon.count2);
    21     }
    22 }
    23 
    24 正确答案
    25 count1=1
    26 
    27 count2=0
    28 
    29 
    3031 class Singleton
    32 {    
    33     
    34     public static int counter1;
    35     public static int counter2=0;
    36     private static  Singleton singleton=new Singleton();
    37     private Singleton()
    38     {
    39         counter1++;
    40         counter2++;
    41     }
    42     public static Singleton getInstance()
    43     {
    44         return singleton;
    45     }    
    46 }
    47  
    48 public class MyTest
    49 {
    50  
    51     public static void main(String[] args)
    52     {
    53         Singleton singleton=Singleton.getInstance();    
    54         System.out.println("counter1="+singleton.counter1);
    55         System.out.println("counter2="+singleton.counter2);
    56     }
    57  
    58     
    59 }
    60 
    61 counter1 = 1;
    62 counter2 = 1;

    原因:

    首先调用类的静态方法(Singleton.getInstance()),会加载这个类(这里指Singleton类)。

    执行过程:
    1.给所有的静态变量赋予一个默认值(int类型的默认值为0)counter1=0,counter2=0(赋值操作未执行),singleton=null
    2.初始化(从上到下开始执行,把右边的值赋值给左边)
    3.new Singleton()要生成对象(实例),会自动调用它的构造方法。

    题目一:此时counter1没有赋值,故counter1还是等于0.counter2被赋值为0,故counter2=0.

    题目二:此时counter1++,所以counter=1;counter2++,counter2=1;   所以最后counter1=1,counter2=1.

    Java变量的初始化顺序为:静态变量或静态语句块–>实例变量或初始化语句块–>构造方法
    有父子级关系的变量的初始化顺序为:父类--静态变量->父类--静态初始化块->子类--静态变量->子类--静态初始化块->父类--变量->父类--初始化块->父类--构造器->子类--变量->子类--初始化块->子类--构造器

     

原文地址:https://www.cnblogs.com/king-brook/p/9922272.html