重新出发000006-阅读文章“六_Java基本数据类型和引用类型”
2018-06-04 11:40:37
imadiaos
package review.base.Java那些事儿;
import java.util.Arrays;
import java.util.Objects;
public class 六_Java基本数据类型和引用类型 {
public static void main(String[] args) {
int[] a = {1, 2, 3};
int[] b = {1, 2, 3};
System.out.println(a.equals(b));
System.out.println(Arrays.equals(a, b));
System.out.println("--------------正文开始,之前忽略--------------");
int int1 = 100; // 声明了一个基本数据类型并赋值
int int2 = int1; // 声明了int2,并赋值为int1
int1 = 500; // 为int1赋值为500
System.out.println("打印int1的值:" + int1);
System.out.println("打印int2的值:" + int2);
System.out.println();
int[] arr1 = new int[]{1, 2, 3, 4, 5, 6}; // 声明一个数组并赋值
int[] arr2 = arr1; // 声明arr2,并赋值为int1
arr1[3] = 100;
System.out.println("打印arr1[3]的值:" + arr1[3]);
System.out.println("打印arr2[3]的值:" + arr2[3]);
System.out.println();
PersonClass pc1 = new PersonClass(28,"dan"); // 声明一个对象并赋值
PersonClass pc2 = pc1; // 声明pc2,并赋值为pc1
pc1.setName("yn");
pc1.setAge(35);
System.out.println(pc1);
System.out.println(pc2);
/**
* 参考文章地址:https://zhuanlan.zhihu.com/p/28654272
*
*
* 第一句中:int int1 = 100; 声明了一个基本数据类型并赋值
*
* 方法体中声明的基本数据类型存在栈内存中。
* 继续执行到int int2 = int1; // 声明了int2,并赋值为int1
*
* 对于基本数据类型来说,赋值(=号)就相当于拷贝了一份值。所以此时在栈内存中应该有两个独立的空间分别存放两个值。
* 所以在int1 = 500; // 为int1赋值为500执行时。不会影响int2中的内容。
*
* 接下来:
* 先初始化arr1,当执行到new这个关键字,会在堆内存分配内存空间,并把该内存空间的地址赋值给arr1。
* 执行到int[] arr2 = arr1; // 声明arr2,并赋值为int1 时
* 由于arr2并没有new关键字,并不会在堆中重新开辟空间。而是把arr1的对内存地址直接复制给了arr2,
* 对于引用类型来说,赋值(=号)就相当于拷贝了一份内存地址,也就是说arr1,arr2指向了同一块内存。
* 当执行:
* arr1[3] = 100;
*
* 虽然只是修改了arr1数组下标位置为3的值,但是由于arr1和arr2指向同一块对内存。所以,在打印的时候,两个对象的[3]都变了。
*
*
* 继续看......
* PersonClass pc1 = new PersonClass(28,"dan"); // 声明一个对象并赋值。套用之前知识,new申请了一块儿新的内存空间。Person
* 里又一个叫name的String对象,String对象有些特殊,虽然没有new,但还是会在对内存中开辟一块空间。String底层是数组实现,数组也是引用类型。
* 另外,Person的age为基本数据类型。
*
* PersonClass pc2 = pc1; // 声明pc2,并赋值为pc1 到这里:
* pc2不会重新开辟,而是和pc1共同指向一个内存区域。
* 当修改pc1的属性。同样pc2也会看起来改变了。
*
* 值得注意的是,先前的name为dan"的String对象并不会被改变,而是被断开了引用关系,成了孤立的对象。
* 那为什么Person这个对象的name还是变了呢,其实是它指向了一个新的String对象。
*
*
*
*/
}
}
class PersonClass {
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public PersonClass() {
}
public PersonClass(int age, String name) {
this.age = age;
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof PersonClass)) return false;
PersonClass person = (PersonClass) o;
return getAge() == person.getAge() &&
Objects.equals(getName(), person.getName());
}
@Override
public int hashCode() {
return Objects.hash(getAge(), getName());
}
@Override
public String toString() {
return "PersonClass{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}