Java - stack

栈(stack)的特点:后进先出。

Demo 1

public class Main {
	public static void main(String[] args) {
		int value = 7;
		value = calculate(value);
	}

	public static int calculate(int data) {
		int temValue = data + 3;
		int newValue = temValue * 2;
		return newValue;
	}

}

以上代码value最终结果为20。

方法

方法运行顺序:main() -> calculate()

方法退出顺序:calculate() -> main()

变量(本地局部变量)

calculate方法中变量执行顺序:data -> temValue -> newValue

calculate方法中变量返回顺序:newValue -> temValue -> data

Demo 2

pass variables by value - possible

main() - localValue 压入栈Stack,调用calculate()时,calcValue是localValue的一个拷贝。

calculate - calcValue压入栈Stack, 最后计算的是calcValue,但是原来的值localValue并未发生变化。

最终打印结果:5

pass variables by reference - impossible

Java不支持通过引用来传值。对于对象而言,Java传递的是对象的引用,而不是对象的实际值。

For objects passed into methods, the REFERENCE to the object is passed BY VALUE.

Demo 3

String类型的变量是不可更改的,因此会重新创建String值"Diane",原来的"Sally"会被垃圾回收。

最后,退出方法时,cust释放,引用c指向对象,最终输出结果:"Diane".

Demo 4

final修饰c,c指向对象Customer。

改变c所指的对象,此时编译报错,final不允许变量指向另一个对象。

但是可以改变对象的值。

name值被修改为"Susan",但是c仍然指向同一个对象。

Final Keyword means that a variable can only be assigned once, which means that when the variable in this stack is assigned to an object in the heap, then we can't change which object in the heap this variable points to. 

Demo 5

public class Test01 {
    public static void main(String[] args) {
        User u = new User("John");

        System.out.println(u.getName());
        System.out.println(u.getName());
    }
}
public class User {
    String name;

    public User() {
    }

    public User(String name) {
        this.name = name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        String temp = this.name;
        this.name = "xxx";
        return temp;
    }
}

打印结果:

John
xxx

因此,栈帧范围如下图所示便可以理解。

猜你喜欢

转载自blog.csdn.net/A_bad_horse/article/details/114148682