引用传递分析

(1)引用传递进阶分析
示例:


public class Test {


public static void main(String[] args) {
String str="hellow";
fun(str);
System.out.println( str);


}
public static void fun(String temp)
{
temp="world";

}


}
结果:hellow

注意:字符串常量一旦声明则不可改变,字符串内容的改变依靠的是地址的引用关系变更。如下图分析:





示例2:
public class Test {


public static void main(String[] args) {
Meesage msg=new Meesage();
msg.setNote("hellow");
fun(msg);
System.out.println(msg.getNote());


}
public static void fun(Meesage temp)
{
temp.setNote("world");
}
}
class Meesage
{
private String note;


public String getNote() {
return note;
}


public void setNote(String note) {
this.note = note;
}
}

结果:world

如下图分析:



(2)对象比较

示例:下面这个代码可能在实际开发中出现
public class Test {


public static void main(String[] args) {
Person perA=new Person("张三",20);
Person perB=new Person("张三",20);
//需要根据对象所拥有的的属性信息进行完整比对,name属性为String引用类性,用equals,而age为基本类性,可以用==
if(perA.getName().equals(perB.getName())&&perA.getAge()==perB.getAge())
{

  System.out.println("两个对象相等");
}else
{
System.out.println("两个对象不相等");
}

}

}
class Person
{
private String name;
    private int age;
    public Person(String name,int age)
    {
    this.name=name;
    this.age=age;
   
    }
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}



}
结果:两个对象相等




示例2:
~


public class Test {


public static void main(String[] args) {
Person perA=new Person("张三",20);
Person perB=new Person("张三",20);
//需要根据对象所拥有的的属性信息进行完整比对,name属性为String引用类性,用equals,而age为基本类性,可以用==
if(perA.compare(perB))
{

  System.out.println("两个对象相等");
}else
{
System.out.println("两个对象不相等");
}

}

}
class Person
{
private String name;
    private int age;
    public Person(String name,int age)
    {
    this.name=name;
    this.age=age;
   
    }
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//这时有2 个对象,一个是this表示当前的对象,另一个是Person
public boolean compare(Person per)
{
//此时per对象已经在类内,所以不受封装局限,可以直接“对象.属性”进行访问
if(this.name.equals(per.name)&&this.age==per.age)
{

return true;
}
return false;
}


}

结果:两个对象相等




(3)实际应用
示例:
现在有这样一种关系:一个人有一辆车或者没有车。所以应该有2个实体类,一个是人member,一个是车car。


public class Test {


public static void main(String[] args) {
//分别根据关系设置相应的数据
//1分别创建各自对象的实例
Member mem=new Member("张飒",27);
Car car=new Car("法拉利",5000000);
//2设置对象键间的引用关系
    mem.setCar(car);//一个人有一辆车
    car.setMember(mem);//一辆车属于一个人
   //第二步:根据关系取出数据
   //3通过人可以找到车
    System.out.println(mem.getMemberInfo());
    //因为getcar()的返回值是car,所以去Car类中调用getCarInfo()方法
    System.out.println(mem.getCar().getCarInfo());
    //4通过车找到人
    System.out.println(car.getCarInfo());
    System.out.println(car.getMember().getMemberInfo());
    
 
}

}
class Member
{
private String name;
    private int age;
    private Car car;//一个人只能有一个车,所以在人里面描述一个车的对象
    public Car getCar() {
return car;
}
public void setCar(Car car) {
this.car = car;
}
public Member(String name,int age)
    {
    this.name=name;
    this.age=age;
   
    }
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
   public String getMemberInfo()
   {
  
  return "name="+this.name+",age="+this.age;
   }
   


}
class Car
{
private String name;
   private double price;
   private Member member;//车属于一个人
   public Member getMember() {
return member;
}
public void setMember(Member member) {
this.member = member;
}
public Car(String name,double price)
   {
    this.name=name;
    this.price=price;
   }
   public String getCarInfo()
   {
    return "name="+this.name+",price="+this.price;
   
   }

}


结果:
name=张飒,age=27
name=法拉利,price=5000000.0
name=法拉利,price=5000000.0
name=张飒,age=27




示例:进一步设计,张飒会有孩子,孩子会有车。有2个方法:
~建立一个孩子类,如果有孙子,建立一个孙子类,这不可能。
~第二种:直接在Member类中建立一个新的属性,描述孩子的类型,这个属性的类型就是Memebr。


public class Test {


public static void main(String[] args) {
//分别根据关系设置相应的数据
//1分别创建各自对象的实例
Member mem=new Member("张飒",27);
Car car=new Car("法拉利",5000000);
Member child=new Member("张三",12);
Car car1=new Car("碰碰车",124);
//2设置对象键间的引用关系
    mem.setCar(car);//一个人有一辆车
    mem.setChild(child);//一个人有一个孩子
    child.setCar(car1);//孩子的车
    car.setMember(mem);//一辆车属于一个人
   //第二步:根据关系取出数据
   //3通过人可以找到车
    System.out.println(mem.getMemberInfo());
    //因为getcar()的返回值是car,所以去Car类中调用getCarInfo()方法
    System.out.println(mem.getCar().getCarInfo());
    //4通过车找到人
    System.out.println(car.getCarInfo());
    System.out.println(car.getMember().getMemberInfo());
    //5通过人找到孩子
    System.out.println(mem.getChild().getMemberInfo());
    //6通过人找到孩子的车.
    System.out.println(mem.getChild().getCar().getCarInfo());
 
}

}
class Member
{
private String name;
    private int age;
    private Car car;//一个人只能有一个车,所以在人里面描述一个车的对象
    private Member child;
    public Member getChild() {
return child;
}
public void setChild(Member child) {
this.child = child;
}
public Car getCar() {
return car;
}
public void setCar(Car car) {
this.car = car;
}
public Member(String name,int age)
    {
    this.name=name;
    this.age=age;
   
    }
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
   public String getMemberInfo()
   {
  
  return "name="+this.name+",age="+this.age;
   }
   


}
class Car
{
private String name;
   private double price;
   private Member member;//车属于一个人
   public Member getMember() {
return member;
}
public void setMember(Member member) {
this.member = member;
}
public Car(String name,double price)
   {
    this.name=name;
    this.price=price;
   }
   public String getCarInfo()
   {
    return "name="+this.name+",price="+this.price;
   
   }

}
结果:
name=法拉利,price=5000000.0
name=张飒,age=27
name=张三,age=12
name=碰碰车,price=124.0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值