问题1:
参数类型决定使用哪个函数:
A.m(A)
B.m(B)而m(a)中a是A,所以调用A.m,
同理m(b)中b是B,所以调用B.m。

解决方案 »

  1.   

    问题5:
    class A是m()的内部声明,main()当然不认得。把它拿出来就行了:public class B  
    {
    int i=5;class A{
      public  void n(){
        System.out.println("i="+i);
      }
    }public static void m(B b){
      System.out.println("B!");
    }public static void main(String[] args) 
    {
     
      A a=new A();   
              a.n();}}
      

  2.   

    问题6:
    Runtime error在compile时是查不出来的。
      

  3.   

    问题1:
    比较简单。类似于C++中的同名局部函数和全局函数。使用最靠近的一个。
    “更奇怪的是,在下面这个程序中我并没有定义B类,但它仍然可以运行” ==〉可能是因为
    你上面编译的.class文件还在。
    附加说明:static 方法没有 override 一说,或者说 static 不能 override,见问题三解答问题2:
    this和super在构造函数中只能放在第一句,
    那么这是不是就意味着他们不能同时存在于同一个构造函数中?
    是的。在java中,调用super() 和 this() 似乎不太提倡,至少没有C++中那么普遍。一般调用this
    的替代方法是
    class test
    {
        test()
        {
            init();//多个构造函数通用的初始化
        }    test(int i)
        {
            init();//多个构造函数通用的初始化
            ....    //其他初始化
        }
    }   问题3:
    7-7页第二行“You cannot override a static method but you can hide it。”
    这句话是什么意思?
    因为java 中static method 在编译时进行替换,类似于C++中的宏,普通函数有多态性,
    static method 没有多态性,无法重载(override)。可以在子类中指定static method 为 private,则hide 此 static method.
    例如:
    class base
    {
        static void staticMethod()
        {
            System.out.println("base staticMethod()");
        }    void noneStaticMethod()
        {
            System.out.println("base noneStaticMethod()");
        }
    }class Sub extends base
    {
        private static void staticMethod()
        {
            System.out.println("Sub staticMethod()");
        }    void noneStaticMethod()
        {
            System.out.println("Sub noneStaticMethod()");
        }}class test
    {
        public static void main(String[] args)
        {
            Sub s = new Sub();
            base b = s;
            b.staticMethod();       //编译时替换成base.staticMethod();输出 base staticMethod()
            b.noneStaticMethod();   //编译时不替换,输出 Sub noneStaticMethod(),虚函数多态
        }
    }问题4:
    7-12页第4行,“Methods ed as static or private might be optimized
    by the compiler as if they had been ed final,because dynamic binding
    cannot be applied in either case.”是什么意思?
    用final修饰的static或者private方法(函数)可以被编译器进行优化,因为这两种情况下都
    不是动态绑定。
    动态绑定的方法不能进行优化,可以这样想,动态绑定的情况下不确定的因素很多,无法优
    化(实际不一定)。问题5:
    class A是m()的内部声明,main()当然不认得。把它拿出来到class一级就行了。注意内部class
    有static 和没有static 时实例化是不一样的。问题6:
    a=4/d;执行时有异常,跳到catch里面执行,然后执行 finally里的程序。
    System.out.println("will not be printed!");这一行代码没有错,执行时跳过去了。问题7:
    Base b=new Base();
    Sub s=(Sub) b;
    为什么会抛出运行异常Runtime Exception ?
    Sub s=(Sub) b;只有当b的实际类型(指向类型)是Sub时才可以进行这种强制转换。在C++中也是这样。问题8:
    String 类是“不可改变的”。对字符串修改都会生成新的字符串。
    t.piggy(oldName);
    ...
        public void piggy(String sName){    //这里sName 等于上面的oldName,引用相等
            sName = sName + " wiggy";   //+操作会重新生成一个字符串,相当于 sName = new String(sName + " wiggy");
                                    //这以后sName != oldName.
            start();
        }问题9:
    调用run,覆盖run,普通函数调用,线程没有启动。pm1.run();没有完不会往下执行。
    若调用start(),覆盖run(),正常的多线程程序。结果不定。
    若调用run(),覆盖start(),则无结果。==〉Thread 本身的run 是不做什么的
    若调用start(),覆盖start()==〉你没有说怎样覆盖start(),不好说。一般来说,不要重载start()
    我看翻译版的计算机书太多,可能有的名词与科班出身的所知不同。见谅!
      

  4.   

    问题3解答有错,多了一个private
    class Sub extends base
    {
        private static void staticMethod()  ==>
             static void staticMethod()