参数分析

哈哈哈~时隔多(ban)年(xue qi), 终于又来写技术博客了 \(^o^)/~
今天学习的是参数分析,感觉解决了自己多年的困惑呢(✿◡‿◡)
1.数据类型
数据类型有两种:基本数据类型和引用数据类型
基本数据类型】8种:boolean , byte , short , long , int , float , double , char ;
引用数据类型】 4种:数组,类,接口,抽象类。

2.参数传递
(1)示例:传递int数据
◤代码◢

 

	int a = 10;
	int b = 10; 

 

 

	int a = 10;
	int b = a;
	a = 0;
	System.out.println("a--->"+a);
	System.out.println("b--->"+b);

 

◤输出结果◢
a--->0
b--->10
 
 
◤结果分析◢
    基本数据在内存中的存储方式:
    a和10都是存储在栈内存中的,且栈中的数据可以共享。这里a和b都是一个指向int类型的引用。
    编译器先处理 int a =10,首先他会在栈中创建一个变量为a的引用,然后去查找有没有字面值为10的地址
,没找到就开辟一个存放10这个值的地址,然后将a指向10的地址;在创建完b这个引用变量后,栈中已经有了
10这个字面值,所以b直接指向10的地址,这样就出现了a、b同时指向10的情况。
    而当处理a=0时,编译器会首先搜索栈内是否有值为0的地址,有则直接将a指向该地址,没有则开辟一个地
址来存放4这个值,所以并不会影响到b。

◤代码◢
public class Student {
	private String name;
	private int age;
	
	public Student(String name, int age){
		this.name = name;
		this.age = age;
	}
        public void setAge(int age){
		this.age = age;
		age++;//参数加一
		System.out.println("1--->"+age);//输出
	}
}
public class Main {
	public static void main(String[] args) {
		Student stu = new Student("张三",0);
		int age = 19;
		stu.setAge(age);
		System.out.println("2--->"+age);//输出
	}
}
◤输出结果◢ 
1--->20
2--->19

◤结果分析◢
   这里就是把age这个变量的19这个值传递给了setAge()方法中的age。

    (2)示例:传递对象
    ◤代码◢

 

public void change(Student stu){
		stu.setName("王五");
		System.out.println("1--->"+stu.getName());
	}
public class Main {
	public static void main(String[] args) {
		Student stu1 = new Student("张三");
		Student stu2 = new Student("李四");
		stu1.change(stu2);
		System.out.println("2--->"+stu2.getName());
	}
} 
◤输出结果◢
1--->王五
2--->王五
 
◤结果分析◢

  创建一个对象时,对象名存储在栈内存中,而new就开辟了一块堆内存,用来存放对象的内容,再将该地址

存储在栈内存中,所以相应的对象名就根据地址的指向找到了对应的内容。而传递对象的时候就是把这个对象

的地址传递给了方法中新的对象,所以两个对象指向同一块堆内存,那么在方法中改变内容的时候,原对象的

内容也一起改变了。

    (3)示例:传递字符串
 ◤代码◢
public void setName(String name){
		name = "李四";
		System.out.println("1--->"+name);
	}
public class Main {
	public static void main(String[] args) {
		Student stu = new Student();
		String name = "张三";
		stu.setName(name);
		System.out.println("2--->"+name);
	}
}
◤输出结果◢
1--->李四
2--->张三

◤结果分析◢
String传递时传递了一个地址给形参没错,但是String是不可修改的,所以当方法中的String修改时,就就开辟
了新的堆内存,而方法中的形参也就指向了新的地址,则原地址中的内容不会有任何修改。
※ 总结 ※
【值传递】 
    值传递适用于:基本数据类型及String;
    传递的是数据
    与实例进行类比,就像复印一份文件,把复印件上的信息修改并不会影响到原件上的内容,同理当基本数
据和字符串作为参数进行传递时,是传递值也就是数据的复制,无论这个复制值怎么修改也不会影响到原值。
【引用传递】
    引用传递适用于:引用数据类型,String除外;
    传递的是地址
    与实例进行类比,就像需要修改某个数据直接找到原文件,在原文件上修改,所以再看原文件时数据也已
经被修改了。

你可能感兴趣的:(参数)