Java引用传递进阶分析
我们通过几个例子与内存关系图进一步的分析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);
}
}
内存关系图如下:
例二
代码如下:
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";
}
}
内存关系图如下:
例三
代码如下:
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");
}
}
内存关系图如下:
引用传递一定要耐心使用内存分析,String这种类型的数据需要特殊处理
对象比较
所谓的对象比较指的就是可以判断两个对象是否相等。实际上现在对象是否相等只能够依靠地址是否相同,但有些时候可能会出现地址不相同,但是内容相同的情况,就好String类中的“==”与“equals()”的关系
因此,首先要做的事情就是必须将两个对象中的每一个属性内容分别比较,如果全部相同那么就表示同一个对象
代码如下:
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){//没有人时返回false
return false;
}
if (this == person){//对象时自己时返回false
return false;
}
if (this.name.equals(person.name) && this.age == person.age){
//进行判断
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("这是同一个人!");
}else {
System.out.println("这是不同的人!");
}
}
}
引用传递实际应用
程序是生活的浓缩,是生活的抽象,因此日常生活中的一切概念都可以用程序去描述,那么下面描述这样一个程序:一个人有一辆车
代码如下:
class Person{
private int pid;
private String name;
private Car car;//一个人有一辆车
public Person(int pid,String name){
this.pid = pid;
this.name = name;
}
public String getPersonInfo(){
return "姓名:"+this.name+",编号:"+this.pid;
}
public void setCar(Car car) {
this.car = car;
}
public Car getCar() {
return car;
}
}
class Car{
private String cname;
private Person person;//一辆车有一个人
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());
}
}
引用的关系可以描述出不同类之间的引用关系,理论上任何的事物都可以进行这样的整合