继承与构造方法

在子类继承父类的情况,创建子类对象,是先生成 父类对象再生成子类对象;

1.如果父类没有有参构造方法,子类会调用父类的无参构造方法,当然是隐式的,不用写出来,再调用自己的构造方法;

2.如果父类有有参构造方法,系统就不会默认创造一个无参的构造方法了,这时,子类需要显示的调用父类的有参构造方法,super();

3.构造方法可以调用本类的其他构造方法,this参数,但是必须在构造方法的第一行;

4.构造方法在类成员变量之后初始化


详细的例子参见  https://blog.csdn.net/zw1996/article/details/52878270

constructor;构造函数。

    1

在创建对象的时候,对象成员可以由构造函数方法进行初始化。

    new对象时,都是用构造方法进行实例化的;
    例如;Test test = new Test("a");
     //Test("a");其中这个就是构造函数,“a”为构造方法的形参;

    1
    2
    3

    构造方法的方法名必须与类名一样。
    构造方法没有返回类型,也不能定义为void,在方法名前面不声明方法类型。
    构造方法不能作用是完成对象的初始化工作,他能够把定义对象时的参数传递给对象的域。
    构造方法不能由编程人员调用,而要系统调用。
    构造方法可以重载,以参数的个数,类型,或排序顺序区分。

    1
    2
    3
    4
    5

具体用法,代码实现。

1;单个构造函数方法;’
这里写图片描述
这里写图片描述
这里写图片描述

2;多个构造函数方法
(例子为;带参数与不带参数)
这里写图片描述

这里写图片描述

3;关于继承类的构造方法的调用;
先看事例;
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
我第一次看到结果的时候好惊讶的,怎么都调用了哈。看了知识点才知道。
在Subtine的主方法中只调用子类构造方法,实例化子类对象并且在子类构造方法中,没有调用父类的构造方法的任何语句。但是在实例化对象时,它相应的调用了父类构造方法,在结果中还可以看到调用构造方法的顺序,首先是顶级,再继续往下直达本身类。也就是说实例化子类的时候,要首先实例化父类对象,然后在实例化子类对象,所以在子类构造方法调用父类构造方法前,父类已经实例化了。
拓展一下。

    package text_4_1;
     
    public class Parent {
        Parent(int a){//就是将无参数构造方法改成有参数的。
            System.out.println("调用父类Parent构造方法" + a);
        }
    }
     
    package text_4_1;
     
    public class Subparent extends Parent{
        Subparent(){
            System.out.println("调用子类Subparent的构造方法");
        }
    }
     
    package text_4_1;
     
    public class Subtine extends Subparent{
        Subtine(){
            System.out.println("调用子类Subtine构造方法");
        }
    }
     
     
    package text_4_1;
     
    public class Main {
        public static void main(String[] args){
            Subtine subtine = new Subtine();
        }
    }

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33

这样的代码将会报错;//就是将父类Parent类无参数构造方法改成有参数的。

    Implicit super constructor Parent() is undefined. Must explicitly invoke another constructor
    //隐式的超级构造函数()是未定义的。必须显式地调用另一个构造函数

    1
    2

意思就是在子类调用构造函数时,必须先调用父类构造函数,因为无参数的构造函数,编译器会自动调用,也就是第一种情况不会报错。但是有参数的,就必须要利用Super的方法来调用。如果不进行调用那么将会报错。

    将Subparent类改成。
    package text_4_1;
     
    public class Subparent extends Parent{
        Subparent(){
            super(5);//调用了其父类就不会报错了。
            System.out.println("调用子类Subparent的构造方法");
        }
    }
    //备注一下,调用父类构造方法就是;super();//就ok了。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11

还补充一点,关于构造方法的可扩展性;
查看过源码的应该都发现过jdk的编码人员会在一个类中建立多个构造方法;然而他的作用就是提高可扩展性;
这里写图片描述
这么多构造方法,他们之间并且还有联系;通过this()来调用自己类的其他构造方法,来减少代码的复制,增大程序的可读性;
这里写图片描述
至于怎么来进行封装;举个例子;
这里写图片描述
这里写图片描述
构造方法的可扩展性就表示在这里;
可以多多个构造方法;根据不同的参数决定调用哪个;带来很大的可扩展性
刚试了一下notepad++;然而直接爆出中文乱码,搞了好久才搞清楚;
这里写图片描述

原因是;国标码和ANSI之间的不兼容;
这里写图片描述
---------------------
作者:每天撸码不超过20行
来源:CSDN
原文:https://blog.csdn.net/qq_39008429/article/details/80422219
版权声明:本文为博主原创文章,转载请附上博文链接!

posted @ 2019-07-21 13:21  天涯海角路  阅读(277)  评论(0)    收藏  举报