栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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:


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复制一份放到新盒子里面去.

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/756462.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号