今天简单看了一下Object.大多是native方法.突然有一种把native翻出来看看的冲动.吼吼.废话不多说了。贴代码.看注释
Object内容学习
Object分析
package java.lang;
public class Object {
/**
*
*transient修饰的变量只存在于内存中
*需要注意的是.用intent传递参数时.transient修饰的变量是不会传递的。也不会存到设备中
*shadow$_klass_ 和 shadow$_monitor_用来支持brooks pointer
*/
private transient Class<?> shadow$_klass_;
private transient int shadow$_monitor_;
/**
* 构造函数.
*/
public Object() {
}
//clone 函数.实际调用的是native函数internalClone.internalClone等以后编译framework再讲咯
protected Object clone() throws CloneNotSupportedException {
if (!(this instanceof Cloneable)) {
throw new CloneNotSupportedException("Class " + getClass().getName() +
" doesn't implement Cloneable");
}
return internalClone();
}
/*
* Native helper method for cloning.
*/
private native Object internalClone();
//当是对象的时候(没有被重写时).equals其实是用==号实现的.这里的==号是比较对象的内存地址
public boolean equals(Object o) {
return this == o;
}
//内存回收的方法.
@FindBugsSuppressWarnings("FI_EMPTY")
protected void finalize() throws Throwable {
}
public final Class<?> getClass() {
return shadow$_klass_;
}
//产生hashCode的方法.这个方法感兴趣的朋友.可以仔细研究一下
public int hashCode() {
int lockWord = shadow$_monitor_;
final int lockWordStateMask = 0xC0000000; // Top 2 bits.
final int lockWordStateHash = 0x80000000; // Top 2 bits are value 2 (kStateHash).
final int lockWordHashMask = 0x0FFFFFFF; // Low 28 bits.
if ((lockWord & lockWordStateMask) == lockWordStateHash) {
return lockWord & lockWordHashMask;
}
return System.identityHashCode(this);
}
//默认情况.打印的是16位的 hashCode.
public String toString() {
return getClass().getName() + '@' + Integer.toHexString(hashCode());
}
//线程的方法
public final native void notify();
public final native void notifyAll();
public final native void wait() throws InterruptedException;
public final void wait(long millis) throws InterruptedException {
wait(millis, 0);
}
public final native void wait(long millis, int nanos) throws InterruptedException;
}
transient关键字
TransientTest.class
public class TransientTest implements Serializable {
//为了测试简单,get set 省略了
public String name;
public transient int age;
@Override
public String toString() {
return "TransientTest{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
MainActivity.class
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TransientTest transientTest = new TransientTest();
transientTest.age=11;
transientTest.name="helloworld";
Log.e("MainActivity=",transientTest.toString());
Intent intent = new Intent(this,TestActivity.class);
intent.putExtra("test",transientTest);
startActivity(intent);
}
}
TestActivity.class
public class TestActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test);
TransientTest transientTest = (TransientTest) getIntent().getSerializableExtra("test");
Log.e("TestActivity=", transientTest.toString());
}
}
打印结果:
MainActivity=: TransientTest{name='helloworld', age=11}
TestActivity=: TransientTest{name='helloworld', age=0}
结果解释:transient修饰的age没有传值过来.