-
2022-03-19 11:41:10
现在man的类继承了动物类,当我们创建了一个man类对象时,子类的构造器和父类的构造器时如何执行的?顺序又是什么样子的?
大家想一下执行的顺序是什么样子的?其实很容易想出来,先有父亲后有孩子嘛,对吧。
废话不多说,上代码,我们看一下
我们看到,当我们使用默认的无参构造,在调用子类的构造器时,会隐式的去调用父类的无参构造。
/** * Copyright (C), 2015-2022, ttfx * FileName: ShaYU * Author: lixh * Date: 2022/2/6 22:48 * Description: * History: * <author> <time> <version> <desc> * 作者姓名 修改时间 版本号 描述 */ package instanceofdemo.base; /** * 〈今日头条账号:鲨鱼微课,配套视频教程-每天分享java课程,从初级到高级,感兴趣的小伙伴可以关注一下〉 * @author 今日头条:鲨鱼微课 */ public class ShaYuWeiKe1 { public static void main(String[] args) { System.out.println("今日头条账号:鲨鱼微课,配套视频教程-每天分享java课程,从初级到高级,感兴趣的小伙伴可以关注一下"); } }
更多相关内容 -
java 父类构造器
2021-03-05 19:51:39当创建任何java对象时,程序总会首先调用系统的父类非静态初始化块(隐式执行)和父类构造器(从object开始(java程序中所有类的最终父类都是java.lang.Object类,使用语句super(),也可以隐式),其次再调用子类的非静态...当创建任何java对象时,程序总会首先调用系统的父类非静态初始化块(隐式执行)和父类构造器(从object开始(java程序中所有类的最终父类都是java.lang.Object类,使用语句super(),也可以隐式),其次再调用子类的非静态初始化块和子类构造器,执行初始化,最后返回本类的实例。
例子:
class Creature
{
{
System.out.println("Creature 的非静态初始化块");
}
public Creature()
{
System.out.println("Creature 无参数的构造器");
}
public Creature(String name)
{
this();
System.out.println("Creature 带有参数name的构造器,name参数:"+name);
}
}
class Animal extends Creature
{
{
System.out.println("Animal 的非静态初始化块");
}
public Animal(String name)
{
super(name);
System.out.println("Animal 带1个参数的构造器,name参数:"+name);
}
public Animal(double weight)
{
this(name);
System.out.println("Animal 带2个参数的构造器,其age:"+age);
}
}
class Wolf extends Animal
{
{
System.out.println("Wolf 的非静态初始化块");
}
public Wolf(String name)
{
super(“灰太狼”,3);
System.out.println("Wolf无参数的构造器");
}
public Animal(String name,int age)
{
this();
System.out.println("Wolf的带weight参数的构造器,weight参数:+weight);
}
}
public class InitTest
{
public static void main(String [] args)
{
new wolf(5.6);
}
}
运行程序,输出:
Creature 的非静态初始化块
Creature 无参数的构造器
Creature 带有参数name的构造器,name参数:灰太狼
Animal 的非静态初始化块
Animal 带1个参数的构造器,name参数:灰太狼
Animal 带2个参数的构造器,其age:3
Wolf 的非静态初始化块
Wolf无参数的构造器
Wolf的带weight参数的构造器,weight参数:5.6
笔记:
1.子类构造器执行体的第一行代码使用super显示调用父类构造器,系统将根据super调用里传入的是实参列表来确定调用父类的哪个构造器;
2.子类构造器执行体的第一行代码使用this显示调用本类中重载的构造器,系统将根据this调用里传入的是实参列表来确定调用本类的另一个构造器(执行本类中另一个构造器时即进入第一种情况;
3.子类构造器中没有super()或this()调用时,系统将在调用子类构造器之前,调用父类无参数的构造器;
4.super用于调用父类的构造器;this用于调用本类中另一个重载的构造器;super和this都只能在构造器中使用;都只能作为构造器的第一行代码;
-
Java父类构造器的讲解
2021-03-05 19:52:13对于Java中构造器执行的顺序而言,程序执行的顺序为,先执行父类的非静态代码块,然后执行父类的相应的构造器,最后执行子类的非静态代码块,子类的构造器。此处需要说明一点:Java中的静态代码是在字节码文件在...众所周知,对于Java中的所有类而言,它们有一个根父类,即java.lang.Object类。
对于Java中构造器执行的顺序而言,程序执行的顺序为,先执行父类的非静态代码块,然后执行父类的相应的构造器,最后执行子类的非静态代码块,
子类的构造器。
此处需要说明一点:Java中的静态代码是在字节码文件在最开始加载的时候就完成的哦。
为了更好的理解,请看下面的例子:
class Creature
{
{
System.out.println("Creature的非静态初始化块");
}
// 下面定义两个构造器
public Creature()
{
System.out.println("Creature无参数的构造器");
}
public Creature(String name)
{
// 使用this调用另一个重载的、无参数的构造器
this();
System.out.println("Creature带有nmae参数的构造器,name参数:"
+ name);
}
}
class Animal extends Creature
{
{
System.out.println("Animal的非静态初始化块");
}
public Animal(String name)
{
super(name);
System.out.println("Animal带一个参数的构造器,name参数:" + name);
}
public Animal(String name , int age)
{
// 使用this调用另一个重载的构造器
this(name);
System.out.println("Animal带2个参数的构造器,其age:" + age);
}
}
class Wolf extends Animal
{
{
System.out.println("Wolf的非静态初始化块");
}
public Wolf()
{
// 显式调用父类的带2个参数的构造器
super("灰太狼", 3);
System.out.println("Wolf无参数的构造器");
}
public Wolf(double weight)
{
// 使用this调用另一个重载的构造器
this();
System.out.println("Wolf的带weight参数的构造器,weight参数:"
+ weight);
}
}
public class InitTest
{
public static void main(String[] args)
{
new Wolf(5.6);
}
}
运行结果为:
Creature的非静态初始化块
Creature无参数的构造器
Creature带有nmae参数的构造器,name参数:灰太狼
Animal的非静态初始化块
Animal带一个参数的构造器,name参数:灰太狼
Animal带2个参数的构造器,其age:3
Wolf的非静态初始化块
Wolf无参数的构造器
Wolf的带weight参数的构造器,weight参数:5.6
-
java:继承中子类和父类构造器的相关内容
2022-06-01 12:29:57java继承中子类和父类构造器的相关内容 运行后我们会发现,先调用了父类的无参构造器完成父类初始化,后才调用了子类的构造器 // 当子类对象创建时,不管使用子类的哪个构造器,默认情况下会先调用父类的...1. 首先, 子类必须调用父类的无参构造器,完成对父类的初始化
package com.hspedu.extend_; public class Base { // 父类 public Base(){ // 父类无参构造器 System.out.println("父类无参构造器Base()被调用"); } }
package com.hspedu.extend_; import com.hspedu.extend_.Base; public class Sub extends Base { //子类 public Sub(){ // 子类无参构造器 System.out.println("子类无参构造器Sub()被调用"); } }
运行后我们会发现,先调用了父类的无参构造器完成父类初始化,后才调用了子类的构造器 // 当子类对象创建时,不管使用子类的哪个构造器,默认情况下会先调用父类的无参构造器。 // 如果父类没有无参构造器,则必须在子类构造器中用super()去指定使用父类的哪个构造器去 // 完成对父类的初始化,否则编译无法通过
package com.hspedu.extend_; public class Base { // 父类 // public Base(){ // 父类无参构造器 // System.out.println("父类无参构造器Base()被调用"); // } public Base(int x){ // 父类中有参数的构造器,编写后会覆盖掉默认的无参构造器 System.out.println("父类有参数的构造器Base(int x)被调用"); } }
然后我们将父类中的无参构造器屏蔽, 创建一个有参数的构造器,这时会覆盖掉其默认的无参构造器,当我们创建子类对象时,如果不加以说明,子类就无法调用默认的无参构造器从而编译错误。
还是上面的子类的代码,我们会发现这里报错,而解决方法就是,必须要在子类的构造器中用super()说明使用父类中的哪个构造器。
package com.hspedu.extend_; import com.hspedu.extend_.Base; public class Sub extends Base { //子类 public Sub(){ // 子类无参构造器 super(1); System.out.println("子类无参构造器Sub()被调用"); } }
因为父类中的有参构造器的形参是一个int类型,所以我们用 super(int) 说明即可
此时便不会发生编译错误
运行后我们就可以清楚的看到,先调用了我们说明的 父类的有参构造器 完成父类初始化,再使用了子类的构造器。
总结就是: 当子类对象创建后,使用子类的构造器前,必须先使用父类的构造器,如果父类中没有编写构造器,其会有一个默认的无参构造器,或者自己编写了一个无参构造器,此时都不需要特殊的说明,程序会自己调用。
而当父类的无参构造器被覆盖时,就必须在子类构造器中说明要使用父类的哪个构造器,语法就是 super(参数)。
-
【专题讨论】【继承】父类构造器中调用了被子类重写的方法
2021-03-17 15:34:23这个专题名称叫做:“父类构造器中调用了被子类重写的方法”,不知道大家有没有了解过或者实践过这个概念, 我这边呢,首先在被笔试题虐之前这个概念我是见过的,具体是在李刚老师的《疯狂Java讲义 第五版》157页中... -
Java基础 -> 自己对子类调用父类构造器的理解
2020-10-17 12:57:31子类要调用父类构造器 super();调用父类的空参构造器 在编译期间,jvm会读取每个类,然后创建一个init的初始化方法, init方法里有通过编译得到的你写的类中的代码 按一定顺序排列 init(){ 1.super();//这个还是要有的,... -
java关于子类与父类构造器的继承与重写
2021-11-26 16:15:30子类继承父类时 1、若父类有显式写出了有参构造器,父类必须显式写出无参构造器。 2、若父类没有显式写出有参构造器,父类的无参构造器可写可不写 子类无法重写父类的无参与有参的构造器 ... -
父类构造器中被重写方法在子类的构造器中调用
2022-04-27 20:39:49父类的构造器中调用了父类被子类重写的方法 这个构造器在子类构造器中被调用后 这个方法会执行 子类重写的方法 有什么能解释的嘛 -
JAVA面向对象学习——java面向对象概念———一个简单的继承示例——调用父类构造器...
2022-01-23 06:21:12} } super调用父类的构造器 子类构造器总会调用父类构造器。 如果子类构造器没有显式使用super调用父类构造器;子类构造器默认会调用父类无参数的构造器。 创建一个子类实例时,总会先调用最顶层父类的构造器。 -
子类重写父类构造器以及其他方法
2018-05-18 22:04:51若父类重写了自身的构造器,并且还实现了自己的方法,那么,当子类继承父类后,重写自身的构造器和重写父类的其他方法时,搭配super()或者super.method()时候,会出现什么现象呢? 先看构造器 public class ... -
java 重写父类构造器
2018-11-18 17:37:00转载于:https://www.cnblogs.com/classmethond/p/9978586.html -
C# base 关键字(父类构造器的调用)
2020-08-22 21:46:35} } class DerivedClass: BaseClass { // 调用父类的BaseClass()构造器(无参数) public DerivedClass(): base() { } // 调用父类带参数的构造器 public DerivedClass(int i): base(i) { // 在执行完父类构造器以后... -
super调用父类构造器
2021-03-26 08:52:15super调用父类构造器 特点: 子类的全部构造器默认一定会调用父类的无参数构造器 super(…):可以根据参数选择调用父类的某个构造器 public class TestDemo { public static void main(String[] args) { //创建对象... -
java子类调用父类构造器函数
2019-06-25 15:52:54java子类调用父类构造器函数详解 -
5.1子类构造器中调用父类构造器的过程
2017-09-15 12:24:38在执行子类构造器之前,必须先执行父类构造器。在此其前提下总结以下几点: (1)编译器在运行子类构造器之前,必须先执行父类构造器;且调用父类构造器的语句必须在子类构造器的第一行。 (2)若父类只有无参构造器... -
java可以继承父类构造器吗
2021-03-17 20:45:42子类继承了父类,若父类的构造方法没有重载,那么,子类的构造方法也不需要通过super调用父类构造方法。一个类中如果构造方法重写了并且带了参数,那么这个类的原来系统默认的无参构造方法便消失。由此,若一个父类... -
理解调用子类构造器初始化子类对象时,父类构造器总会在子类构造器之前执行
2019-07-02 18:06:06不管是否使用super调用来执行父类构造器的初始化代码,子类构造器总会调用父类构造器一次。子类构造器调用父类构造器分如下几种情况。 子类构造器执行体的第一行使用super显式调用父类构造器,系统将根据super调用... -
Java子类继承父类构造器
2018-05-04 11:16:262.子类与父类构造器执行顺序?二、创建父类创建父类Animal,有两个构造器class Animal{ private Integer high; public Animal() { System.out.println("Animal()"); } public Animal(Integer high)... -
Java中调用父类构造器
2018-07-24 21:41:29但是子类构造器可以调用父类构造器的初始化代码,类似于一个类中,构造函数的重载。在一个构造器中调用另一个重载的构造器使用this来完成,在子类中调用父类的构造器使用super关键字来完成。 使用super调用和使用... -
子类调用父类构造器的几种情况
2019-04-20 20:04:13在调用子类构造器之前,会先调用父类构造器,当子类构造器中没有使用"super(参数或无参数)"指定调用父类构造器时,是默认调用父类的无参构造器,如果父类中包含有参构造器,却没有无参构造器,则在子类构造器中一定... -
Java中不要在父类构造器中调用会被子类覆写的方法
2022-02-20 11:19:33如果父类构造器中调用被子类重写的方法,会导致子类重写的方法在子类成员变量初始化之前和构造器执行之前执行,从而导致子类重写的方法无法访问到子类实例变量的值,因为此时这些变量还没有被初始化。 方法中使用... -
Java8接口默认方法重写和显示调用父类构造器
2020-10-09 15:47:34super关键字 即可知道显示调用 实例化子类对象的时候,会先实例化对象父类,即先调用父类构造器,再调用子类构造器 而调用父类构造器(没有无参构造器时),得显示调用 public class Fu { private String name;... -
1.4 Java子类对于父类构造器的继承
2018-03-12 14:25:02子类不能继承父类的构造器,但是在子类生成实例的时候必然会先调用父类的构造器,也就是在子类...若父类的构造器是带参构造器,则子类的构造器必须显式地用super(xx)调用父类构造器;子类可继承父类非private及非fin... -
子类实例化过程中对父类构造器的调用
2020-02-29 13:16:40子类实例化时,默认调用父类的无参构造方法(不管子类的构造器有没有参数,因为子类继承的是父类的属性和方法,只调用父类的无参构造器就可以继承父类的属性和方法,因此不会调用父类的有参构造器),再调用子类的有... -
Java子类和父类构造器问题分析
2017-07-13 10:02:27在Java中,如果子类中出现了无参构造器(不管是你手动编写的,还是系统自动生成的)时,父类中必须提供一个无参的构造器,但是如果你在子类的无参构造器中调用父类的带参构造器,则父类无须提供一个默认的无参构造器... -
父类构造器
2016-05-04 16:26:47当我们创建任何的Java对象的时候,程序总会先依次调用每个父类的非静态代码块,父类构造器,(默认总是从object开始)执行初始化操作,最后才去调用本类的非静态初始化块,构造器执行初始化操作。 当所有的父类的... -
父类构造器——隐式调用和显示调用
2018-04-14 14:49:161、当创建任何Java对象时,程序总会先依次调用每个父类非静态初始化块(这个调用是隐式执行的,而且父类的静态初始化块总是会被执行)、父类构造器(总是从Objec开始)执行初始化,最后才调用本类 的非静态化初始块... -
子类与父类构造器关系
2016-04-07 11:34:381.子父类都是默认构造器: 父类: 子类: 运行结果: 分析: 如果父类base class只有缺省构造函数,也就是编译器自动为你产生的,而子类中也只有缺省构造函数,那么不会产生任何问题。 ... -
父类构造器、子类构造器、static代码块、非static代码块执行顺序
2016-10-13 10:01:46最近在校招笔试中遇到好几次求子类、父类构造器执行顺序问题,基本能做出来,但有些复杂的也挺耗时。查了些资料,再结合自己做的测试,总结一下贴在这里。