zoukankan      html  css  js  c++  java
  • java 继承条件下的构造方法调用

    • 运行 TestInherits.java 示例,观察输出,注意总结父类与子类之间构造方法的调用关系修改Parent构造方法的代码,显式调用GrandParent的另一个构造函数,注意这句调用代码是否是第一句,影响重大!

     

    1.没有super的调用

     1 class Grandparent 
     2 {
     3 
     4 
     5     public Grandparent()
     6      {
     7 
     8             System.out.println("GrandParent Created.");
     9     
    10 }
    11 
    12 
    13     public Grandparent(String string) 
    14     {
    15 
    16             System.out.println("GrandParent Created.String:" + string);
    17     
    18  }
    19 
    20 }
    21 
    22 
    23 
    24 class Parent extends Grandparent
    25 {
    26 
    27 
    28     public Parent()
    29      {
    30 
    31             //super("Hello.Grandparent.");
    32 
    33             System.out.println("Parent Created");
    34     
    35        // super("Hello.Grandparent.");
    36 
    37       }
    38 
    39 }
    40 
    41 
    42 
    43 class Child extends Parent 
    44 {
    45 
    46 
    47     public Child()
    48      {
    49     
    50         System.out.println("Child Created");
    51 
    52       }
    53 
    54 }
    55 
    56 
    57 
    58 public class TestInherits 
    59 {
    60 
    61 
    62     public static void main(String args[])
    63      {
    64 
    65             Child c = new Child();
    66     
    67   }
    68 
    69 }

    运行结果:

    GrandParent Created.
    Parent Created
    Child Created

    2.有super的构造调用,且在第一行。

     1 class Grandparent 
     2 {
     3 
     4 
     5     public Grandparent()
     6      {
     7 
     8             System.out.println("GrandParent Created.");
     9     
    10 }
    11 
    12 
    13     public Grandparent(String string) 
    14     {
    15 
    16             System.out.println("GrandParent Created.String:" + string);
    17     
    18  }
    19 
    20 }
    21 
    22 
    23 
    24 class Parent extends Grandparent
    25 {
    26 
    27 
    28     public Parent()
    29      {
    30 
    31             super("Hello.Grandparent.");
    32 
    33             System.out.println("Parent Created");
    34     
    35         //super("Hello.Grandparent.");
    36 
    37       }
    38 
    39 }
    40 
    41 
    42 
    43 class Child extends Parent 
    44 {
    45 
    46 
    47     public Child()
    48      {
    49     
    50         System.out.println("Child Created");
    51 
    52       }
    53 
    54 }
    55 
    56 
    57 
    58 public class TestInherits 
    59 {
    60 
    61 
    62     public static void main(String args[])
    63      {
    64 
    65             Child c = new Child();
    66     
    67   }
    68 
    69 }

    运行结果:

    GrandParent Created.String:Hello.Grandparent.
    Parent Created
    Child Created

    3.super方法在输出语句的后面

     1 class Grandparent 
     2 {
     3 
     4 
     5     public Grandparent()
     6      {
     7 
     8             System.out.println("GrandParent Created.");
     9     
    10 }
    11 
    12 
    13     public Grandparent(String string) 
    14     {
    15 
    16             System.out.println("GrandParent Created.String:" + string);
    17     
    18  }
    19 
    20 }
    21 
    22 
    23 
    24 class Parent extends Grandparent
    25 {
    26 
    27 
    28     public Parent()
    29      {
    30 
    31             //super("Hello.Grandparent.");
    32 
    33             System.out.println("Parent Created");
    34     
    35         super("Hello.Grandparent.");
    36 
    37       }
    38 
    39 }
    40 
    41 
    42 
    43 class Child extends Parent 
    44 {
    45 
    46 
    47     public Child()
    48      {
    49     
    50         System.out.println("Child Created");
    51 
    52       }
    53 
    54 }
    55 
    56 
    57 
    58 public class TestInherits 
    59 {
    60 
    61 
    62     public static void main(String args[])
    63      {
    64 
    65             Child c = new Child();
    66     
    67   }
    68 
    69 }

          程序报错!

    结论:

    通过super调用基类的构造方法,必须是子类的构造方法中的第一个语句.(顺序不能打乱)

    1.以final 开头的class类不允许继承

    2.以final声明的方法不允许覆盖

    3.以final声明的变量不允许更改

    4.利用final,可以设计出一种特殊的“只读”的“不可变类” 

  • 相关阅读:
    201771030123-王爽 实验一 软件工程准备—阅读《现代软件工程—构建之法》并提问
    《面向对象程序设计课程学习进度条》
    201771010132-徐思 实验四 软件项目案例分析
    201771010132-徐思 实验三 结对项目-《西北师范大学疫情防控信息系统》
    201771010132-徐思 实验一 软件工程准备-浏览《构建之法》
    徐思201771010132 《面向对象程序设计(java)》课程学习总结
    徐思 201771010132
    徐思201771010132《面向对象程序设计(java)》第十六周学习总结
    徐思201771010132《面向对象程序设计(java)》第十五周学习总结
    徐思201771010132《面向对象程序设计(java)》第十四周学习总结
  • 原文地址:https://www.cnblogs.com/cxy0210/p/11728319.html
Copyright © 2011-2022 走看看