• 继承与多态


    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();
      }
    }

    修改之前的运行结果

    修改之后

    在Java语言中,调用子类的构造方法之前,会先行调用父类的无参构造函数,而子类的构造方法会通过super()方法语句调用父类当中的特别的构造函数,而且必须写在第一行,否则会报错

    思索:

    在Java中子类是通过父类继承,所以子类有父类的所有非私有的属性和方法,如果不调用父类的构造方法,那么不能初始化父类中定义的属性,就给父类的属性分配内存空间 ,如果父类的属性没有分配内存空间,那么子类访问父类的属性,就会报错。

    2.

    代码如下:

    public class Fugai 
    {
        public static void main(String[] args)
        {
            Son x=new Son();
            x.add();
        }
    }
    class Father//父类
    {
        public void add()
        {
            System.out.println("父亲");
        }
    }
    class Son extends Father//子类继承与父类
    {
        public void add()
        {
            super.add();
            System.out.println("儿子");
        }
    }

    结果截图

    在Java中,子类如果想要调用父类之中的函数可以引用super()

    下面总结覆盖方法的四点性质

    (1)覆盖方法所抛出的异常不能比原方法更多。(2)覆盖方法的访问范围不能超出元方法的范围(3)声明为final方法不允许覆盖。例如,Object的getClass()方法不能覆盖。(4)不能覆盖静态方法。

    3有关于类型转化的问答

     m=d;正确,子类的对象可与i直接赋值给基类变量

    d=m; 错误,基类对象要赋给子类对象变量,必须执行类型转换,引用语句的格式为(子类对象变量=(子类名)基类对象名;)

    d=(Dog)m;正确,进行了类型转化

     d=c; 错误,不同子类之间不能进行赋值操作

    c=(Cat)m 错误,m已经转化成dog类型,不能再进行赋值给cat的操作

    4.

    程序运行之后的结果

    Parent.printValue(),myValue=100//父类打印数字
    Child.printValue(),myValue=200//子类打印数字
    Child.printValue(),myValue=200//父类对象访问子类成员,调用相同的函数名的函数属于子类的;父类的变量进行相关的原算,但是,如果这时父类变量指向子类对象,继续调用得方法和变量仍然是子类覆盖后的新的变量和方法的
    Child.printValue(),myValue=200//任然调用的被覆盖后的子类数字
    Child.printValue(),myValue=201//将父类强制转化为子类进行输出,调用的是子类的成员函数以及方法

    将代码修改之后,会出现不同的结果

    黑色进行标注的地方时进行修改之后的代码,在进行输出之后程序结果不同

  • 相关阅读:
    杭电 1521 排列组合

    杭电 1799 循环多少次?
    杭电1028 Ignatius and the Princess III(整数拆分)
    毕业论文A.1 Matlab环境配置
    Open Graphics Library初步_搭建环境_GLUT
    Open Graphics Library初步_摄影机_GLUT
    C#使用office相关com组件
    插入排序
    二叉树的四种遍历方法(递归、迭代)
  • 原文地址:https://www.cnblogs.com/xuzhaoyang/p/7812837.html
Copyright © 2020-2023  润新知