1、t!=(t=tail)这个的结果是什么,其中原t和tail的引用地址不相同。
答案:是true。
stack=3, locals=2, args_size=1
0: ldc #2 // String 从常亮中取值到栈顶
2: astore_1 // 栈顶的值存放到第二个本地变量
3: aload_1 // 将第二个本地变量的引用值放到栈顶
4: ldc #3 // String 1 从常亮中取值到栈顶
6: dup // 复制栈顶元素并压倒栈顶
7: astore_1 // 栈顶元素保存到第二个本地变量
8: if_acmpeq 11 // 比较栈顶两个引用型值,如果相等跳转return
11: return
2、对于下面的代码执行结果是怎么样的?
public class Son extends Father{
public void myName(){
System.out.println("son");
}
public static void main(String[] args) {
Son sone = new Son();
sone.call();
}
}
class Father{
protected void myName(){
System.out.println("father");
}
public void call(){
this.myName();
Son son = new Son();
son.myName();
}
}
输出结果:
son
son
public class Son extends Father{
public void myName(){
System.out.println("son");
}
public static void main(String[] args) {
Son sone = new Son();
sone.call();
}
}
class Father{
private void myName(){
System.out.println("father");
}
public void call(){
this.myName();
Son son = new Son();
son.myName();
}
}
结果是:
father:
son
两个代码修饰符的不同,造成的结果不同的原因是对于调用私有方法使用的单独的
invokespecial指令,而对于调用已知推断出来不是私有的方法使用的是invokevirtual指令。