继承与多态

1.

 

代码:

public class Test

{

    public static void main(String args[])

    {

         C a=new C();

         a.display();

    }

}

class A

{

public void display()

{

System.out.println("hello");

}

}

class C extends A

{

 

public void display()

{

System.out.println("word");

super.display();

}

}

 

  

2.

.

判断:

第二个运行错。

第四个编译错误。

结果:

第二、四个编译错误。

第五个运行错误。

原因:

        m=d;     //编译正确,因为子类对象可以直接赋给基类变量。

      d=m;     //编译错误,基类对象要赋给子类对象变量,必须执行类型转换(子类对象变量=(子类名)基类对象名;)

      d=(Dog)m;   //编译正确,基类对象要赋给子类对象变量,必须执行类型转换

      d=c;      //编译错误,不同子类之间不能复制

      c=(Cat)m;   //运行错误,m已经转换成Dog, Dog和Cat子类之间不能转换

 

3.

 

1.运行结果:

 

2.原因:

父类对象可以访问子类的成员,当然只限于”覆盖”发生时,调用的时候,对象是子类的,就调用子类的方法,对象是父类的,就调用父类的方法。当然还有如下特性:

1.当子类与父类拥有一样的方法,并且让一个父类变量引用一个子类对象时,到底调用哪个方法,由对象自己的“真实”类型所决定,这就是说:对象是子类型的,它就调用子类型的方法,是父类型的,它就调用父类型的方法。这个特性实际上就是面向对象“多态”特性的具体表现。

2.如果子类与父类有相同的字段,则子类中的字段会代替或隐藏父类的字段,子类方法中访问的是子类中的字段(而不是父类中的字段)。如果子类方法确实想访问父类中被隐藏的同名字段,可以用super关键字来访问它。

3.如果子类被当作父类使用,则通过子类访问的字段是父类的.

3.修改代码并测试:

 

则结果为:

 

说明新加的后边的输出结果是调用的子类的方法。

原文地址:https://www.cnblogs.com/ssyh/p/7811730.html