zoukankan      html  css  js  c++  java
  • 06-继承与多态

    动手动脑

    1. 为什么子类的构造方法在运行之前,必须调用父类的构造方法?能不能反过来?为什么不能反过来?

    构造方法在创建对象时被调用,用来初始化新对象,即为对象成员变量赋初值。

    子类要继承父类的成员变量和成员方法,如果不调用父类的构造方法,那么父类的成员变量和成员方法无法在子类创建对象时正确初始化。

    反过来调用不可以,因为父类不知道子类有什么变量,这样子类也得不到初始化的父类变量。

    2.请自行编写代码测试以下特性:

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

     1 package 动手动脑;
     2 //信1605-2 王金萱 20163588
     3 class Father//父类
     4 {
     5     public void Introduce()
     6     {
     7 
     8            System.out.println("I'm father");
     9     }
    10 }
    11 class Son extends Father//子类
    12 {
    13      public void Introduce()//覆写父类中的方法
    14      {
    15          super.Introduce();//调用父类中被覆盖的方法
    16          System.out.println("I'm son");
    17      }
    18 }
    19 
    20 public class fugai {
    21     public static void main(String[] args) {
    22         // TODO Auto-generated method stub
    23         Father p=new Father();//创建父类对象
    24         p.Introduce();
    25         p=new Son();
    26         p.Introduce();
    27     }
    28 
    29 }

    运行结果:

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

                  m=d;

                  d=m;

                  d=(Dog)m;

                  d=c;

                  c=(Cat)m;

    先进行自我判断,得出结论后,运行TestCast.java实例代码,看看你的判断是否正确。

    判断:

    第二句会出错,基类对象要赋给子类对象变量,必须执行类型转换。

    第四句会出错,c和d属于不同子类,不同子类对象之间不可以相互赋值。

    运行证明:

    第二句第四句无法通过编译。

    第五句可以通过编译,但是运行时会出错。

    因为第一句“m=d;”将Dog类型对象d赋值给父类Mammal类对象m,此时m变为Dog类。

    4.请看以下“变态”的类(参看示例ParentChildTest.java

    上述代码的特点是:子类和父类定义了一模一样的字段和方法

    • 运行以下测试代码

     

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

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

    第一行100:Parent类对象parent调用printValue方法输出Parent类中myValue值为100。

    第二行200:Child类对象child调用printValue方法输出Child类中myValue值为200。

    子类对象赋值给父类对象时,如果子类重写了父类的方法,则属性是父类的,方法是子类的。

    第三行200:将子类对象赋给父类对象,此时parent只能调用子类的printValue方法,输出子类myValue值200。

    第四行200:parent.myValue++;将父类的myValue值加1,变为101;但是依然只能调用子类的printValue方法输出子类的yValue值为200。

    第五行201:因为之前子类对象child已经赋值给父类对象parent,所以此处父类对象parent可以转换类型后转换为子类对象,此时执行myValue++是将子类的myValue值加1,变为201;然后依旧调用子类的printValue方法输出子类的myValue值201。

    注意:如果在未进行子类对象对父类对象赋值时,即使使用类型转换,也无法将父类对象赋值给子类;换句话说,如果想使用类型转换将父类对象赋值给子类对象,必须先把子类对象赋值给父类对象。

    • 可以使用instanceof运算符判断一个对象是否可以转换为指定的类型:

      Object obj="Hello";

      if(obj instanceof String)

           System.out.println("obj对象可以被转换为字符串");

     

    3.   计算机是不会出错的,之所以得到这样的运行结果也是有原因的,那么从这些运行结果中,你能总结出Java的哪些语法特性?

    总结(1):子类父类拥有同名的方法时:

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

    总结(2):子类父类拥有同名的方法时:

    • 如果子类与父类有相同的字段,则子类中的字段会代替或隐藏父类的字段,子类方法中访问的是子类中的字段(而不是父类中的字段)。如果子类方法确实想访问父类中被隐藏的同名字段,可以用super关键字来访问它。
    • 如果子类被当作父类使用,则通过子类访问的字段是父类的!
  • 相关阅读:
    java加密算法-MD5
    java加密算法-DES
    java加密算法-AES
    java写入内容到本地文件 -读取文件内容
    java 图片base64互转
    java上传文件
    判断请求是否是同一个域名
    java计算两个经纬度之间的距离
    java请求url可以带参数
    Java编程基础篇第五章
  • 原文地址:https://www.cnblogs.com/wang-jx/p/7808927.html
Copyright © 2011-2022 走看看