我有以下代码.
public class Parent {
@Override
public int hashCode() {
return 0;
}
}
public class Child extends Parent {
public void test() {
this.toString();
this.hashCode();
}
}
Run Code Online (Sandbox Code Playgroud)
正如您在上面的代码中看到的那样,Child从Object继承toString(),从Parent继承hashCode().Child#test的字节码操作如下.
ALOAD 0: this
INVOKEVIRTUAL Object.toString() : String
ALOAD 0: this
INVOKEVIRTUAL Child.hashCode() : int
RETURN
Run Code Online (Sandbox Code Playgroud)
我认为如果invokevirtual调用Object.toString(),它应该调用Parent.hashCode()以保持一致性.或者,调用Child.hashCode(),然后调用Child.toString().
但是,当且仅当Object继承目标方法时,invokevirtual才会保持其一致性.
只有这种情况,在Object中调用虚拟调用方法.对于其他情况,请在当前类中调用虚拟调用方法.
我想知道为什么会这样.
例如,如果将int变量a和b存储在局部变量1和2中,则此代码将进行计算this.f(3+b*a)。(此指针存储在变量0中)
iload_1
aload_0
icons_3
iload_1
iload_1
imul
iadd
invokevirtual #4
Run Code Online (Sandbox Code Playgroud)
#4站在这里代表什么?
基本上这个应用程序应该询问你的名字,并有一个保存的选项,当点击时,会弹出一个警告对话框并询问“你确定吗?”,当点击是时,它应该说“欢迎+随便输入什么名字” . 我的问题是该应用程序在说欢迎之前一直关闭。我将字符串声明为 userName 并在没有任何函数的情况下运行它,它只是说“欢迎,空”。但是当我做 userName=editText.getText().toString(); 该应用程序立即关闭。请帮助我的想法。调用欢迎页面的页面工作正常,但welcome.java 是有问题的文件。
public class Welcome extends Activity {
String userName;
final EditText editText=(EditText)findViewById(R.id.editText);
final TextView textView=(TextView)findViewById(R.id.textView);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.welcome);
final TextView textView=(TextView)findViewById(R.id.textView);
final EditText editText=(EditText)findViewById(R.id.editText);
userName=editText.getText().toString();
textView.setText(String.format("Welcome, %s.", userName));
}
}
Run Code Online (Sandbox Code Playgroud)
logcat 基本上是标题,以下行出错:
userName=editText.getText().toString();
Run Code Online (Sandbox Code Playgroud)
PS我在onCreate之前和之后移动了那行代码,它仍然给出错误
我的 MainActivity.java 是
import android.app.Activity;
import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.view.View;
public class MainActivity extends ListActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); …Run Code Online (Sandbox Code Playgroud)