Java参数传递与修饰符访问权限

Author Avatar
Sarience 4月 24, 2017
  • 在其它设备中阅读本文章

终于想通了困扰我的String类型传递不修改值的问题了,先说说参数传递吧。

如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
package com.douya.Test;
public class ParamPass {
public static void main(String[] args) {
String str = "main";
ParamPass pt = new ParamPass();
System.out.println("main before change1:" + str);
pt.change1(str);
System.out.println("main after change1:" + str);
int a = 200;
pt.change1(a);
System.out.println(a);
Student bfs = new Student(20, "BFS", false);
System.out.println("main before change1:" + bfs);
pt.change1(bfs);
System.out.println("main after change1:" + bfs);
}
public void change1(String str) {
System.out.println("change1=" + str);
str = "change1";
System.out.println("after change1:" + str);
}
public void change1(int a) {
System.out.println("change1=" + a);
a = 100;
System.out.println("after change1:" + a);
}
public void change1(Student student) {
student.setAge(18);
student.setGender(true);
student.setName("AFS");
}
public static class Student {
private int age;
private String name;
private boolean gender;
public Student(int age) {
this.age = age;
}
public Student(int age, String name, boolean gender) {
this.age = age;
this.name = name;
this.gender = gender;
}
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 boolean isGender() {
return gender;
}
public void setGender(boolean gender) {
this.gender = gender;
}
@Override
public String toString() {
return "Student{" +
"age=" + age +
", name='" + name + '\'' +
", gender=" + gender +
'}';
}
}
}

运行结果:

main before change1:main
change1=main
after change1:change1
main after change1:main
change1=200
after change1:100
200
main before change1:Student{age=20, name=’BFS’, gender=false}
main after change1:Student{age=18, name=’AFS’, gender=true}

Java中的数据类型

Java中有8种基本数据类型,分别为:
布尔型(boolean),
字符型(char),
数值型(分两种):

1. [整数类型]{byte,short,int,long},
2. [浮点类型]{float,double}

3种引用数据类型,分别为:

类(class),
接口(interface),
数组:

1
2
3
4
5
6
7
8
9
10
11
graph TD;
数据类型-->基本数据类型;
数据类型-->引用数据类型;
引用数据类型-->类;
引用数据类型-->接口;
引用数据类型-->数组;
基本数据类型-->数值型;
数值型-->整数类型;
数值型-->浮点类型;
基本数据类型-->字符型;
基本数据类型-->布尔型;

修饰符访问权限

修饰符 类内部 本包 子类 外部包
public
protected X
default X X
private X X X

基本数据类型传递只传递值

如上代码:change1(int a)()方法执行的时候,在栈中开辟了一段空间,为方法体中的局部变量a赋值为传递过来的值,方法结束后,这段空间出栈被销毁,局部变量a也被销毁,但是main()方法中的a没有被销毁,因为他们不是同一个变量,作用域不同,所处栈空间也不同。

引用类型传递的是地址

如上代码:String作为引用类型,在调用change1(String str)()方法的时候,给方法体中的局部变量str付给main中变量str的地址,即指向字符常量“main”,重点在str = "change1";这段代码,这句话其实执行了两句,一句是:new String();,另一句是:给这个new String()对象赋值,即str=new String("change1")。这意味着局部变量str的地址指向了新创建的匿名String对象,且这个对象的值为“change1”,在方法结束后,这段空间出栈被销毁,局部变量str也被销毁,匿名String对象没了引用,就变成了垃圾,等待jvm回收。

对于具体的类对象,如上代码,先创建了一个学生对象,赋初始值为:age=20, name=’BFS’, gender=false,在调用change1(Student student)()方法的时候,传递变量bfs的地址过去赋给局部变量student,此时,main中的变量bfs和change1中的局部变量student指向同一个对象,即赋初始值为:age=20, name=’BFS’, gender=false的student对象。此时student调用的方法即是该对象的方法,修改的值也为该对象的值。