关于Java中的局部变量

关于Java中的局部变量,java,Java,我有一个关于Java中局部变量的快速问题: 如果在声明一个局部变量时,我将其指向一个实例变量,那么该局部变量是作为对该实例变量的引用,还是作为一个临时的深度副本 换句话说,如果我在新初始化的局部变量上调用修饰符方法,局部变量是否会作为引用并在实例变量上调用修饰符,它会修改局部变量指向的复制版本,还是不能在局部变量上调用修饰符方法 例如 公共静态>布尔ISORTED(堆栈s){ …(一堆代码) else if(DynamicCarrayStack的实例) { …(一堆代码) DynamicArra

我有一个关于Java中局部变量的快速问题:

如果在声明一个局部变量时,我将其指向一个实例变量,那么该局部变量是作为对该实例变量的引用,还是作为一个临时的深度副本

换句话说,如果我在新初始化的局部变量上调用修饰符方法,局部变量是否会作为引用并在实例变量上调用修饰符,它会修改局部变量指向的复制版本,还是不能在局部变量上调用修饰符方法

例如

公共静态>布尔ISORTED(堆栈s){

…(一堆代码)

else if(DynamicCarrayStack的实例) { …(一堆代码)

DynamicArrayStack tempStack=(DynamicArrayStack)s; elem=(E)tempStack.pop()

…(一堆代码) } …(一堆代码) }

在“tempStack”上调用pop()是否也会导致在参数“s”指向的堆栈实例上调用pop()?还是只会影响我的“临时堆栈”的内容

如果在声明一个局部变量时,我将其指向一个实例变量,那么该局部变量是作为对该实例变量的引用,还是作为一个临时的深度副本

第一种选择。Java不会隐式地创建对象的深度副本。您拥有的是对实例对象的临时引用,实例变量也会引用该对象

如果在声明一个局部变量时,我将其指向一个实例变量,那么该局部变量是作为对该实例变量的引用,还是作为一个临时的深度副本


第一种选择。Java不会隐式地创建对象的深度副本。您拥有的是对实例对象的临时引用,实例变量也会引用它。

它的所有引用。因此,您提到的pop也会影响s,因为它是同一个对象。

它的所有引用。因此,您提到的pop也会影响s,因为它是同一个对象。

简短回答:是的,
s
tempStack
是引用同一实例的两个变量


调用
tempStack.pop()
与调用
s.pop()
是相同的,因为两者都引用相同的对象。

简短回答:是的,
s
tempStack
是引用相同实例的两个变量


调用
tempStack.pop()。但它不会更改在isSorted中传递的对象,因为参数在Java中是按值传递的

因此,如果你有:

Stack myStack = new Stack()
...
isSorted(myStack);
不会修改对象myStack。但是,如果在您的方法中对s和tempStack进行排序,则会

我的意思是:

s.pop()
将与相同

 tempStack.pop()
两个变量都引用同一对象,因此都将修改同一对象

我想再澄清一点


请注意,

它将更改s和tempStack(因为引用的是同一个元素)。但它不会更改在isSorted中传递的对象,因为参数在Java中是按值传递的

因此,如果你有:

Stack myStack = new Stack()
...
isSorted(myStack);
不会修改对象myStack。但是,如果在您的方法中对s和tempStack进行排序,则会

我的意思是:

s.pop()
将与相同

 tempStack.pop()
两个变量都引用同一对象,因此都将修改同一对象

我想再澄清一点


向您问好,

是的。请记住,java使用的是指针,而不是值。所以当你说

tempStack=s

tempStack实际上获取s的值,但在java中,该值是一个指针

现在tempStack和s都指向相同的数据


如果使用tempStack.pop(),则与使用s.pop()一样,反之亦然。

是。请记住,java使用的是指针,而不是值。所以当你说

tempStack=s

tempStack实际上获取s的值,但在java中,该值是一个指针

现在tempStack和s都指向相同的数据

如果使用tempStack.pop(),则与使用s.pop()一样,反之亦然。

在您的示例中,“tempStack”和“s”都指向同一个DynamicArrayStack实例(如果它是DynamicArrayStack)

为了使“tempStack”按程序员期望的方式运行,您需要首先在“s”上调用某种克隆/复制方法

Object类(所有其他类都必须从中扩展)为此提供了“clone”方法,但应该警告您,使用此方法被认为是不好的做法,因为它不提供深度副本,因此可能会引入一些古怪的bug;您应该使用。在您的示例中,“tempStack”和“s”都指向同一个DynamicArrayStack实例(如果它是DynamicArrayStack)

为了使“tempStack”按程序员期望的方式运行,您需要首先在“s”上调用某种克隆/复制方法


Object类(所有其他类都必须从中扩展)为此提供了“clone”方法,但应该警告您,使用此方法被认为是不好的做法,因为它不提供深度副本,因此可能会引入一些古怪的bug;您应该改用a。

欢迎使用堆栈溢出!你可能想阅读一些关于有效提问的提示。主要是,您的问题标题模棱两可,并且您包含的示例代码并不能很好地补充您的问题。欢迎使用Stack Overflow!你可能想阅读一些关于有效提问的提示。主要是,您的问题的标题模棱两可,并且您所包含的示例代码并不能很好地补充您的问题。它们都包含对同一对象的引用。局部变量不引用实例变量本身。如果实例变量更改为指向新对象