精华内容
下载资源
问答
  • 构造器什么时候被调用
    千次阅读
    2020-12-23 10:04:49

    参考链接: 有关Java构造函数的面试问题

    看到这个题,你肯定要不就是在面试的路上,要不就是在刚学习的路上,要不就是连题目也没明白; 

     

    构造方法何时被调用 ( ) A.类定义时 B.创建对象时 C.调用对象方法时 D.使用对象的变量时 

    正确答案 

    答案解析 

    其是应该说是实例化对象时被调用,一个类的创建会默认有一个无参构造方法,当你实例化的时候(new Object())会被调用。 

    构造方法有哪些特点 

    构造方法是类中比较特殊的方法,有如下几个特点: 

    方法名与类名相同;方法没有返回值;构造方法可以重载(不限于参数个数以及参数类型);每个类默认会有一个无参的构造函数。

    更多相关内容
  • //程序默认调用父类无参构造器 System.out.println("Sub()被调用了..."); } public Sub(String name) { System.out.println("Sub(name)被调用了..."); } } 当我们new一个有参的子类对象时 package ...

    1.子类继承了所有的属性和方法,但是私有属性和方法不能在子类直接访问,要通过公共的方法去访问。

    package com.kxy.extend_;
    
    public class Base {
    	public int n1=100;
    	protected int n2=200;
    	int n3=300;
    	private int n4=400;
    }
    

    package com.kxy.extend_;
    
    public class Sub extends Base{
    	public Sub() {//子类的无参构造器
    
    	}
    	public void sayOk() {
    		//第一句话:非私有的属性和方法可以在子类访问,私有的属性和方法不能被子类访问
    		System.out.println(n1+" "+n2+" "+n3+" "  ) ;
    		System.out.printLn(n4);//错误	
    	}
    }
    

    怎么通过公共的方法去访问?我们在父类写上这个方法:

    package com.kxy.extend_;
    
    public class Base {
    	public int n1=100;
    	protected int n2=200;
    	int n3=300;
    	private int n4=400;
    	public int getN4() {//第二句话:通过公共的方法去访问子类原本不能访问的私有属性
    		return n4;
    	}
    }
    

    在子类方法里调用它就可以访问了。

    package com.kxy.extend_;
    
    public class Sub extends Base{
    	public Sub() {//子类的无参构造器
    
    	}
    	public void sayOk() {
    		//第一句话:非私有的属性和方法可以在子类访问,私有的属性和方法不能被子类访问
    		System.out.println(n1+" "+n2+" "+n3+" "  ) ;
    //		System.out.printLn(n4);//错误
    		//但是我们可以通过公共的方法去访问
    		System.out.println("n4="+getN4());
    		
    	}
    }
    

    我们在主类调用它:

    package com.kxy.extend_;
    
    public class ExtendsDetail {
    	public static void main(String[] args) {
    		Sub sub=new Sub();
    		sub.sayOk();
    	}
    }
    

    2.子类必须 调用父类的构造器,完成父类的初始化

    package com.kxy.extend_;
    
    public class Base {
    	public Base() {//父类的无参构造器
    		System.out.println("base()被调用了...");
    	}
    }
    

    package com.kxy.extend_;
    
    public class Sub extends Base{
    	public Sub() {//子类的无参构造器
    
    	}
    }
    
    package com.kxy.extend_;
    
    public class ExtendsDetail {
    	public static void main(String[] args) {
    		Sub sub=new Sub();
    	}
    }
    

    为什么创建子类的时候,子类一定会调用父类的构造器里的方法呢?

    因为在子类的无参构造器里,系统默认添加了一行代码super();

    package com.kxy.extend_;
    
    public class Sub extends Base{
    	public Sub() {//子类的无参构造器
    		super();//程序默认调用父类无参构造器
    	}
    }
    

    即使你不写,它也会被立即执行。如果不懂super是什么可以去看作者的另一个博客,点击跳转:

    super关键字什么时候使用?super的适用场景是?_❀༊烟花易冷ღ࿐❀的博客-CSDN博客

    3.当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无参构造器,则必须在子类的构造器中用super去指定使用父类的哪个构造器完成父类的初始化操作,否则编译不会通过。

    我们在子类原来基础上创建有参构造器

    package com.kxy.extend_;
    
    public class Sub extends Base{
    	public Sub() {//子类的无参构造器
    //		super();//程序默认调用父类无参构造器
    		System.out.println("Sub()被调用了...");
    	}
    	public Sub(String name) {
    		System.out.println("Sub(name)被调用了...");
    	}
    }
    

    当我们new一个有参的子类对象时

    package com.kxy.extend_;
    
    public class ExtendsDetail {
    	public static void main(String[] args) {
    		Sub sub=new Sub();
         	System.out.println("=========");
    		Sub sub2=new Sub("jack");//new一个有参子类对象
    
    	}
    }
    

     控制台输出,分割线上面是sub,下面是sub2

    通过对比我们可以发现,当我们new一个指定参数的对象,就间接的调用了指定的构造方法。

    如果父类没有提供无参构造器,则必须在子类的构造器中用super去指定使用父类的哪个构造器完成父类的初始化操作,否则编译不会通过。怎么理解?

    像这样,我们把父类的无参构造器给注释掉了,此时有参构造器就会覆盖掉原有的无参构造器。

    package com.kxy.extend_;
    
    public class Base {
    
    //	public Base() {//父类的无参构造器
    //		System.out.println("base()被调用了...");
    //	}
    	public Base(String name,int age) {
    		System.out.println("base(name,age)被调用了...");
    	}
    
    }
    

    我们来看看子类的情况如何?

    可以看到,此时子类不管是有参构造器还是无参构造器,都报了相同的错误:父类的无参构造器没有定义,必须选择其他的构造器。

    那么解决方案是什么呢?

    package com.kxy.extend_;
    
    public class Sub extends Base{
    	public Sub() {//子类的无参构造器
    //		super();//程序默认调用父类无参构造
    		super("Tom",15);
    		System.out.println("Sub()被调用了...");
    	}
    	public Sub(String name) {
    		super("Jam",18);
    		System.out.println("Sub(name)被调用了...");
    	}
    }
    

    所以,如果父类没有提供无参构造器,则必须在子类的构造器中用super去指定使用父类的哪个构造器完成父类的初始化操作。

    同样,在子类的有参构造器也是如此。

    通过对比上次的控制台输出,我们总结一个规律。

    1.如果父类没有写无参构造器,那么系统默认给你调用无参构造器,只是里面没有任何方法。

    2.如果父类写了无参构造器,那么子类必须调用父类无参构造器。

    3.如果父类写了无参构造器,又写了有参构造器,那么可以通过super指定选择使用哪个构造器,但是每个构造方法里只能super一次。也可以不使用super,那么相当于所有的子类构造方法都写了一个隐形的super();也就是默认使用无参构造器。

    4.如果父类没有写无参构造器,但写了有参构造器,那么有参覆盖无参,此时子类构造方法必须用super来完成初始化。

    ps:注意:在构造方法里,super必须在方法体里最前面。否则会报错。

    以下是关于本次博客的核心梳理:

    1.子类继承了所有的属性和方法,但是私有属性和方法不能在子类直接访问,要通过公共的方法去访问。

    2.子类必须 调用父类的构造器,完成父类的初始化

    3.当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无参构造器,则必须在子类的构造器中用super去指定使用父类的哪个构造器完成父类的初始化操作,否则编译不会通过。

    展开全文
  • java 构造函数什么时候被调用执行

    千次阅读 2021-03-30 21:26:41
    在java语言 中,构造函数又称构造方法。特殊性在于,与普通方法...当创建类对象的时候调用其对应的构造方法去创建。每创建一个类的实例都去初始化它的所有变量是乏味的。如果一个对象在创建时就完成了所有的初始工作

    在java语言 中,构造函数又称构造方法。特殊性在于,与普通方法的区别是,他与类名相同,不返回结果也不加void返回值。构造函数的作用是初始化对象,即在创建对象时被系统调用(与普通方法不同,程序不能显示调用构造函数)。构造函数还能够被重载,即可以传入参数,当程序中包含有带参的构造函数时,系统将不会再提供的无参构造函数。构造函数特点:没有函数返回值,构造函数名与类名相同;当创建类对象的时候调用其对应的构造方法去创建。每创建一个类的实例都去初始化它的所有变量是乏味的。如果一个对象在被创建时就完成了所有的初始工作,将是简单的和简洁的。因此,Java在类里提供了一个特殊的成员函数,叫做构造函数(Constructor)。 一个构造函数是对象被创建时初始对象的成员函数。它具有和它所在的类完全一样的名字。一旦定义好一个构造函数,创建对象时就会自动调用它。构造函数没有返回类型,即使是void类型也没有。这是因为一个类的构造函数的返回值的类型就是这个类本身。构造函数的任务是初始化一个对象的内部状态,所以用new操作符创建一个实例后,立刻就会得到一个清楚、可用的对象。 构造方法是一种特殊的方法,具有以下特点。

    • 构造方法的方法名必须与类名相同。
    • 构造方法没有返回类型,也不能定义为void,在方法名前面不声明方法类型。
    • 构造方法的主要作用是完成对象的初始化工作,它能够把定义对象时的参数传给对象的域。
    • 构造方法不能由编程人员调用,而要系统调用。
    • 一个类可以定义多个构造方法,如果在定义类时没有定义构造方法,则编译系统会自动插入一个无参数的默认构造器,这个构造器不执行任何代码。
    • 构造方法可以重载,以参数的个数,类型,或排列顺序区分。
    展开全文
  • java构造函数在什么时候被调用及特点1 构造函数在什么时候被调用2 构造函数特点 1 构造函数在什么时候被调用 在java语言 中,构造函数又称构造方法。构造函数的作用是初始化对象,即在创建对象时被系统调用(与普通...

    java构造函数在什么时候被调用及特点

    1 构造函数在什么时候被调用

    在java语言 中,构造函数又称构造方法。构造函数的作用是初始化对象,即在创建对象时被系统调用(与普通方法不同,程序不能显示调用构造函数)。

    2 构造函数特点

    构造函数的任务是初始化一个对象的内部状态,所以用new操作符创建一个实例后,立刻就会得到一个清楚、可用的对象。 构造方法是一种特殊的方法,具有以下特点。
    (1)构造方法的方法名必须与类名相同。
    (2)构造方法没有返回类型,也不能定义为void,在方法名前面不声明方法类型。
    (3)构造方法的主要作用是完成对象的初始化工作,它能够把定义对象时的参数传给对象的域。
    (4)构造方法不能由编程人员调用,而要系统调用。
    (5)一个类可以定义多个构造方法,如果在定义类时没有定义构造方法,则编译系统会自动插入一个无参数的默认构造器,这个构造器不执行任何代码。
    (6)构造方法可以重载,以参数的个数,类型,或排列顺序区分。

    展开全文
  • 构造方法何时被调用

    千次阅读 2021-03-01 07:03:05
    在java语言中,构造函数又称构造方法。...当创建类对象的时候调用其对应的构造方法去创建。每创建一个类的实例都去初始化它的所有变量是乏味的。(推荐学习:Java视频教程)如果一个对象在创建时就完成了所有...
  • 1.子类一定会调用父类的构造器 来看下面这个图,创建一个子类ChildExample 继承父类ParentExample,什么都不做,然后我编译,看到编译后的字节码中出现初始化父类的命令。说明子类中有一个默认的构造器super()调用了...
  • 前言:同一个类里具有多个构造器,多个构造器的形参列表不同,即称为构造器重載。构造器重载允许 Java 类里包含多个初始化逻辑,从而允许使用不同的构造器来初始化 Java 对象。在看本篇之前先了解 使用构造器执行...
  • C#——静态构造函数什么时间调用

    千次阅读 2019-03-04 11:22:40
    结论:在这里第一次使用类之前调用的意思不单单指new一个对象的时候已包括通过类访问静态成员的时候。 理解:在第一次 Student s1=new Student()或者第一次Student.school时都会执行static Student(){}静态构造...
  • 但是,我发现一个问题,为什么要这样设计,为什么子类一定要调用到父类的无参构造方法,或者你可以选择调用其他有参的父类构造方法,这可能跟子类实例化的时候也要先加载父类的构造代码块,静态代码块一个缘由。...
  • scala的子类调用父类的构造器的使用

    千次阅读 2019-06-14 08:54:49
    //注意scala只有主构造器才可以直接调用父类的构造器(主构造器和辅助构造器)子类的辅助够造器无法直接调用父类的够造放法必须通过子类中的主够造器来进行间接调用父类的够造器 object CaoLei { def main(args: Array...
  • 一、结论当调用某个类的构造器来创建Java对象时,系统总会先调用父类的非静态初始化块进行初始化,这个调用是隐式的。接着会调用父类的一个或多个构造器执行初始化,这个调用即可通过 super 显示调用,也可隐式调用...
  • SpringBoot中有参构造器调用问题

    千次阅读 2020-08-04 12:57:53
    问题:在IDEA中创建了SpringBoot项目,在创建好实体类后调用有参构造器,发现有参构造器不能调用,并没有提示可以调用有参构造器。。。 解决:IDEA的配置问题,如下图,参数信息中只默认勾选了第二项,把其余两项...
  • 我们在一个类中,可以在一个构造器中显式的调用本类的其他构造器。 如: public class Person { private String name; //构造器一 public Person() { } //构造器二 public Person(String name) { this...
  • Java中子类和父类的构造器调用顺序

    千次阅读 2021-05-26 10:18:43
    2.如果子类定义了构造方法,不论是无参数还是带参数,在创建子类的对象的时候,首先执行父类无参数的构造方法,然后执行自己的构造方法。 3.如果子类调用父类带参数的构造方法,可以通过super(参数)调用所需要的父类的...
  • 所以在子类继承父类后,必须调用父类里面的构造方法。 目的就是为了初始化父类的参数,子类才能使用 class E{ private String e; E(String e){ this.e=e; } } class F extends E{ F(String e){ super(e);...
  • java子类调用父类构造器函数

    万次阅读 多人点赞 2019-06-25 15:52:54
    java子类调用父类构造器函数详解
  • 使用反射调用构造器

    千次阅读 2018-08-05 12:59:50
    通过反射来获取某一个类的构造器可以分两步: 1.获取该类的字节码对象 (可参考文章 反射机制 ) 2.从该字节码对象中去找需要获取的构造器(查看API文档) 获取所有构造器有两个方法: 1.getConstructor():获取...
  • js系列教程4-函数、函数参数教程全解js中的4种函数调用模式javascript一共有4种调用模式:函数调用模式、方法调用模式、构造器调用模式和间接调用模式。【1】函数调用模式 当一个函数并非一个对象的属性时,那么它...
  • this调用构造器

    千次阅读 2019-06-02 21:51:27
    可以用来修饰:属性,方法、构造器 * * 2.this修饰属性和方法: * this理解为:当前对象或当前正在创建的对象 * * 2.1在类的方法中,我们可以使用"this.方法 "或"this.属性 "的方式,调用当前对象属性或...
  • 调用父类构造器的语句必须在子类构造器的第一行。 (2)若父类只有无参构造器,则调用父类构造器的语句可以省略。 如下面代码所示 父类   public class father() { private int age; private String
  • 那么我在debug的过程中,看到jvm运行的时候,先调用抽象父类的构造器Car(){},将属性初始化,然后回到JeepCar(){}子类构造器。 疑问:因为知道抽象类是不能初始化的,那么super(name)调用父类构造器,会初始化父类...
  • 如果父类构造器调用被子类重写的方法,会导致子类重写的方法在子类成员变量初始化之前和构造器执行之前执行,从而导致子类重写的方法无法访问到子类实例变量的值,因为此时这些变量还没有初始化。 方法中使用...
  • 在学习继承的时候了解到类的初始化过程是需要先加载父类的静态代码和构造函数以及相关属性的,那么为什么编译器会强制调用每个派生类中的构造器呢? class Super { public int field = 0; public int getField()...
  • 在Java程序中,我们是可以在构造方法中调用本类的方法和成员变量的,但是要注意一点,当我们需要调用一个非static的方法时,该方法不应该可以被子类覆盖,应该用final修饰或将其变成private,这虽然语法上没有具体...
  • Java中规定:在实例化子类对象时,必须先调用父类的构造方法,再调用子类的构造方法(先有父母再有孩子)。且必须在子类构造方法的第一行调用父类方法。 一般在子类中显式的调用父类构造方法,若没有显式调用调用...
  • 若子类构造函数中用 this 来指定调用子类自己的构造函数, 那么被调用构造函数也一样会调用父类中的构造函数. 为什么调用子类构造函数之前会调用父类无参构造函数? - K6-X4黑骑士君 - 博客园
  • java this关键字调用构造方法

    千次阅读 2021-02-12 13:22:11
    一 this调用构造方法构造方法之间的调用,可以通过this关键字来完成。格式:this(参数列表);构造方法的调用举例:classPerson {//Person的成员属性private intage;privateString name;//无参数的构造方法Person() {}...
  • java中子类和父类的构造器调用顺序

    千次阅读 2018-07-25 12:57:49
    2. 构造器不能继承、重写   3. 当进行无参构造时,先调用父类无参构造器,然后调用子类无参构造器;当进行含参构造时,先调用父类含参构造器,然后调用子类含参构造器。 示例代码如下(//: test/Frog.java) ...
  • 1.构造方法为为了初始化对象中的属性和方法 2.子类继承父类的成员变量,所以要先调用fuqi父类的构造方法和属性。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 977,627
精华内容 391,050
热门标签
关键字:

构造器什么时候被调用