zoukankan      html  css  js  c++  java
  • java基础细节

    java基础细节

    下面的语句有问题吗?

    byte b1=1;
    byte b2=2;
    byte b3=b1+b2;
    

    第三行会编译失败,原因在于对byte/short/char进行数值运算时,会强制转换为int类型,最终的结果也是int类型。
    故正确的写法为 byte b3=(byte)(b1+b2)

    你觉得输出结果会是什么?

    Integer i=128;
    Integer j=128;
    System.out.println(i==j);
    

    false! why?
    Integer存在缓存机制,会自动将-128~127的integer对象缓存在Cache数组中,一旦调用Integer.valueOf(i)方法,且-128<=i<=127,则会自动到数组中拿出来,否则就会创建新的Integer对象

    他们相等吗?

    String a="a";
    String c=a;
    System.out.println(a==c);
    // true! 他们都是在常量池中,引用指向同一个地址
    
    那这样呢?
    String a="a";
    String b="b";
    String c="a"+"b";
    System.out.println(a+b==c);
    System.out.println("ab"==c);
    //false  true  why?
    

    首先String类型是不可变类型,那么第四行的执行如下:
    a+b:    new StringBuffer("a").append("b").toString();即在堆中新创建了一个对象,两者不再是同一个对象
    但是编译器做了一些优化,在编译时期,String c="a"+"b"的编译结果是String c="ab".

    猜猜他们输出的结果分别是什么?

    public class Test{
        public static void main(String[] args){
        	String a="1";
        	String b="2";
        	change(a,b);
        	System.out.println(a+" "+b);
        }
     
    	private static void change(String a,String b) {
    		a+="1";
    		a=b;
        b = a;
    	} 
    }
    

    输出:1 2
    原因在于对于String类型的对象,进行参数传递时也是值传递
    (经测试C++也是值传递)

    public class Test{
        public static void main(String[] args){
        	StringBuffer a=new StringBuffer("1");
        	StringBuffer b=new StringBuffer("2");
        	change(a,b);
        	System.out.println(a+" "+b);
        }
     
    	private static void change(StringBuffer a,StringBuffer b) {
    		a.append(1);
    	} 
    }
    

    上述代码输出结果:11 2
    得出这个答案无可厚非,关键是如果我们改一下呢?

    	private static void change(StringBuffer a,StringBuffer b) {
    		a.append(1);
    		a=b;
    	} 
    

    输出结果还是:11 2
    这里就很有问题了,明明a=b,为什么还是输出11 2
    原因在于:进行引用传递时,对原对象的引用是不会改变的。

    我们再修改一下:

    	private static void change(StringBuffer a,StringBuffer b) {
    		a=new StringBuffer("11");
    	} 
    

    最后打印结果还是:1 2

    这样我们就可以总结一下了:实际上,java的参数传递只有值传递!但是便于理解,我们根据参数类型的不同分为值传递和引用传递,其中对于基本数据类型和不可变对象(包装类和String类)采取的是值传递,对于其他的引用类采取的是引用传递,引用传递可以在方法中修改原对象的内容,但是对原对象的引用始终不会改变!

  • 相关阅读:
    Java并发编程:Lock
    java多线程中的生产者与消费者之等待唤醒机制@Version2.0
    java多线程中的生产者与消费者之等待唤醒机制@Version1.0
    vim 自动补全
    git 忽略文件的三种方式
    vim 查找整个工程
    vim 寄存器的使用
    我的vim插件列表
    web前端面试系列 一 js闭包
    web前端面试系列
  • 原文地址:https://www.cnblogs.com/jason1999/p/11717900.html
Copyright © 2011-2022 走看看