继承与构造方法 男娘i 2022-05-24 08:04 240阅读 0赞 在子类继承父类的情况,创建子类对象,是先生成 父类对象再生成子类对象; 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;单个构造函数方法;’ ![这里写图片描述][20161020231128664] ![这里写图片描述][20161020231139414] ![这里写图片描述][20161020231149124] 2;多个构造函数方法 (例子为;带参数与不带参数) ![这里写图片描述][20161020231603990] ![20161020231612943][] ![这里写图片描述][20161020231624365] 3;关于继承类的构造方法的调用; 先看事例; ![这里写图片描述][20161023224430584] ![这里写图片描述][20161023224455376] ![这里写图片描述][20161023224504642] ![这里写图片描述][20161023224517189] ![这里写图片描述][20161023224557799] 我第一次看到结果的时候好惊讶的,怎么都调用了哈。看了知识点才知道。 在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的编码人员会在一个类中建立多个构造方法;然而他的作用就是提高可扩展性; ![这里写图片描述][20161114214722178] 这么多构造方法,他们之间并且还有联系;通过this()来调用自己类的其他构造方法,来减少代码的复制,增大程序的可读性; ![这里写图片描述][20161114214916866] 至于怎么来进行封装;举个例子; ![这里写图片描述][20161115203407762] ![这里写图片描述][20161115202701318] 构造方法的可扩展性就表示在这里; 可以多多个构造方法;根据不同的参数决定调用哪个;带来很大的可扩展性 刚试了一下notepad++;然而直接爆出中文乱码,搞了好久才搞清楚; ![这里写图片描述][20161115202645786] 原因是;国标码和ANSI之间的不兼容; ![这里写图片描述][20161115203038040] [20161020231128664]: /images/20220524/94103611c7214c3eba33a3aa06a4ecd9.png [20161020231139414]: /images/20220524/69596c37d8c844b9b50784cf29f2643c.png [20161020231149124]: /images/20220524/3334e1fe46824aabaa649770c7ce6ab7.png [20161020231603990]: /images/20220524/dbc2376d007443e897e6ccfe20e0943e.png [20161020231612943]: /images/20220524/ce77a708a1424f828f963100b6d1e9b8.png [20161020231624365]: /images/20220524/00664de0c1854dc4b7796e0d0caa48b0.png [20161023224430584]: /images/20220524/8b5cdd4569614c15b200eed969286a1c.png [20161023224455376]: /images/20220524/bddbfae4fb864d14a89a00dc31c65051.png [20161023224504642]: /images/20220524/d21af7f4d0bf451794b272cec4b98def.png [20161023224517189]: /images/20220524/cefcf12521ef488ca28fb2255dcbf3e2.png [20161023224557799]: /images/20220524/f350b20b98cf43fa9af27f1705b99a1a.png [20161114214722178]: /images/20220524/b39f2809f4de48c7aaeab9497cae950b.png [20161114214916866]: /images/20220524/ba1b56a8778746d9a554323103041ae2.png [20161115203407762]: /images/20220524/1c61e4c4bf674a9d88e02bc04dc74a0c.png [20161115202701318]: /images/20220524/35beef72047949f9909fc66a857feaf5.png [20161115202645786]: /images/20220524/259c62deb30445d58dde0b99a73c5152.png [20161115203038040]: /images/20220524/92b90d509435405d8af75163776f5e17.png
还没有评论,来说两句吧...