• 继承与多态课后作业


    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子类之间不能转换。

     结果截图:

  • 相关阅读:
    CreateProcess逆向分析3环用户层逆向分析(一)
    CVE20112005(MS11080)漏洞分析
    vmware安装Windows 11虚拟机
    SAP SD 常用配置事物代码
    Java学习笔记02面向对象
    Java学习笔记01基本语法
    Java学习笔记03枚举和注解
    openssl3.0 加密算法库编程精要 06 详解 EVP API 公开密钥密码算法 非对称加密、签名
    零基础实现微信小程序云开发的无人机管理系统项目实例系列教程简述(一)
    chrome安装vuedevtools遇到的常见问题及解决方法
  • 原文地址:https://www.cnblogs.com/liurx/p/7811072.html
Copyright © 2020-2023  润新知