zoukankan      html  css  js  c++  java
  • java继承使用的细节问题?

    关于java继承的基本概念就不多说了,下面就说说继承使用应该注意的细节问题?

    示例 一:

     1 package com.bizvane;
     2 
     3 class Fu{
     4     
     5     public Fu() {
     6         System.out.println("Fu constructor ....");
     7     }
     8 }
     9 
    10 class Zi extends Fu{
    11     
    12     public Zi() {
    13         System.out.println("Zi constructor ....");
    14     }
    15 }
    16 
    17 
    18 public class ExtendsDemo {
    19 
    20     public static void main(String[] args) {
    21         new Zi();
    22     }
    23 }

    执行结果:

    Fu constructor ....
    Zi constructor ....

    看到这个结果,想必很多人会问,new Zi 类对象,并没有调用Fu 类呀,为什么会出现这个结果?

    答案是: 在Zi类无参构造函数第一行会有一个隐式的 super() 语句, 这样就会初始化Fu类。

    示例二:

     1 package com.bizvane;
     2 
     3 class Fu{
     4     
     5     public Fu(int x) {
     6         System.out.println("Fu constructor ...."+x);
     7     }
     8 }
     9 
    10 class Zi extends Fu{
    11     
    12     public Zi(int x) {
    13         System.out.println("Zi constructor ...."+x);
    14     }
    15 }
    16 
    17 
    18 public class ExtendsDemo {
    19 
    20     public static void main(String[] args) {
    21         new Zi(6);
    22     }
    23 
    24 }

    执行结果:

    在 第 13行编译报错,参数类型不匹配

    大家肯定会想为什么呢?

    答案是: 首先我们知道每个类中会有一个默认的无参构造函数,现在 Fu 和Zi 类都已经有了有参构造函数,那么默认的无参构造函数就不存在了,结合上面的例子,在Zi 类的有参构造函数第一行会有一个隐式的

    super() 语句  当 new Zi(6); 的时候会初始化 Zi 类,super() 调用 Fu 类, 而此时 Fu 类 中已经没有无参构造函数,所以编译就通不过

    正确解决办法: 在 Fu 类 加上一个 无参构造函数,或者在 Zi 类的有参构造函数前面加上一个显式 的 super(x)

    示例三 :

     1 class Fu{
     2     
     3     Fu(){
     4         System.out.println("Fu constructor ....A..");
     5     }
     6     Fu(int x){
     7         System.out.println("Fu constructor ....B.."+x);
     8     }
     9 }
    10 
    11 
    12 class Zi{
    13     
    14     Zi(){
    15         System.out.println("Zi constructor ....C..");
    16     }
    17     Zi(int x){
    18         System.out.println("Zi constructor ....D.."+x);
    19     }
    20 }
    21 
    22 class ExtendsDemo{
    23     
    24     public static void main(String[] args){
    25         new Zi();
    26         new Zi(6);
    27     }
    28 }

    执行结果:

    Fu constructor ....A..
    Zi constructor ....C..
    Fu constructor ....A..
    Zi constructor ....D..6

    你心里的答案是否这样的呢? 大家想想为什么吧?


    思考: this()的用法?


    1. 如果子类的构造函数第一行写了this调用了本类其他构造函数,那么super调用父类的语句还有吗?
    没有的,因为this() 或者 super(), 只能定义在构造函数的第一行,因为初始化动作要先执行。

    2. 父类构造函数中是否有隐式的super()语句呢?
    也是有的,记住:只要是构造函数默认第一行都是有super()语句,
    那么父类的父类是谁呢? super调用到底是谁的构造函数呢?
    java体系在设计,定义了一个所有对象的父类 Object

    总结:
    类中的构造函数默认第一行都有隐式的super()语句,访问父类中的构造函数,
    所以父类的构造函数既可以给自己的对象初始化,也可以给自己的子类对象初始化。

    如果默认的隐式super的语句没有对应的构造函数,必须在构造函数中通过this 或者 super 的形式明确调用的构造函数。

  • 相关阅读:
    poj 2112
    写给学大计python的同学的查错方法
    [Win32 API学习] Edit,ListBox的用法,字体的设置
    [Win32 API] FindFirstFile()和FindNextFile()
    初探C++ win32 api——Hello world!
    [学习笔记]舞蹈链(DLX)(C++指针版)
    2020科大回归记
    SCOI2019AFO记
    [学习笔记]动态动态规划/动态DP/DDP
    BZOJ5343[CTSC2018]混合果汁(二分答案+主席树)
  • 原文地址:https://www.cnblogs.com/lu-manman/p/8245599.html
Copyright © 2011-2022 走看看