类和对象(二)

给对象引用变量赋值

对象变量的赋值和我们的直觉期望不同,例如:

Box box1=new Box();
Box b2=b1;

这种情况下b1,b2将引用同样的对象,将b1值赋给b2并没有分配任何内存或对原对象做任何部分的拷贝,所以,接下来的例子中,对b1的赋值仅仅使b1脱离初始对象,而没有影响对象或者b2 ,

Box box1=new Box();
Box b2=b1;
b1=null;

这里b1被设置为空,但是b2仍然指向原来的对象,所以,当你将一个对象引用赋给另一个对象引用时,你并没有创建该对象的一个拷贝,而是仅仅对引用的拷贝。

方法

类通常由两个部分构成:实例变量和方法,方法的通用格式是:

方法返回的数据类型  方法名(自变量列表){ 方法体  }
void tiji(){
System.out.println(chang*kuan*gao);
}

方法返回的数据类型可以是任何合法有效的数据类型,包括你创建的类的类型,如果该方法不返回任何值,则它的返回值必须为void,方法名除了被当前作用域中的其他项使用的标识符以外,方法名可以是任何合法的标识符,自变量列表是一系列类型和标识符对,用逗号分开,自变量本质上是变量,它接收方法被调用时传递给方法的参数值,如果方法没有自变量,那么自变量列表就为空,
如为Box添加一个方法:

package study;
//类和对象
 class Box{
     double chang;
     double kuan;
     double gao;
     void Tiji(){
         System.out.println("体积是: ");
         System.out.println(chang*kuan*gao);
     }
 }
 class BoxDemo{
     public static void main(String[] args) {
            Box mybox=new Box();
            Box mybox1=new Box();
            double tiji;
            mybox.chang=10;
            mybox.kuan=8;
            mybox.gao=7;
            mybox1.chang=12;
            mybox1.kuan=8;
            mybox1.gao=3;
            mybox1.Tiji();
            mybox1.Tiji();
 }
 }

这里写图片描述
在这个方法中要注意:实例变量chang,kuan,gao被直接引用 ,并没有在他们的前面加对象名或点号运算符,这是因为当一个方法使用由它的类定义的实例变量时,它可以直接这样做,而不必使用显式的对象引用和点号运算符,而当一个实例变量不是被该实例变量所在的类的部分代码访问时,它必须通过该对象加点运算符来访问,

把对象作为参数
package study;
//类和对象
 class Hezi{
     double chang;
     double kuan;
     double gao;
     Hezi(Hezi lzq){
         chang=lzq.chang;
         kuan=lzq.kuan;
         gao=lzq.gao;
     }
     Hezi(double c,double k,double g){
         chang=c;
         kuan=k;
         gao=g;
    }
     Hezi(){
         chang=-1;
         kuan=-1;
         gao=-1;
     }
     Hezi(double len){
         chang=kuan=gao=len;
     }
     double tiji(){
         return chang*kuan*gao;
     }
 }
 class BoxDemo{
     public static void main(String[] args) {
            Hezi mybox1=new Hezi(10,20,15);
            Hezi mybox2=new Hezi();
            Hezi mybox3=new Hezi(7);
            Hezi mybox4=new Hezi(mybox1);//对象做参数
            double tj;
            tj=mybox1.tiji();
            System.out.println("mybox1时:"+tj);
            tj=mybox2.tiji();
            System.out.println("mybox2时:"+tj);
            tj=mybox3.tiji();
            System.out.println("mybox3时:"+tj);
            tj=mybox4.tiji();
            System.out.println("mybox4时:"+tj);
 }
 }

这里写图片描述

参数时如何传递的

1.按值传递

package study;
class Test{
    void Lzq(int i,int j){
        i*=2;
        j/=2;
    }
}
public class TestDemo6 {

    public static void main(String[] args) {
        Test pwd=new Test();
        int a=15;
        int b=20;
        System.out.println("未进入方法Lzq之前:a="+a+",b="+b);
        pwd.Lzq(a, b);
        System.out.println("进入方法Lzq之后:a="+a+",b="+b);
    }

}

这里写图片描述
这种方法将一个参数值复制成为子程序的正式参数,这样,对子程序的参数的改变不影响调用它的参数,在例子中,Lzq()内部发生的操作不影响调用中的a,b的值,它们的值在本例中没有变为30和10,(变的是i和j),

2.引用调用

package study;
class Test{
    int a,b;
    Test(int i,int j){
        a=i;
        b=j;
    } 
    void lzq(Test pwd){
        pwd.a*=2;
        pwd.b/=2;
    }
}
public class TestDemo6 {

    public static void main(String[] args) {
        Test pwd=new Test(15,20);
        System.out.println("未进入方法lzq之前:"+pwd.a+","+pwd.b);
        pwd.lzq(pwd);
        System.out.println("进入方法lzq之后:"+pwd.a+","+pwd.b);

    }

}

这里写图片描述
在这种方法中,参数的引用(而不是参数值)被传递给子程序参数,在子程序中,该引用用来访问调用中指定的实际参数,这样对子程序参数的改变将会影响调用子程序的参数,当一个简单类型传递给一个方法时,使用按值传递,对象传递则按引用传递

返回对象

方法能够返回任何类型的数据,包括你创建的类的类型,例如在下面的程序中,lzq()方法返回一个对象,在该对象中的值a比调用对象中的a大10.

package study;
class Ttou{
    int a;
    Ttou(int i){
        a=i;
    }
    Ttou lzq(){
        Ttou pwd=new Ttou(a+10);
        return pwd;
    }
}
public class Test {
  public static void main(String[] args) {
        Ttou s1=new Ttou(5);
        Ttou s2;
        s2=s1.lzq();
        System.out.println("s1= "+s1.a);
        System.out.println("s2= "+s2.a);
        s2=s2.lzq();
        System.out.println("新的s2= "+s2.a);
    }

}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值