java引用类型

Java中有8种数组类型{整型(byte,short,int,long),浮点型(double,float)字符型(char),布尔型(Boolean)},引用类型,是指除了基本的变量类型之外的所有类型,例如类,数组,接口,枚举,注解。

基本数据类型传递时只传递值本身,局部变量存放在栈内存中

要求定义一个方法,传入两个整数,功能时将两个数进行交换
public class Test{
      public class Exchange {
    public void fun(int a ,int b ){
        System.out.println("交换前:"+a+";"+b);
        int temp = a;
        a = b;
        b = temp;
        System.out.println("交换后:"+a+";"+b);
    }

    public static void main(String[] args) {
        Exchange exchange = new Exchange();
        exchange.fun(123,456);
    }
}
}


结果:
交换前:123;456
交换后:456;123

 

更改后

public class Exchange {
    public void fun(int a ,int b ){

        int temp = a;
        a = b;
        b = temp;

    }

    public static void main(String[] args) {
        int x = 123;
        int y = 456;
        Exchange exchange = new Exchange();
        System.out.println("交换前:"+x+";"+y);
        exchange.fun(x,y);
        System.out.println("交换后:"+x+";"+y);
    }
}

更改后,在进行x向a传递时,传递的x的值本身,实际上x和y并没有改变。栈内存中特点就是只要方法执行,里面的局部变量就会被销毁,所以支持fun()方法后,int temp,int a,int b都会被销毁。此时int x 和int y没有变化。局部变量存放在栈中,成员变量存放在堆中,所以局部变量可以重名,但必须存在不同方法中。

接下来介绍引用类型的传递

public class Exchange {
    int x;
    int y;
    public  Exchange(int x,int y){
        this.x = x;
        this.y = y;
    }
    public void fun(Exchange e ){

        int temp = e.x;
        e.x = e.y;
        e.y = temp;

    }

    public static void main(String[] args) {
        Exchange exchange = new Exchange(12,56);
        System.out.println("交换前:"+exchange.x+";"+exchange.y);
        exchange.fun(exchange);
        System.out.println("交换后:"+exchange.x+";"+exchange.y);
    }
}
结果:
交换前:12;56
交换后:56;12

int x = 23;int y=56在栈中存放,基本数据类型的传递直接把值传递,所以堆内存中存放的成员变量int x = 23;int y =56;int temp = e.x,而e.x此时等于23,所以int temp = 23。把e.y传递给了e.x,执行fun()方法后之间进行值的传递,结果是此时成员int x = 56;int y = 23;

总结就是基本数据传参是传递的是值(传值),而引用数据类型传参时传的是地址(传址),这与C++ 的指针原理上相似,但是Java中没有指针。

接下来介绍一下什么是引用

简单的说,引用其实就像是一个对象的名字或者别名 (alias),比如String a = "hello world";String b = a;a和b都申请了一段内存来保存数据,但是a和b都指向同一个地址,是不是和c++ 中的指针很相似,没错,我们可以把它理解为指针。a 和 b 是不同的两个引用,我们使用了两个定义语句来定义它们。但它们的值是一样的,都指向同一个对象 "This is a Text!"。但要注意String 对象的值本身是不可更改的 (像 b = "World"; b = a; 这种情况不是改变了 "World" 这一对象的值,而是改变了它的引用 b 的值使之指向了另一个 String 对象 a)

 

如图,开始b 的值为绿线所指向的“Word Two”,然后 b=a; 使 b 指向了红线所指向的”Word“.

参考https://www.cnblogs.com/SilentCode/p/4858790.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值