• Java--Inheritance constructor继承中的构造方法问题(一)


    Java规定,一个父类可以同时拥有多个子类,但一个子类只能有一个父类,即单重继承,允许多层继承,即子类还可以有自己的子类,在下一层继承关系中原先的子类就变成了父类,这样的继承关系就形成了继承树。

    子类继承父类中所有可能被子类访问的成员变量,原则如下:

    1.能够继承那些声明为public和protected的成员变量;
    2.能够继承同一包中的那些默认修饰符的成员变量;
    3.不能继承那些声明为private的成员变量;
    4.如果子类声明一个与父类成员变量同名的成员变量,则不能继承父类的成员变量,此时子类的成员变量称作隐藏了父类的成员变量。

    对于成员方法的继承,都类似于上面的4条说法,把成员变量改成成员方法即可,此时子类的方法称为覆盖了父类中的那个方法。
    5.不能继承父类的构造方法。

    虽然子类不能继承父类的构造方法,但是子类对象会调用父类的构造方法的。

    调用构造方法的原则如下:

    1. 如果子类没有定义构造方法,则调用父类的无参数的构造方法,.
    2. 如果子类定义了构造方法,不论是无参数还是带参数,在创建子类的对象的时候,首先执行父类无参数的构造方法,然后执行自己的构造方法。这句话有点不通,也不懂啥意思,试试就懂了。
    3. 如果子类调用父类带参数的构造方法,可以通过super(参数)调用所需要的父类的构造方法,切该语句做为子类构造方法中的第一条语句。
    4. 如果某个构造方法调用类中的其他的构造方法,则可以用this(参数),切该语句放在构造方法的第一条.

    当一个类继承了某个类时,在子类的构造方法里,super()必须先被调用;如果你没有写,编译器会自动调用super()方法,即调用了父类的构造方法;

    这并不是创建了两个对象,其实只有一个子类Sub对象;之所以需要调用父类的构造方法是因为在父类中,可能存在私有属性需要在其构造方法内初始化。

     1 class Super {
     2     String s;
     3     public Super() {
     4         System.out.println("Super");
     5     }
     6 }
     7 
     8 class Sub extends Super {
     9     public Sub() {
    10         System.out.println("Sub");
    11     }
    12 
    13 }
    14 
    15 public class Main {
    16     public static void main(String[] args) {
    17         Sub s = new Sub();
    18     }
    19 }

    结果:

    Super
    Sub
    
     1 class Usebefore {
     2 
     3     String str1;
     4     public Usebefore() {
     5         // TODO Auto-generated constructor stub
     6         System.out.println(".....default super constructor...1...........");
     7     }
     8     public Usebefore(String get1)
     9     {
    10         str1=get1;
    11         System.out.println(str1);
    12     }
    13     public void play()
    14     {
    15         System.out.println("............1............");
    16     }
    17     
    18 
    19 }
    20 public class Use extends Usebefore{
    21     public Use() {
    22         // TODO Auto-generated constructor stub
    23         System.out.println(".....default super constructor...2...........");
    24     }
    25     public Use(String get2){
    26         super(" diaoyong super constructor youcan constructor");
    27         str1=get2;
    28         System.out.println(str1);
    29     }
    30     public void play()
    31     {
    32         System.out.println("............2............");
    33     }
    34     public static void main(String args[]){
    35         Use use=new Use();
    36         use.play();
    37         use=new Use("get2");
    38     }
    39 }

     结果:

    .....default super constructor...1...........调用父类无参构造函数
    .....default super constructor...2...........调用子类。。
    ............2............。。。。。。。。。。。。覆盖父类方法
     diaoyong super constructor youcan constructor。。。。。。调用父类构造方法
    get2
    

      

  • 相关阅读:
    腾讯实习前端工程师面经-一面-腾讯看点
    Redux的createStore实现
    GNU ARM 汇编基础
    python爬虫学习04-爬取贴吧
    python学习03-使用动态ua
    Python爬虫学习02--pyinstaller
    python爬虫学习01--电子书爬取
    简单的SQL语句学习
    微信小程序的五个生命周期函数
    python学习(12)使用正则表达式
  • 原文地址:https://www.cnblogs.com/carazk/p/6133516.html
Copyright © 2020-2023  润新知