引用传递分析
(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