zoukankan      html  css  js  c++  java
  • 继承与多态课后作业

    1.

     1 class Grandparent {
     2 
     3     public Grandparent() {
     4 
     5         System.out.println("GrandParent Created.");
     6 
     7     }
     8 
     9     public Grandparent(String string)
    10      {
    11 
    12         System.out.println("GrandParent Created.String:" + string);
    13 
    14     }
    15 
    16 }
    17 
    18 class Parent extends Grandparent 
    19 {
    20     public Parent() {
    21         //super("Hello.Grandparent.");
    22 
    23         System.out.println("Parent Created");
    24 
    25        // super("Hello.Grandparent.");
    26 
    27     }
    28 }
    29 
    30 class Child extends Parent 
    31 {
    32     public Child() 
    33     {
    34         System.out.println("Child Created");
    35     }
    36 }
    37 public class TestInherits 
    38 {
    39 
    40     public static void main(String args[])
    41     {
    42 
    43         Child c = new Child();
    44     }
    45 
    46 }    

    结果截图:

    修改之前:                                                                                                                                     修改之后:

       

    在java语言的继承中,在执行子类的构造方法之前,会先调用父类没有参数的构造方法,其目的是为了要帮助继承自父类的成员做初始化操作。子类的构造方法通过super()来调用父类特定的构造方法(如果没有super语句还是会自动调用父类没有参数的构造方法),调用父类特定的构造方法的super语句必须写在子类构造方法的第一行,否则编译时出错,如果父类只定义了有参数的构造方法,而在子类中又没有用super关键字来调用父类的特定构造方法,则编译时出错。

    2.

    源代码:

     1 package jicheng;
     2 
     3 class Parent 
     4 {
     5     public void show()
     6     {
     7         System.out.println("Parent .");
     8     }
     9 }
    10 
    11 class Child extends Parent
    12 {
    13     public void show()
    14     {
    15         super.show();
    16         System.out.println("Child ");
    17     }
    18 }
    19 public class Test 
    20 {
    21 
    22     public static void main(String[] args) 
    23     {
    24        Child c=new Child();
    25        c.show(); 
    26     }
    27 }

    运行结果截图:

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

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

    (3)声明为final方法不允许覆盖。

    例如,Object的getClass()方法不能覆盖。

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

     3.

     

    程序运行结果(猜想):

    Parent.printValue(),myValue=100

    Child.printValue(),myValue=200

    Child.printValue(),myValue=200

    Child.printValue(),myValue=200

    Child.printValue(),myValue=101

    结果截图:

    原因:在调用的时候,对象是子类的,就调用子类的方法,对象是父类的,就调用父类的方法。父类对象访问子类成员,调用相同的函数名的函数属于子类的;父类的变量进行相关的原算,但是,如果这时父类变量指向子类对象,继续调用得方法和变量仍然是子类覆盖后的新的变量和方法的。

    但是如果代码顺序改变:

    变为:

    则结果为:

    总结:

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

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

     4.

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

    第四行错误:编译错误,对象之间不可赋值。

    第五行错误:运行时错误, m已经转换成Dog, Dog和Cat子类之间不能转换。

     结果截图:

  • 相关阅读:
    【转载】ARM与单片机的区别
    关于头文件定义的一点思考
    关于*** WARNING L15: MULTIPLE CALL TO SEGMENT
    【转】单片机中volatile定义的作用详解
    关于单片机位数的思考(8位、16位、32位)
    memcpy函数
    ubuntu下打开windows里的txt文件乱码解决
    linux source filename
    linux环境设置export
    pdf转word工具
  • 原文地址:https://www.cnblogs.com/liurx/p/7811072.html
Copyright © 2011-2022 走看看