精华内容
下载资源
问答
  • 那么我在debug的过程中,看到jvm运行的时候,先调用抽象父类的构造器Car(){},将属性初始化,然后回到JeepCar(){}子类构造器。 疑问:因为知道抽象是不能初始化的,那么super(name)调用父类构造器,会初始化父类...
    package com.wtd;
    
    public abstract class Car {
        private String name= "car";
    
        public Car(String name) {
            this.name = name;
        }
    }
    
    
    public class JeepCar extends Car {
        public JeepCar(String name){
            super(name);
        }
    }

    现在我要创建JeepCar的实例,JeepCar jC= new JeepCar();那么我在debug的过程中,看到jvm运行的时候,先调用抽象父类的构造器Car(){},将属性初始化,然后回到JeepCar(){}子类构造器。

    疑问:因为知道抽象类是不能初始化的,那么super(name)调用父类构造器,会初始化父类实例吗?如果不初始化父类实例,那么也就是说调用构造器并不一定初始化实例了,那这里的super(name)又有什么用处呢?

    对这些疑问,自己很迷惑,所以只有求助于网络了。从网上找了些感觉比较靠谱的解释。

    解释1:

      调用子类构造方法都会调用它的直接父类的构造方法。可以认为new才会返回一个实例的引用,而抽象类是不能new的(这个是规定,没理由)。
    调用子类构造方法是调用了它的抽象父类的构造方法,但构造方法是用来做初始化工作的,它并不会返回实例。

    解释2:

      抽象类中的构造方法其实是用来给继承的子类来用的,因为构造方法相当于初始化方法,当子类调用构造方法时必须调用父类构造方法,所以你可以在子类产生对象 时抽象类中按需求初始化抽象类中的字段以及执行一些初始化代码。其实并不是一定要生成某个类的实例才调用构造方法,子类也需要调用父类构造方法。而生成实 例也并不一定会调用构造方法,在某些特殊实现中或者特殊情况下,生成实例不会调用构造方法。而调用了构造方法也不一定就生成了一个实例,但是那一定是一个 实例调用的,就像一个普通的实例方法一样。

    解释3:

      抽象类不能被实例化是说Person p=new Person();这样是错误的;但是Person p=new Employee(); 是可以的,创建子类的实例,父类的引用指向它
    在上述主程序中,new Employee后,它会初始化对象,初始化顺序为:
    父类静态块初始化---->子类静态块初始化---->父类非静态块初始化---->父类构造方法---->子类非静态块初始化---->子类构造方法。(先静后动,先父后子) 
    这个主程序会先初始化person类的非静态属性和构造函数再初始化employees类的非静态属性和构造函数

    这就是你第一个问题的当子类的父类为抽象类时,构造方法如何追溯?而抽象类作为父类也会创建实例么?没有创建实例只是构造函数在对抽象类Person的属性初始化,对于一个类的声明,赋值     和使用两件事情,前者不需要实例化,后者必须实例化 。

     

    自己的简单总结:类的构造器,不论抽象还是非抽象,作用都一样,就是初始化属性的;

            只有构造器和new连在一块使用时,才是创建类的实例(对象)。

            抽象类中的构造方法是怎么回事?就是初始化属性的作用

        

    转载于:https://www.cnblogs.com/westward/p/5323111.html

    展开全文
  • 子类构造器调用父类构造器分如下几种情况。 子类构造器执行体的第一行使用super显式调用父类构造器,系统将根据super调用里传入的实参列表调用父类对应的构造器。 子类构造器执行体的第一行代码使用this显式调用本...

    不管是否使用super调用来执行父类构造器的初始化代码,子类构造器总会调用父类构造器一次。子类构造器调用父类构造器分如下几种情况。

    • 子类构造器执行体的第一行使用super显式调用父类构造器,系统将根据super调用里传入的实参列表调用父类对应的构造器。
    • 子类构造器执行体的第一行代码使用this显式调用本类中重载的构造器,系统将根据this 调用里传入的实参列表调用本类中的另一个构造器。执行本类中另一个构造器时即会调用父类构造器。
    • 子类构造器执行体中既没有super调用,也没有this调用,系统将会在执行子类构造器之前,隐式调用父类无参数的构造器。

    不管上面哪种情况,当调用子类构造器来初始化子类对象时,父类构造器总会在子类构造器之前执行;不仅如此,执行父类构造器时,系统会再次上溯执行其父类构造器……依此类推,创建任何Java对象,最先执行的总是java.lang.Object类的构造器。

     

    /**
     * 说明:当调用子类构造器来初始化子类对象时,父类构造器总会在子类构造器之前执行
     * @author LiuYP_1024
     *
     */
    class Creature{
    	public Creature() {
    		System.out.println("Creature无参数的构造器");
    	}
    }
    
    class Animal extends Creature{
    	public Animal(String name) {
    		System.out.println("Animal带一个参数的构造器,该动物的name为"+name);
    	}
    	public Animal(String name,int age) {
    		//以下使用this调用同一个重载的构造器
    		this(name);
    		System.out.println("Animal带两个参数的构造器,其age为"+age);
    	}
    }
    
    public class Wolf extends Animal{
    	public Wolf() {
    		super("灰太狼",3);
    		System.out.println("Wolf无参数的构造器");
    	}
    	
    	public static void main(String[] arge) {
    		new Wolf();
    	}
    }
    

    运行结果如下:

    Creature无参数的构造器
    Animal带一个参数的构造器,该动物的name为灰太狼
    Animal带两个参数的构造器,其age为3
    Wolf无参数的构造器

     

    内容整理来源于:疯狂Java讲义

    展开全文
  • 子类构造器调用父类构造器的顺序问题.pdf
  • 一 super调用父类构造器 子类构造器总会调用父类构造器。 如果子类构造器没有显示使用super调用...二 构造器调用顺序示例 1 代码示例 class Creature { public Creature() { System.out.println("Creature

    一 super调用父类构造器

    • 子类构造器总会调用父类构造器。
    • 如果子类构造器没有显示使用super调用父类构造器,子类构造器默认会调用父类无参构造器。
    • 创建一个子类实例时,总会调用最顶层父类构造器。

    二 构造器调用顺序示例

    1 代码示例

    class Creature
    {
    	public Creature()
    	{
    		System.out.println("Creature无参数的构造器");
    	}
    }
    class Animal extends Creature
    {
    	public Animal(String name)
    	{
    		System.out.println("Animal带一个参数的构造器,"
    			+ "该动物的name为" + name);
    	}
    	public Animal(String name , int age)
    	{
    		// 使用this调用同一个重载的构造器
    		this(name);
    		System.out.println("Animal带两个参数的构造器,"
    			+ "其age为" + age);
    	}
    }
    public class Wolf extends Animal
    {
    	public Wolf()
    	{
    		// 显式调用父类有两个参数的构造器
    		super("大灰狼", 3);
    		System.out.println("Wolf无参数的构造器");
    	}
    	public static void main(String[] args)
    	{
    		new Wolf();
    	}
    }

    2 运行结果

    Creature无参数的构造器

    Animal带一个参数的构造器,该动物的name为大灰狼

    Animal带两个参数的构造器,其age为3

    Wolf无参数的构造器

    3 结果分析

    从运行结果来看,创建任何对象总是从该类所在继承树最顶层的构造器开始执行,然后依次向下执行,最后才执行本类的构造器,如果其个父类通过this调用同类中的构造器,就会依次执行父类的多个构造器。

    展开全文
  • 在构造子类时。子类创建完,即拥有父类的属性,所以在构造子类...1.子类构造函数中没写super()并且子父类具有无参构造函数。那么子类第一行便会自动一条隐身的语句super 父类代码:具有无参构造函数 public class F...

    在构造子类时。子类创建完,即拥有父类的属性,所以在构造子类之前一定会构造父类。
    其实子类的所有构造方法的第一行都有一条隐示super()或者显示的super()

    • 隐示super()
      先说一下什么情况下会有隐示的super()。
      1.子类构造函数中没写super()并且子父类具有无参构造函数。那么子类第一行便会自动一条隐身的语句super
      父类代码:具有无参构造函数
    public class Fruit {
        private String name;
    
        public Fruit() {
    
        }
    
        public Fruit(String name) {
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }
    

    子类代码:可以看到子类的两个构造函数都没有显示的写super(),那么在构造子类的时候就会自动产生super(),并且执行父类的无参构造函数

    public class Apple extends Fruit {
    
        boolean isRed;
    
        public Apple() {
        }
    
        public Apple(boolean isRed) {
            this.isRed = isRed;
        }
    
        public boolean isRed() {
            return isRed;
        }
    
        public void setRed(boolean red) {
            isRed = red;
        }
    }
    

    如果父类没有无参构造函数,那么不能自动生成super(),编译会报错:There is no default constructor available in xxxx

    • 显示的super()
      如果父类没有无参构造函数,或者需要调用父类的有参构造函数就需要显示的调用super();
      父类:没有无参构造函数
    public class Fruit {
        private String name;
    
        public Fruit(String name) {
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    }
    

    子类:显示调用父类的构造函数,并且传入参数

    public class Apple extends Fruit {
    
        boolean isRed;
    
        public Apple(boolean isRed,String name) {
            super(name);
            this.isRed = isRed;
        }
    
        public boolean isRed() {
            return isRed;
        }
    
        public void setRed(boolean red) {
            isRed = red;
        }
    }
    
    展开全文
  • java子类调用父类构造器函数

    万次阅读 多人点赞 2019-06-25 15:52:54
    java子类调用父类构造器函数详解
  • Java子类构造器与其父关系

    千次阅读 2013-04-16 23:55:01
    简单谈一下Java程序设计语言中,子类构造器与其父构造器的关系。  Java是属于单继承的对象语言,子类可以继承并且使用其父类的所有变量和方法,非常典型的例子是Java中所有都是继承于超级Object,因此每一个...
  • 调用父类构造器的语句必须在子类构造器的第一行。 (2)若父类只有无参构造器,则调用父类构造器的语句可以省略。 如下面代码所示 父类   public class father() { private int age; private String
  • 子类构造器调用父类构造器分如下几种情况:1.子类构造器执行体的第一行使用super显式调用父类构造器,系统将根据super调用里传入的实参列表调用父类对应的构造器。2.子类构造器执行体的第一行代码使用this显式调用本...
  • 创建对象时,会先自动调用父类的构造函数,再自动调用子类构造函数。 解释:super()表示父类的构造函数并会调用于参数相对应的父类中的构造函数。子类中,它在调用父类中空参数的构造函数。因为子类继承父类,会...
  • 一、子类构造器都必须显示或隐式调用父类构造器 众所周知,子类可以继承父类所有的变量和方法,但是有没有想过子类为何能继承它们,它们是凭空继承而来的么?当然不是,其实每当调用子类构造器new一个子类对象的...
  • Java子类继承父类构造器

    千次阅读 2018-05-04 11:16:26
    子类如何继承父类的构造器?2.子类与父类构造器执行顺序?二、创建父类创建父类Animal,有两个构造器class Animal{ private Integer high; public Animal() { System.out.println("Animal()"); } ...
  • 我们先看一个经典的例子: class Root{ static{ System.out.println("Root的静态初始化块"); } { System.out.println("Root的普通... System.out.println("Root的无参构造器"); } } class Mid extends Root {
  • 简单谈一下Java程序设计语言中,子类构造器与其父构造器的关系。  Java是属于单继承的对象语言,子类可以继承并且使用其父类的所有变量和方法,非常典型的例子是Java中所有都是继承于超级Object,因此每一个...
  • Java构造器调用顺序

    千次阅读 2017-01-18 14:18:44
    构造器调用顺序 基类的构造器总是在子类的构造过程中被调用,而且按照继承层次逐渐向上连接,所以每个基类的构造器都能得到调用。  这是为什么呢? 构造器的一项任务就是检查对象是否被正确构造.子类只能访问...
  • Java子类实例化调用父类构造方法

    千次阅读 2019-03-13 14:09:25
    子类继承父类后,获取到父类的属性和方法,这些属性和方法在使用前必须先初始化,所以须先调用父类的构造器进行初始化 同时父类也会加载进来,静态代码块会执行 ...
  • java父类构造函数调用子类覆盖方法

    千次阅读 2017-07-17 16:54:48
    原文链接:... ... 1.如果父类构造器调用了被子重写的方法,且通过子类构造函数创建子类对象,调用了这个父类构造器(无论显示还是隐式),就会导致父类在构造时实际上
  • java中子和父类的构造器调用顺序

    千次阅读 2018-07-25 12:57:49
    3. 当进行无参构造时,先调用父类无参构造器,然后调用子类无参构造器;当进行含参构造时,先调用父类含参构造器,然后调用子类含参构造器。 示例代码如下(//: test/Frog.java) package test import java.util...
  • Java构造器内部的多态方法的行为

    千次阅读 2016-09-12 20:17:33
    这篇文章主要讨论的是,若在一个构造器调用正在构造的对象的某个动态绑定的方法时会出现的... 基类的构造器总是在导出的构造过程中被调用,而且按照继承层次逐渐向上链接,以使每个基类的构造器都能得到调用。这
  • Java子类调用父类构造方法

    万次阅读 多人点赞 2017-09-29 14:49:15
    Java中,子类构造过程中,必须调用其父构造函数,是因为有继承关系存在时,子类要把父类的内容继承下来,通过什么手段做到的?   答案如下:   当你new一个子类对象的时候,必须首先要new一个父类...
  • 测试代码如下: 父类: public class ParentTest { public ParentTest(){ System.out.println(1); } public ParentTest(String name){ System.out.println(2...子类: public class ChildTest extends Par
  • Java:简述父类与子类构造函数的调用次序 一、题目: 下列代码在执行new Child(“test”)的时候,输出结果是什么呢? class People { String name; public People() { System.out.println(1); } public ...
  • 我想问java子类构造方法时候是先检验是否能生成父类的对象还是先检测是否调用了该子类的其他构造方法,因为我这样试了试通过了编译。![图片说明]...
  • scala的子类调用父类的构造器的使用

    千次阅读 2019-06-14 08:54:49
    //注意scala只有主构造器才可以直接调用父类的构造器(主构造器和辅助构造器)子类的辅助够造器无法直接调用父类的够造放法必须通过子类中的主够造器来进行间接调用父类的够造器 object CaoLei { def main(args: Array...
  • java构造器调用顺序

    千次阅读 2011-03-07 23:15:00
    java构造器调用顺序

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 252,474
精华内容 100,989
关键字:

java子类构造器调用内部类构造器

java 订阅