关于final

非final的成员变量在堆中,final类型的变量存放在方法区的常量池中。

参考链接:http://t.csdn.cn/9Jo1D

常量池:通常 指的是运行时常量池,它是方法区的一部分,一个jvm实例只有一个运行常量池,==各个线程之间共享运行常量池。==

image-20221009154723272

hashCode()与equals()

http://t.csdn.cn/njLfn

http://t.csdn.cn/6Pqvx

如果两个对象equals()方法相等则它们的hashCode返回值一定要相同,如果两个对象的hashCode返回值相同,但它们的equals()方法不一定相等。

两个对象的hashCode()返回值相等不能判断这两个对象是相等的,但两个对象的hashcode()返回值不相等则可以判定两个对象一定不相等。

值传递

==Java语言的方法调用只支持值传递。==当一个对象被当做参数传递到一个方法之后,此方法可以改变这个对象的属性,并返回变化后的结果。那么这里使用的是值传递还是引用传递。

这里采用的是值传递。

在对象当做参数传递时。对象的属性会被改变,这是因为对象当做参数时,参数传入的是对对象地址的拷贝,方法中的对象与参数对象所指的是同一片内存空间。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Student s1 = new Student("小张");
Student s2 = new Student("小李");
Test.swap(s1, s2);
System.out.println("s1:" + s1.getName());
System.out.println("s2:" + s2.getName());
}

public static void swap(Student x, Student y) {
Student temp = x;
x = y;
y = temp;
System.out.println("x:" + x.getName());
System.out.println("y:" + y.getName());
}
}
1
2
3
4
5
x:小李
y:小张
s1:小张
s2:小李

image-20221009170707715

image-20221009170716266

总结

Java程序设计语言对对象采用的不是引用调用,实际上,对象引用是按值传递的。

下面再总结一下Java中方法参数的使用情况:

  • 一个方法不能修改一个基本数据类型的参数(即数值型或布尔型》
  • 一个方法可以改变一个对象参数的状态。
  • 一个方法不能让对象参数引用一个新的对象。