动手动脑 总结

1.继承条件下的构造方法调用

class Grandparent 
{
     public Grandparent()
     {
          System.out.println("GrandParent Created.");
     }
    public Grandparent(String string) 
    {

            System.out.println("GrandParent Created.String:" + string);
    }

}
class Parent extends Grandparent
{


    public Parent()
     {

            //super("Hello.Grandparent.");

            System.out.println("Parent Created");
    
       // super("Hello.Grandparent.");

      }

}
class Child extends Parent 
{


    public Child()
     {
    
        System.out.println("Child Created");

      }
}
public class TestInherits {
    public static void main(String args[])
     {

           Child c = new Child();
     }      
}

  结论:通过super调用基类构造方法,必须是子类构造方法中的第一个语句。子类的构造方法在运行之前,必须调用父类的构造方法。因为子类必须继承父类的变量和方法。如果不先给父类中的变量赋值,则子类中从父类继承的变量没有赋值。所以不能反过来先给子类赋值。

2.在子类中,若要调用父类中被覆盖的方法,可以使用super关键字。

class fu
{
    public void A()
     {
            System.out.println("Parent ");
          }
}
class zi extends fu
{
    public void A()
     {
        super.A();
        System.out.println("Child ");
      }
}
public class Test {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
                    zi c = new zi();
                    c.A();
    }
}

  

结论:

 Java“方法覆盖”的语法规则

(1)覆盖方法的允许访问范围不能小于原方法。

(2)覆盖方法所抛出的异常不能比原方法更多。

(3)声明为final方法不允许覆盖。 例如,Object的getClass()方法不能覆盖。

(4)不能覆盖静态方法。

3.下列语句哪一个将引起编译错误?为什么?哪一个会引起运行时错误?为什么?

 原因:父类不可直接给子类赋值,子类可以直接给父类赋值,同为子类不能相互赋值,父类可强制类型转换给子类赋值

4.运行测试代码

(1)左边的程序运行结果是什么?

(2)你如何解释会得到这样的输出?

(3)计算机是不会出错的,之所以得 到这样的运行结果也是有原因的,

那么从这些运行结果中,你能总 结出Java的哪些语法特性?

当子类与父类拥有一样的方法,并且让一个父类变量引用一个子类对象时,到底调用哪个方法,由对象自己的“真实”类型所决定,

这就是说:对象是子类型的,它就调用子类型的方法,是父类型的,它就调用父类型的方法。 这个特性实际上就是面向对象“多态”特性的具体表现。

如果子类与父类有相同的字段,则子类中的字段会代替或隐藏父类的字段,子类方法中访问的是子类中的字段(而不是父类中的字段)。

如果子类方法确实想访问父类中被隐藏的同名字段,可以用super关键字来访问它。 如果子类被当作父类使用,则通过子类访问的字段是父类的!

原文地址:https://www.cnblogs.com/yongyuandishen/p/13890856.html