Solo  当前访客:45 开始使用

重新出发000006-阅读文章“六_Java基本数据类型和引用类型”

2018-06-04 11:40:37 imadiaos
0  评论    0  浏览
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 + '\'' +
                '}';
    }
}
,
TOP