Mystery of Walrus(介绍primitive type和reference type)

primitive type(基本类型)

8种基本类型:byte, short, int, long, float, double, boolean, char

first:declaring a variable
for example:int type(declaring an int sets aside a "box"of 32bits
double type(a box of 64bits)

java并不在这些“盒子”里留下什么东西,它只是开辟了一个数据盒,可以将这个盒子理解为(a huge squeeze of bits)。

同时,java声明一个变量后,并不赋初值(primitive type),因此当你想使用你所声明的变量时,必须先赋予其初值。
【java will not let access a variable that is uninitialized。它是不允许访问未初始化的变量的】

引用类型(reference type)

By object instantiation understanding the reference type:
请添加图片描述
java visualizer
first:create a new walrus(java will allocate a box of bits for each instance variable of the class)
using 0 or null(default value)
second:constructor will fill every box with other values(practical value))

java的存储,比如int x,x在内存中的地址是200-250,那么java会创建一个盒子存储x的第一位数据,也就是200
当声明一个引用类型的变量时,java会自动分配一个64bits的盒子,来存储变量
例如:

Walrus walrus;
walrus = new Walrus(1000, 10.5);

第一行创建一个walrus盒子,储存大小64bit
第二行通过new关键字创建实例,大小为int+double:为96bit,new返回其第一个数据的地址,存在walrus里面,这也就解释了为何64bit大小的盒子却存下了96bit大小的实例,因为它只是【存储其地址而非真实的数据值

Walrus walrus;
walrus = null;

而上面的这个代码片展示了一些信息:
假如我们将walrus赋值为null,则walrus储存64个0

对于此:
假如一个box notation值全为0,则代表null(64 bits all zero)
假如一个box notation的值非0,代表其通过箭头指向一个对象实例

综上所述,当我们执行这段代码时:

Walrus a = new Walrus(1000, 10.5);//创建盒子a(64bits)地址
Walrus b;//暂未赋值
b = a;//将a的bits都给b
b.weight = 5;//因为ab都指向同一个地址块,如果b.weight改变也会影响a。

b=a:the meaning:makng the arrow in the b box point at the same instance as a(让b盒中的箭头指向与a相同的实例)

请添加图片描述

这就是引用类型(reference type)和primitive type的区别。

参数传递

public class walrus{
public static double average(double a,double b)
{
return (a+b)/2;   
}
   public static void main(String[] args) {
    double x=5.5;
	double y=10.5;
	double avg=average(x,y);
    System.out.println(avg);
}
}

double avg=average(x,y);【primitive type】
average函数创建两个新的盒子x,y,这两个x,y 有他自己的作用域.
在传递参数时只是将main里面的x,y复制到average里面的x,y。
【本质上也是对比特进行复制】

Mystery of Walrus

通过一个例子来理解一下:

package walrus;

public class walrus {
    public int weight;
    public double tuckSize;

    public walrus(int w, double ts) {
        weight = w;
        tuckSize = ts;
    }
    public static void dostuff(walrus w,int x){
        w.weight=w.weight-100;
        x=x-5;
    }


    public static void main(String[] args) {
    walrus walrus=new walrus(3500,10.5);
    int x=9;
    dostuff(walrus,x);
        System.out.println(walrus.weight);
        System.out.println(x);
    }
   }

请判断打印出的x与walrus的值
解决问题的关键是理解java在储存primitive type类型变量与reference type类型变量的区别:
reference的盒子储存的是walrus实例对象的地址,指向walrus(data存在其中),所以在dostuff函数中通过new也是指向了一样的地址块。
而前者则直接储存其数据值data.
因此,无论是函数参数传递还是赋值操作,本质上都是将盒子里面存的bit复制一份放到新盒子里面去.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值