06-动手动脑
1.
请按照以下步骤进行技术探险:
(1)使用javap –c命令反汇编ExplorationJDKSource.class;
(2)阅读字节码指令,弄明白println()那条语句到底调用了什么?
(3)依据第(2)得到的结论,使用Eclipse打开JDK源码,查看真正被执行的代码是什么
激动啊,我终于发现了……
前面示例中,main方法实际上调用的是:public void println(Object x),这一方法内部调用了String类的valueOf方法。
valueOf方法内部又调用Object.toString方法:public String toString() { return getClass().getName() +"@" + Integer.toHexString(hashCode()); } hashCode方法是本地方法,
由JVM设计者实现: public native int hashCode();
2.在子类中,若要调用父类中被覆盖的方法,可以使用super关键字。
class Parent { public void ASD() { System.out.println("Parent "); } } class Child extends Parent { public void ASD() { super.ASD(); System.out.println("Child "); } } public class Test { public static void main(String[] args) { // TODO Auto-generated method stub Child c = new Child(); c.ASD(); } }
Java“方法覆盖”的语法规则
(1)覆盖方法的允许访问范围不能小于原方法。
(2)覆盖方法所抛出的异常不能比原方法更多。
(3)声明为final方法不允许覆盖。 例如,Object的getClass()方法不能覆盖。
(4)不能覆盖静态方法。
3.
下列语句哪一个将引起编译错误?为什么?哪一个会引起运行时错误?
m=d;
d=m;
d=(Dog)m;
d=c;
c=(Cat)m;
第二个和第三个会出错
结果截图:
原因:父类不可直接给子类赋值,子类可以直接给父类赋值,同为子类不能相互赋值,父类可强制类型转换给子类赋值
4.运行以下测试代码
1. 左边的程序运行结果是什么?
2. 你如何解释会得到这样的输出?
3. 计算机是不会出错的,之所以得 到这样的运行结果也是有原因的,
那么从这些运行结果中,你能总 结出Java的哪些语法特性?
当子类与父类拥有一样的方法,并且让一个父类变量引用一个子类对象时,到底调用哪个方法,由对象自己的“真实”类型所决定,这就是说:对象是子类型的,它就调用子类型的方法,是父类型的,它就调用父类型的方法。 这个特性实际上就是面向对象“多态”特性的具体表现。
如果子类与父类有相同的字段,则子类中的字段会代替或隐藏父类的字段,子类方法中访问的是子类中的字段(而不是父类中的字段)。如果子类方法确实想访问父类中被隐藏的同名字段,可以用super关键字来访问它。 如果子类被当作父类使用,则通过子类访问的字段是父类的!