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关键字来访问它。 如果子类被当作父类使用,则通过子类访问的字段是父类的!

posted @ 2017-11-10 10:55  上官逸辉  阅读(115)  评论(0编辑  收藏  举报