• Java数据类型和对象的引用


    在Java中,变量分为两类:

    1.基本类型变量,java是传递的副本

    2.一切对象型变量,传引用副本的实质是复制指向地址的指针

    a.基本类型引用

    public class BasicTransmit {
     
    	public static void test(boolean test){
    		test =! test;
    		System.out.println("in test : test = "+test);
    	}
    	
    	public static void main(String[] args) {
    		boolean test = true; 
    		System.out.println("Before test : test = "+ test);
    		test(test);
    		System.out.println("After test : test = "+test);
    		
    		//在java中,对于基本类型变量(int,long,double,float,byte,boolean,char)
    		//java 是传值的副本.
    	}
    }
    

    运行结果是:

    Before test : test = true
    in test : test = false
    After test : test = true

    b.对象的引用(String不是基本数据类型,而是对象)

    public static void test (StringBuffer str){
    		str.append(",wrold!");
    	}
    	
    	public static void main(String[] args) {
    		StringBuffer string = new StringBuffer("Hello");
    		test(string);
    		System.out.println(string);
    		//意料之中,String是一个引用,java对于引用形式传递对象类型的变量是,实际上是将引用
    		//作为一个副本传递方法函数.那么这个函数里面的引用副本所指向的是什么?
    		//是对象的地址,通过引用副本找到地址并修改地址的值,也就修改了对象的值
    	}
    

    运行结果:Hello,wrold!

    public static void test (String str){
    		str = "world";
    	}
    	
    	public static void main(String[] args){
    		String string = "Hello";
    		test(string);
    		System.out.println(string);
    	}
    	
    	//为什么会这样呢?这是因为当执行str="world"时,过程为:首先系统会自动生成应新的string对象
    	//并把这个新对象的值设为"world",然后把这个对象的引用赋给str
    	//理解:为str这个钥匙原来是指向"hello"这个仓库的,但是现在要求str这个钥匙重新指向"world"
    	//我们必须清楚一点是:String类是final类型的,因此,你不可以继承和修改这个类.
    	//str="world",其实是隐含地让java生成一个新的String对象,既然对象都是新的,那就与原来的
    	//"Hello"没有任何关系.
        //当函数结束,str作用消失,原来的内存地址上的内容未加改变,所以打印结果仍然是Hello
    	
    	//StringBuffer产生的一块内存空间,相关的增删改操作都在其中进行,所以为其添加一句"world"
    	//仍然是在同一段内存地址上进行的,str所值向的引用并没有改变.
    

    c.对象的引用

    public class ValueTest {
    
    	public void first(){
    		int i = 5;
    		Value v = new Value();
    		v.i = 25;
    		second(v ,i);
    		System.out.println(v.i);
    	}
    	
    	public void second(Value v ,int  i){
    		i = 0;
    		v.i = 20;
    		Value val = new Value();
    		v= val;
    		System.out.println(v.i + "" + i);
    	}
    	
    	public static void main(String[] args) {
    	    ValueTest t = new ValueTest();
    	    t.first();
    	}
    }
    
    class Value{
    	public int i = 15;
    }
    

      结果是:15 0 20

    总结:在java中无论是基本数据类型还是对象都是引用的副本或者地址的副本,当返回本函数是,值是没有变化的.除非在函数运行中已经把本地址指向的空间内的值修改了.

  • 相关阅读:
    Python 学习 第八篇:函数2(参数、lamdba和函数属性)
    Python 学习 第七篇:函数1(定义、调用和变量的作用域)
    Python 学习 第六篇:迭代和解析
    Python 学习 第四篇:动态类型模型
    物联网环境下数据分析的应用
    Python 学习 第一篇:数据类型(数字,布尔类型,操作符)
    写于2018年底,有点丧
    云计算助力大数据分析
    python中的__init__方法
    load、loads和 dump、dumps的区别
  • 原文地址:https://www.cnblogs.com/kgrdomore/p/4283589.html
Copyright © 2020-2023  润新知