博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java传递引用类型的实质_java的引用类型以及值传递
阅读量:6375 次
发布时间:2019-06-23

本文共 2003 字,大约阅读时间需要 6 分钟。

值传递引用传递

函数内传递是值传递

public static void main(String[] args) {

String test="test1";

Ob that=new Ob();

that.changeTest(test);

System.out.println("test = " + test);

}

public void changeTest(String test){

test="test2";

}

结果:函数内的改变对外部变量无影响

test = test1

函数内实参是值传递,即不会对原有对象造成影响

但是,如果传递的是一个对象(本质上是对象的引用地址)就会改变对象,因为即使是值传递,但是传递的地址指向是同一个对象。

=符号是引用传递

public static void main(String[] args) {

te a =new te();

te b = a;

//仅修改内容

a.setName("aaa");

b.setName("bbb");

//发现a也修改了

System.out.println("a.getName() = " + a.getName());

// == 符号是判断对象地址是否相同,结果是相同

System.out.print("a==b? ");

System.out.println(a==b);

//输出一下对象的地址,发现果然一样

System.out.println("a = " + a);

System.out.println("b = " + b);

}

内部类

class te{

private String name;

public String getName(){

return this.name;

}

public void setName(String name){

this.name=name;

}

}

输出结果

a.getName() = bbb

a==b? true

a = te@3f91beef

b = te@3f91beef

拓展

这让我想起了之前看到的一个知识点,==和Object.equals()的区别。

==判断的是地址是否相同

Object.equals()是用来判断对象是否相同的方法,内部默认调用的是==来判断。

public static void main(String[] args) {

Ob a = new Ob ();

Ob b = new Ob ();

System.out.println("a.equals(b) = " + a.equals(b));

}

结果

a.equals(b) = false

如果没有重写equals(),即使使用同一个类的构造方法也显示不同。

重写equals()代码的同时也要重写hashCode()方法,因为要保证equals相等,hashCode一定相等。避免重写equlas()后达到一定条件对象相等,但是hashCode()没变。

hashCode():hash->简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。hashMap也是将key转换成hash存储,如果hashCode相同,则会在同一个节点用链表存储。通过hashCode找到位置,equals获取两个之一。

附 String类重写equals()和hashCode()的源码(1.8)

equals()

public boolean equals(Object anObject) {

if (this == anObject) {

return true;

}

if (anObject instanceof String) {

String anotherString = (String)anObject;

int n = value.length;

if (n == anotherString.value.length) {

char v1[] = value;

char v2[] = anotherString.value;

int i = 0;

while (n-- != 0) {

if (v1[i] != v2[i])

return false;

i++;

}

return true;

}

}

return false;

}

hashCode()

public int hashCode() {

int h = hash;

if (h == 0 && value.length > 0) {

char val[] = value;

for (int i = 0; i < value.length; i++) {

h = 31 * h + val[i];

}

hash = h;

}

return h;

}

转载地址:http://ymvqa.baihongyu.com/

你可能感兴趣的文章
spring笔记--依赖注入之针对不同类型变量的几种注入方式
查看>>
Java爬虫——网易云热评爬取
查看>>
Ajax的简单学习
查看>>
无华为,不智慧:智慧城市建设为何少不了华为?
查看>>
高性能网络通信框架Netty-基础概念篇
查看>>
为npm配置taobao源
查看>>
orm框架(SQLAlchemy) 连接数据库和创建表
查看>>
OSPF多区域虚电路配置
查看>>
zookeeper初探三 java客户端连接
查看>>
管理邮件用户
查看>>
Python中的运算符、数据类型、字符串及列表操作举例
查看>>
Tab页界面之二,jQuery技术实现
查看>>
如何查看linux版本
查看>>
导出DC数据以便以介质方式安装另一台域控制器
查看>>
2、Gerrit配置--用户配置
查看>>
Centos7 Nginx 服务器的安装配置
查看>>
Hibernate学习(八):检索方式
查看>>
RIPv1 PK RIPv2
查看>>
基于WorsPress+Xampp搭建博客
查看>>
Weblogic多应用部署在一个域下导致session冲突
查看>>