java中为对象返回一个引用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中为对象返回一个引用相关的知识,希望对你有一定的参考价值。
我在看书是看到了关于new的作用,其中有一条是为对象返回一个引用,不懂,希望达人能用例子讲解。
将一个对象的引用指向这个对象的实例,然后用对象的这个引用来操作类的实例。创建一个文件,文件名Test.java
然后输入以下内容
class test
public int i=0;
//test类有了那么怎么样操作这个类呢,先要创建对象,并让一个引用指向这个实例对象
public class Test
public static void main(String[] s)
test t=new test();
//这时new test();就得到了test这个类实例的引用了。
//然后操作这个类
System.out.println(t.i);
参考技术A 例:A a = new A();
就是new出个内存空间,并把地址给a
a指向的是new出来的空间
同理如:B b = a 则是a把他引用的地址复制给b
b和a是指向的是同一内存空间 参考技术B 例如MyClass a = new MyClass();其实类似C的指针。new MyClass();在内存中开辟一块空间。名为a的对象,它指向这个空间的地址。如果再有MyClass b = a;
那么b也只想刚才的那块空间地址。所以a,b都是引用 参考技术C 返回的引用,你不用理解这个引用是到底是什么含义.你只须了解,通过这个引用你可以操作你所声明的对象的一切,也可以说是指针吧,反正我也没看出跟指针有什么不同.虽然说java里是没有指针的,只因为这里吧 参考技术D 你要明白堆和栈的概念。
new的东西一般是存放在堆里面, new以后就在栈里面用了一个指针指向了堆。
java(初学者):返回一个对象?它是作为常量引用返回还是啥?
【中文标题】java(初学者):返回一个对象?它是作为常量引用返回还是啥?【英文标题】:java (beginner) : returning an object ? is it returned as a constant reference or what?java(初学者):返回一个对象?它是作为常量引用返回还是什么? 【发布时间】:2011-05-11 11:02:34 【问题描述】:我有一个返回用户定义对象的函数。首先,我想知道该对象是否通过引用返回,如果它是私有的怎么办?
另外,我如何将它作为常量(最终)引用返回,因为我不希望有人弄乱它?我对返回一个对象和返回 object.copy(); 感到很困惑。或 object.clone();
【问题讨论】:
【参考方案1】:它返回对象的引用。
假设你有一个类似的方法调用。
Object obj = makeObject();
创建一个 Object 并返回(它是在 makeObject 方法中创建的对象的引用)。
【讨论】:
【参考方案2】:在 Java 中,您总是返回一个引用(除非返回值是基本类型,例如 int
、float
、char
,...)。
因此,如果您不想修改返回的对象,则必须返回它的完整副本(如果您的类定义了,您可以使用Clonable
接口和clone
方法它)。
【讨论】:
...或者对象被设计为不可变的。 @Michael Borgwardt:很重要。我认为将其添加到答案中会使提出问题的人感到困惑... 是引用传递的数组吗?据我所知,它是一种原始类型,但它是可变的。【参考方案3】:1) 是的,它返回对对象的引用。
2) 如果方法是私有的,那么它只能在类内部调用。
3) 创建一个对象final
不会阻止其他人调用它的方法。有一些方法可以通过使用包和方法可见性来使对象不可变。 (查看 public、protected 和 private 的工作方式)
4) 没有Object.copy()
5) Object.clone()
是一头乱七八糟的野兽。
【讨论】:
【参考方案4】:因此,要回答您的问题,您首先必须了解 Java 是如何传递变量的。
一个变量有一个值:
int i = 1234;
Person p = new Person("Peter");
现在,变量 i 正好包含 1234,而变量 p 包含创建的 Person 的内存地址。
所以 i 包含 1234,p 包含地址(比如说 a4dfi3)。
anyMethodYouLike(p);
System.out.println(p.getName());
public void anyMethodYouLike(Person somePerson)
somePerson.rename("Homer");
所以在这个例子中,我们给方法 anyMethodYouLike 变量 p...等等!我们给方法变量的值(a4dfi3)。然后,该方法对该变量调用 rename(它仍然具有与 p 相同的地址,因此它修改了 p 指向的同一 Person)。 因此,在方法之后,p 指向的人的名称被打印出来,结果是“荷马”。
someOtherMethod(p);
System.out.println(p.getName());
public void someOtherMethod(Person somePerson)
somePerson = new Person("Walter");
在此示例中,我们仍然将名为“Peter”的 Person 的地址提供给 Method。但是这一次,该方法在 somePerson 中创建了一个新的 Person (因此将 somePerson 中的地址覆盖到......让我们说 13n37s。 但! a4dfi3 的人没有改变! print 调用仍然输出“Peter”而不是“Walter”。
现在,让我们看看它在原语中的表现:
someMethod(i);
System.out.println(i);
public void someMethod(int someInt)
someInt++;
因此,i (1234) 的值被传递给 someInteger。然后 someInteger 递增到 1235。但 i 仍然是 1234。
这是 Java 中对象和原语的最大区别。
现在回答您的问题: 1. 正如您在此处所读到的,是的,Java 总是传递对象的引用地址。 2. 如果你不想让别人弄乱你的对象的值,你必须先用这些信息创建一个新的对象(例如使用 Cloneable 和 clone()),但这真的是一团糟,因为你必须确保,你的对象中所有不是原始的东西都会被重新创建,当你有巨大的对象树结构时,这真是太糟糕了。
希望能帮到你 费迪265
【讨论】:
【参考方案5】:您真正应该意识到的是,“通过”或“返回”并没有什么特别之处。每当您“传递”或“返回”某物时,它只是传递了该事物的价值。时期。对于任何类型。每当你“传递”或“返回”某个东西时,它与简单地将它分配给一个变量完全相同。
然而,什么是你传递或返回的东西的价值?这就是你的困惑所在。您的问题询问“归还对象”;但是,这样的事情在 Java 中没有意义。对象不是 Java 中的值。不可能有一个值为对象的变量。
Java 中唯一的类型是原始类型和引用类型。因此,唯一的值是原语和引用。 (引用是指向对象的指针。)在Java 中,我们只通过引用(指向对象的指针)来操作对象。我们不能将对象存储在变量中;但是我们可以将引用(指向对象的指针)存储在变量中。所以当你谈论传递或返回对象时,你几乎肯定是在谈论传递或返回引用。而且,如前所述,传递或返回引用并没有什么特别之处——传递或返回引用的值(指针)。
【讨论】:
以上是关于java中为对象返回一个引用的主要内容,如果未能解决你的问题,请参考以下文章
java(初学者):返回一个对象?是作为常量引用返回还是什么?
Java基础 -- new对象实体与对象引用方法的返回值构造方法== 与 equalshashCode 与 equals为什么Java只有值传递