您的位置:首页 > 移动开发 > Objective-C

一、Object对象

2016-06-08 19:03 579 查看
今天简单看了一下Object.大多是native方法.突然有一种把native翻出来看看的冲动.吼吼.废话不多说了。贴代码.看注释

Object内容学习
Object分析

transient关键字

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没有传值过来.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息