传递对象_【第5章:面向对象基础】_引用传递及其应用

范例1

class Demo{

       int temp=30;

}

public class TestJava{

       public static void main(String args[]){

              Demo d1=new Demo();

              d1.temp=50;

              System.out.println("fun()方法调用之前:"+d1.temp);

              fun(d1);

              System.out.println("fun方法调用之后:"+d1.temp);

       }

       public static void fun(Demo d2){

              d2.temp=1000;

       }

}

由于是引用地址的传递,所以对象的temp属性最终是被改变了。

D:\>javac TestJava.java

D:\>java TestJava

fun()方法调用之前:50

fun方法调用之后:1000

范例2

public class TestJava{

       public static void main(String args[]){

              String str1="hello";

              System.out.println("fun方法调用之前:"+str1);

              fun(str1);

              System.out.println("fun方法调用之后:"+str1);

       }

       public static void fun(String str2){

              str2="lies";

       }

}

执行结果

D:\>javac TestJava.java

D:\>java TestJava

fun方法调用之前:hello

fun方法调用之后:hello

为什么最终结果没有被改变呢?因为String类当有多个栈的引用同一个堆内存时候,若某一个栈试图改变堆值,若值不相同则会为这个要进行改变值的栈单独开辟一块空间并赋值。

范例3

class Demo{

       String temp="hello";

}

public class TestJava{

       public static void main(String args[]){

              Demo d1=new Demo();

              d1.temp="world";

              System.out.println("fun方法调用之前:"+d1.temp);

              fun(d1);

              System.out.println("fun方法调用之后:"+d1.temp);

       }

       public static void fun(Demo d2){

              d2.temp="lies";

       }

}

输出结果

D:\>javac TestJava.java

D:\>java TestJava

fun方法调用之前:world

fun方法调用之后:lies

同样是String类型,为什么这次就能改变了呢?

因为这次虽然值在改变,但是栈从来没有换,String类当栈的对于堆内存改变,则会断开与原来栈的连接并将新的值开辟一个空间然后用这个新空间重新连接到原来的栈上。

范例4

class Demo{

       private int temp=30;

       public void fun(Demo d2){

                     d2.temp=50;

       }

       public int getTemp(){

              return temp;

       }

}

public class TestJava{

       public static void main(String args[]){

              Demo d1=new Demo();

              d1.fun(d1);

              System.out.println(d1.getTemp());

       }

}

输出结果

D:\>javac TestJava.java

D:\>java TestJava

50

为什么private属性的值也可以被类的对象直接修改?

因为当前类的对象直接修改时所处环境是在当前类的public中,并且public接收的参数类型就是当前类。

范例5

class Person{                // 定义Person

       private String name ;    // 姓名

       private int age ;            // 年龄

       private Book book ;             // 一个人有一本书

       private Person child ;    // 一个人有一个孩子

       public Person(String name,int age){

              this.setName(name) ;

              this.setAge(age) ;

       }

       public void setName(String n){

              name = n ;

       }

       public void setAge(int a){

              age = a ;

       }

       public String getName(){

              return name ;

       }

       public int getAge(){

              return age ;

       }

       public void setBook(Book b){

              book = b ;

       }

       public Book getBook(){

              return book ;

       }

       public void setChild(Person c){

              child = c ;

       }

       public Person getChild(){

              return child ;

       }

};

class Book{                         // 定义Book

       private String title ;       // 标题

       private float price ;       // 价格

       private Person person ; // 一本书属于一个人

       public Book(String title,float price){

              this.setTitle(title) ;

              this.setPrice(price) ;

       }

       public void setTitle(String t){

              title = t ;

       }

       public void setPrice(float p){

              price = p ;

       }

       public String getTitle(){

              return title ;

       }

       public float getPrice(){

              return price ;

       }

       public void setPerson(Person p){

              person = p ;

       }

       public Person getPerson(){

              return person ;

       }

};

class Demo{

       private int temp=30;

       public void fun(Demo d2){

                     d2.temp=50;

       }

       public int getTemp(){

              return temp;

       }

}

public class TestJava{

       public static void main(String args[]){

              Person per = new Person("张三",30) ;

              Person cld = new Person("张草",10) ; // 定义一个孩子

              Book bk = new Book("JAVA SE核心开发",90.0f) ;

              Book b = new Book("一千零一夜",30.3f) ;

              per.setBook(bk) ;          // 设置两个对象间的关系,一个人有一本书

              bk.setPerson(per) ;       // 设置两个对象间的关系,一本书属于一个人

              cld.setBook(b) ;            // 设置对象间的关系,一个孩子有一本书

              b.setPerson(cld) ;          // 设置对象间的关系,一本书属于一个孩子

              per.setChild(cld) ;         // 设置对象间的关系,一个人有一个孩子

              System.out.println("从人找到书 --> 姓名:" + per.getName()+";年龄:"

                     + per.getAge() +";书名:" + per.getBook().getTitle() + ";价格:"

                     + per.getBook().getPrice()) ; // 可以通过人找到书

              System.out.println("从书找到人 --> 书名:" + bk.getTitle() + ";价格:"

                     + bk.getPrice() + ";姓名:" + bk.getPerson().getName() + ";年龄:"

                     + bk.getPerson().getAge()) ; // 也可以通过书找到其所有人

              // 通过人找到孩子,并找到孩子所拥有的书

              System.out.println(per.getName() + "的孩子 --> 姓名:"

                     + per.getChild().getName() + ";年龄:" + per.getChild().getAge()

                     + ";书名:" + per.getChild().getBook().getTitle() + ";价格:"

                     + per.getChild().getBook().getPrice()) ;

       }

}

输出结果:

b25043aede4e1e46d4383c711b4ac1f4.png

这个范例就没有什么了,主要是一种设计,主要理解的是对于孩子不用单独建立一个类关联于当前这个人,因为孩子也是人,可以共用人类。然后当前类给一个孩子的属性,属性类型是人即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值