package com.oop.demo01;
/**
* @ClassName: Demo04
* @Author: 南冥有猫不须铭
* @Date: 2021/3/23-23:01
* @Description: 04 值传递
*/
//值传递(Java是值传递)
public class Demo04 {
public static void main(String[] args) {
int a = 1;
System.out.println(a); // 1
Demo04.change(a);
System.out.println(a); // 1
}
//返回值为空
public static void change(int a){ // a = 1
a = 10; // a = 1
} //走出change方法后,当前的 a = 10,但是外面的 a 还是等于 1
}
/*
值传递 和 引用传递 的区别:
值转递,指的是方法调用时,复制一份实际参数(基本类型的值 或者 引用对象)到方法参数中。这样在方法中参数变更了,不影响实际参数。
引用传递,指方法调用时,直接将实际参数传递到方法参数中,对方法参数的变更,会影响实际参数。
概念中的 实际参数 和方法参数 指的是 基本类型的值 或者 引用对象。 引用对象 是引用本身,不是引用对象所指向的 实际对象。
*/
package com.oop.demo01;
/**
* @ClassName: Demo05
* @Author: 南冥有猫不须铭
* @Date: 2021/3/24-2:17
* @Description: 05 引用传递(类似C语言中的指针,传递的是地址)
*/
//引用传递:对象,本质还是值传递 (引用类型,变量中保存的只是实际对象的地址。一般称这种变量为"引用",引用指向实际对象,实际对象中保存着内容。)
//对象,内存!
public class Demo05 {
public static void main(String[] args) {
Person person = new Person(); //new一个Person()对象,这是实例化的过程
System.out.println(person.name); //null
Demo05.change(person);
System.out.println(person.name); //秦疆
}
public static void change(Person person){
//person是一个对象:指向的是---> Person person = new Person(); 这是一个具体的人,可以改变属性! (类似C语言的“指针”?)
person.name = "秦疆"; // 这里修改的是下面Person类中的name的值,而不是这里的person.name的值
}
}
//定义了一个Person类,有一个属性:name
class Person{ //一个类中只能有一个public class,但是可以有多个class
String name; //null
}
/*
int num = 10;
String str = "hello";
num是基本类型,值就直接保存在变量中。而str是引用类型,变量中保存的只是实际对象的地址。一般称这种变量为"引用",引用指向实际对象,实际对象中保存着内容。
num = 20;
str = "java";
对于基本类型 num,赋值运算符会直接改变变量的值,原来的值被覆盖掉。
对于引用类型 str,赋值运算符会改变引用中所保存的地址,原来的地址被覆盖掉。但是原来的对象不会被改变(重要)。
"hello" 字符串对象没有被改变。(没有被任何引用所指向的对象是垃圾,会被垃圾回收器回收)
*/
/*
值传递 和 引用传递 的区别:
值转递,指的是方法调用时,复制一份实际参数(基本类型的值 或者 引用对象)到方法参数中。这样在方法中参数变更了,不影响实际参数。
引用传递,指方法调用时,直接将实际参数传递到方法参数中,对方法参数的变更,会影响实际参数。
概念中的 实际参数 和方法参数 指的是 基本类型的值 或者 引用对象。 引用对象 是引用本身,不是引用对象所指向的 实际对象。
*/