在Java中传递和返回对象

作者: Arvin Chen 分类: Java 来源: Break易站(www.breakyizhan.com)

在Java中传递和返回对象

虽然Java 严格按照值传递,但是精确的效果在传递基本类型还是引用类型之间是不同的。

当我们将一个原始类型传递给一个方法时,它将按值传递。但是当我们将一个对象传递给一个方法时,情况会发生巨大的变化,因为对象是通过有效调用的方式传递的。Java做这个有趣的事情,这是一种混合传递值和传递引用。基本上,函数不能更改参数,但函数可以通过调用其中的某些方法来让参数自行更改。

  • 在创建类类型的变量时,我们只创建一个对象的引用。因此,当我们将此引用传递给方法时,接收它的参数将引用与参数引用的对象相同的对象。
  • 这实际上意味着对象的行为就好像通过使用引用调用来传递给方法一样。
  • 方法内部对象的改变确实反映在用作参数的对象中。

在Java中,我们可以将对象传递给方法。例如,请考虑以下程序:

// Java program to demonstrate objects
// passing to methods.
class ObjectPassDemo
{
    int a, b;

    ObjectPassDemo(int i, int j)
    {
        a = i;
        b = j;
    }

    // return true if o is equal to the invoking
    // object notice an object is passed as an
    // argument to method
    boolean equalTo(ObjectPassDemo o)
    {
        return (o.a == a && o.b == b);
    }
}

// Driver class
public class Test
{
    public static void main(String args[])
    {
        ObjectPassDemo ob1 = new ObjectPassDemo(100, 22);
        ObjectPassDemo ob2 = new ObjectPassDemo(100, 22);
        ObjectPassDemo ob3 = new ObjectPassDemo(-1, -1);

        System.out.println("ob1 == ob2: " + ob1.equalTo(ob2));
        System.out.println("ob1 == ob3: " + ob1.equalTo(ob3));
    }
}

输出:

ob1 == ob2:true
ob1 == ob3:false
  • 创建了三个对象'ob1','ob2'和'ob3':
    ObjectPassDemo ob1 = new ObjectPassDemo(100,22);
    ObjectPassDemo ob2 = new ObjectPassDemo(100,22);
    ObjectPassDemo ob3 = new ObjectPassDemo(-1,-1);
    

    在Java中传递和返回对象

  • 在方法方面,声明了一个名为a的Foo类型的引用,并且它的初始值为null。
    boolean equalTo(ObjectPassDemo o);
    

    在Java中传递和返回对象

  • 当我们调用方法equalTo时,引用'o'将被分配给作为参数传递的对象,即'o'将引用'ob2'作为以下语句执行。
    System.out.println(“ob1 == ob2:”+ ob1.equalTo(ob2));
    

    在Java中传递和返回对象

  • 现在我们可以看到,'ob1'上调用了equalTo方法,'o'指的是'ob2'。由于'a'和'b'的值对于两个引用都是相同的,所以如果(条件)为真,那么将返回布尔值true。
    if(oa == a && ob == b)
    
  • 执行以下语句时,'o'将重新分配给'ob3'。
    System.out.println(“ob1 == ob3:”+ ob1.equalTo(ob3));
    

    在Java中传递和返回对象

  • 现在我们可以看到,'ob1'上调用了equalTo方法,'o'指的是'ob3'。由于'a'和'b'的值对于两个引用都不相同,所以如果(条件)为假,那么else块将执行并且将返回false。

定义一个将其类的对象作为参数的构造函数

对象参数最常见的用途之一是构造函数。通常,在实践中,需要构建一个新对象,以便它最初与某个现有对象相同。为此,我们可以使用Object.clone()方法或定义一个将其类的对象作为参数的构造函数。下面的例子说明了第二个选项:

// Java program to demonstrate one object to
// initialize another
class Box
{
    double width, height, depth;

    // Notice this constructor. It takes an
    // object of type Box. This constructor use
    // one object to initialize another
    Box(Box ob)
    {
        width = ob.width;
        height = ob.height;
        depth = ob.depth;
    }

    // constructor used when all dimensions
    // specified
    Box(double w, double h, double d)
    {
        width = w;
        height = h;
        depth = d;
    }

    // compute and return volume
    double volume()
    {
        return width * height * depth;
    }
}

// driver class
public class Test
{
    public static void main(String args[])
    {
        // creating a box with all dimensions specified
        Box mybox = new Box(10, 20, 15);

        //  creating a copy of mybox
        Box myclone = new Box(mybox);

        double vol;

        // get volume of mybox
        vol = mybox.volume();
        System.out.println("Volume of mybox is " + vol);

        // get volume of myclone
        vol = myclone.volume();
        System.out.println("Volume of myclone is " + vol);
    }
}

输出:

Volume of mybox is 3000.0
Volume of myclone is 3000.0

返回对象

在java中,一个方法可以返回任何类型的数据,包括对象。例如,在以下程序中,incrByTen()方法返回一个对象,其中(整数变量)的值比调用对象中的值大10。

// Java program to demonstrate returning
// of objects
class ObjectReturnDemo
{
    int a;

    ObjectReturnDemo(int i)
    {
        a = i;
    }

    // This method returns an object
    ObjectReturnDemo incrByTen()
    {
        ObjectReturnDemo temp =
               new ObjectReturnDemo(a+10);
        return temp;
    }
}

// Driver class
public class Test
{
    public static void main(String args[])
    {
        ObjectReturnDemo ob1 = new ObjectReturnDemo(2);
        ObjectReturnDemo ob2;

        ob2 = ob1.incrByTen();

        System.out.println("ob1.a: " + ob1.a);
        System.out.println("ob2.a: " + ob2.a);
    }
}

输出:

ob1.a:2
ob2.a:12

注意:当一个对象引用传递给一个方法时,引用本身是通过使用值调用来传递的。但是,由于传递的值是指对象,因此该值的副本仍将引用与其相应参数相同的对象。这就是为什么我们说java 严格按照价值传递

  •   本文标题:在Java中传递和返回对象 - Break易站
    转载请保留页面地址:https://www.breakyizhan.com/java/4144.html

    发表笔记

    电子邮件地址不会被公开。 必填项已用*标注

    更多阅读