Java引用傳遞進(jìn)階分析
我們通過幾個(gè)例子與內(nèi)存關(guān)系圖進(jìn)一步的分析Java的引用傳遞
例一
代碼如下:
class Demo{
private int num;
public Demo(int num){
this.num = num;
}
public void setNum(int num) {
this.num = num;
}
public int getNum() {
return num;
}
}
public class MyClass {
public static void main(String[] args) {
Demo demo = new Demo(100);
fun(demo);
System.out.println(demo.getNum());
}
public static void fun(Demo temp){
temp.setNum(30);
}
}
內(nèi)存關(guān)系圖如下:
內(nèi)存關(guān)系圖
例二
代碼如下:
public class MyClass {
public static void main(String[] args) {
String str = "hello";
fun(str);
System.out.println(str);
}
public static void fun(String temp){
temp = "world";
}
}
內(nèi)存關(guān)系圖如下:
內(nèi)存關(guān)系圖
例三
代碼如下:
class Demo {
private String str;
public Demo(String str) {
this.str = str;
}
public void setStr(String str) {
this.str = str;
}
public String getStr() {
return str;
}
}
public class MyClass {
public static void main(String[] args) {
Demo demo = new Demo("hello");
fun(demo);
System.out.println(demo.getStr());
}
public static void fun(Demo temp){
temp.setStr("world");
}
}
內(nèi)存關(guān)系圖如下:
內(nèi)存關(guān)系圖
引用傳遞一定要耐心使用內(nèi)存分析燕耿,String這種類型的數(shù)據(jù)需要特殊處理
對(duì)象比較
所謂的對(duì)象比較指的就是可以判斷兩個(gè)對(duì)象是否相等蘑拯。實(shí)際上現(xiàn)在對(duì)象是否相等只能夠依靠地址是否相同,但有些時(shí)候可能會(huì)出現(xiàn)地址不相同,但是內(nèi)容相同的情況,就好String類中的“==”與“equals()”的關(guān)系
因此垄分,首先要做的事情就是必須將兩個(gè)對(duì)象中的每一個(gè)屬性內(nèi)容分別比較,如果全部相同那么就表示同一個(gè)對(duì)象
代碼如下:
class Person{
private String name;
private int age;
public Person(String name,int age){
this.name = name;
this.age = age;
}
public boolean compare(Person person){
if (person == null){//沒有人時(shí)返回false
return false;
}
if (this == person){//對(duì)象時(shí)自己時(shí)返回false
return false;
}
if (this.name.equals(person.name) && this.age == person.age){
//進(jìn)行判斷
return true;
}
return false;
}
}
public class MyClass {
public static void main(String[] args) {
Person perA = new Person("張三",20);
Person perB = new Person("張三",20);
if (perA.compare(perB) == true){
System.out.println("這是同一個(gè)人概作!");
}else {
System.out.println("這是不同的人嗜价!");
}
}
}
引用傳遞實(shí)際應(yīng)用
程序是生活的濃縮艇抠,是生活的抽象,因此日常生活中的一切概念都可以用程序去描述久锥,那么下面描述這樣一個(gè)程序:一個(gè)人有一輛車
代碼如下:
class Person{
private int pid;
private String name;
private Car car;//一個(gè)人有一輛車
public Person(int pid,String name){
this.pid = pid;
this.name = name;
}
public String getPersonInfo(){
return "姓名:"+this.name+"家淤,編號(hào):"+this.pid;
}
public void setCar(Car car) {
this.car = car;
}
public Car getCar() {
return car;
}
}
class Car{
private String cname;
private Person person;//一輛車有一個(gè)人
public Car(String cname){
this.cname = cname;
}
public String getCarInfo(){
return "車輛品種:"+this.cname;
}
public void setPerson(Person person) {
this.person = person;
}
public Person getPerson() {
return person;
}
}
public class MyClass {
public static void main(String[] args) {
Person person = new Person(15,"張三");
Car car = new Car("法拉利");
person.setCar(car);
car.setPerson(person);
System.out.println(person.getPersonInfo());
System.out.println(person.getCar().getCarInfo());
}
}
引用的關(guān)系可以描述出不同類之間的引用關(guān)系,理論上任何的事物都可以進(jìn)行這樣的整合