一家公司的几道笔试题

一家公司的几道笔试题

public   class  Jtest {
int m=1;
int i=3;
void Jtest(){
m
=2;
i
=4;
}


public static void main(String[] args){
Jtest app
=new Jtest();
System.out.println(app.m
+","+app.i);
}

}

写出输出.
结果是1,3;
因为在这里void Jtest();并没有并调用,它只是一个
方法,而非构造方法,这样的编写是有警告的,不过
可以运行.

public   class  Jtest {
int m=1;
int i=3;
Jtest()
{
m
=2;
i
=4;
}

public static void main(String[] args){
Jtest app
=new Jtest();
System.out.println(app.m
+","+app.i);
}

}

写出输出:
结果是2,4;
调用了构造方法,不加修饰符,默认访问权限是
package access,在Java里没有关键字表示,就是
包内的能访问,包外就不行了(即使导入也不行).
public   class  Test
{
    
static void oper(int b)
    
{
        b 
= b + 100;
    }

    
    
public static void main(String[] args)
    
{
        
int a = 99;
        oper(a);
        System.out.println(a);
    }


}

输出为99.
我们来分析一下内存:
int a = 99;
首先在栈里面开辟一块空间保存a
比如:a:xxxx
然后调用oper(a);
这时把a 的值99赋给int b;
b在内存里也开辟了自己的空间,此时
值也是99.
然后执行oper(a);方法体,b = b + 100;
此时b的值为199,a的值为99.
public   class  Test  {
  
public static void main(String[] args) {
        String a
=new String("A");
        String b
=new String("B");
        oper(a,b);
        System.out.print(a
+","+b);
    }

  
static void oper(String c,String d){
      c.concat(
"B");
      d
=c;
  }

}


此程序输出:A和B.
原因就是String是final类型的.并不会被改变.
public   class  Test
{
    
public static void main(String[] args)
    
{
        String a 
= new String("A");
        String b 
= new String("B");
        a.concat(
"aa");
        System.out.println(a 
+ "," + b);
    }


}


这个还是会输出A,B
原因同上.
package  intervie;

public   class  Test
{
    
public static void main(String[] args)
    
{
        String a 
= new String("A");
        String b 
= new String("B");
        a 
= a.concat("aa");
        System.out.println(a 
+ "," + b);
    }


}


做了下改动,再来看看.结果就不同了.
输出的是Aaa,B
因为String 是final类型的.所以执行到
a = c.concat("aa");
会在heap里新创建一个对象,而a指向它.
这是一新的地址,同String a 这个已经不同了.
所以输出的是后一个.即改变后的值.
public   class  Test
{
    
static void oper(StringBuffer c,StringBuffer d)
    
{
        d 
= c.append("B");
    }

    
    
public static void main(String[] args)
    
{
        StringBuffer a 
= new StringBuffer("A");
        StringBuffer b 
= new StringBuffer("B");
        oper(a, b);
        System.out.println(a 
+ "," + b);
    }


}


此程序会输出:AB,B

StringBuffer是可变的线程安全的.
原试题下载地址:点此下载



你可能感兴趣的:(一家公司的几道笔试题)