Java构造器(构造方法)详解

Java构造器(构造方法)详解Java 构造器 构造方法 详解什么是构造器构造器通常也叫构造方法 构造函数 构造器在每个项目中几乎无处不在 当你 new 一个对象时 就会调用构造器 构造器格式如下 修饰符 比如 public 类名 参数列表 可以没有参数 这里不能有 return 文章目录 Java 构造器 构造方法 详解 Java 构造器怎么定义构造器构造器的使用构造器的继承构造器 静态代码块 构造代码块的执行顺序 详见下文实例实例 1 默认构造器 2 禁止对象被外部创建 3 构造器重载 4 构造器的继承 5 构造器 静态代码

Java构造器(构造方法)详解

什么是构造器

构造器通常也叫构造方法、构造函数,构造器在每个项目中几乎无处不在。当你new一个对象时,就会调用构造器。构造器格式如下:

[修饰符,比如public] 类名 (参数列表,可以没有参数){ //这里不能有return}

Java构造器

构造器的注意事项:

  1. 构造器的名称必须和类名一致
  2. 一个类中可以定义多个构造器,但是构造器的参数列表必须不同(重载)
  3. 如果我们没有手动定义构造器,则Java系统会提供一个默认的构造器给我们使用,一旦我们定义了构造器,则系统会把默认的构造器收回
  4. 构造器的作用:实例化对象,给对象赋初始值
  5. 代码游离块优先执行

怎么定义构造器

构造方法的名字必须和所在类的名字一致,没有返回值,但不能声明void,访问权限可以为任意,但是一般情况下使用public方法权限,构造方法中的参数可以根据需要自行定义,参数的不同的构造方法构成重载

public 构造方法名(参数){ 
    ... } /*注意: 1.构造方法没有返回值类型 2.构造方法名必须和该类的类名保持一致,大小写都一样 

例:

 class Fu { 
    public Fu(){ 
   } //无参的公有构造方法 public Fu(int i){ 
   } //参数类型为int的公有构造方法 ...... } public class Demo extends Fu { 
    public Demo(){ 
   } //无参的公有构造方法 public Demo(int i){ 
   } //参数类型为int的公有构造方法 public Demo(int i,double d){ 
   } //参数类型为int和double的公有构造方法 ... } 

构造器的使用

Java中构造方法的使用有两个地方,一个是跟在关键字new后面,类名加上一个小括号(),小括号内根据实际加上实参,另外一个是跟在关键字super或this后加上一个小括号(),小括号内根据实际添加实参,下面进行举例。

例1:

Demo demo = new Demo(); //这里是调用的是一个无参的构造方法,必须声明在方法中,最好声明在主方法

上面构造方法的参数根据实际添加实参,Jvm根据构造方法的参数不同加载不同的构造方法

例2:

public Demo(){ 
    this(2); //这里调用参数为int类型的本类的构造方法 } 

例3:

public Demo(){ 
    super(1); //调用参数为int类型的父类的构造方法 } 

注意:例2和例3中this或super调用构造方法只能出现在构造方法中,而且必须出现在第一行,所以一个构造方法中第一行只能为this或super调用构造方法,两者不能同时调用构造方法出现,而且注意this或super调用构造方法时,要留构造方法出口,意思就是最后调用的构造方法中没有再调用别的构造方法!

构造器的继承

子类构造器会默认调用父类无参构造器,如果父类没有无参构造器,则必须在子类构造器的第一行通过 super关键字指定调用父类的哪个构造器,具体看下文例子。final类是不允许被继承的,编译器会报错。很好理解,由于final修饰符指的是不允许被修改,而继承中,子类是可以修改父类的,这里就产生冲突了,所以final类是不允许被继承的。

构造器、静态代码块、构造代码块的执行顺序,详见下文实例

  • 无继承的情况下的执行顺序静态代码块:只在程序启动后执行一次,优先级最高构造代码块:任何一个构造器被调用的时候,都会先执行构造代码块,优先级低于静态代码块构造器:优先级低于构造代码块总结一下优先级:静态代码块 > 构造代码块 > 构造器
  • 有继承的情况下的执行顺序:父类静态代码块:只在程序启动后执行一次,优先级最高 子类静态代码块:只在程序启动后执行一次,优先级低于父类静态代码块 父类构造代码块:父类任何一个构造器被调用的时候,都会执行一次,优先级低于子类静态代码块父类构造器:优先级低于父类构造代码子类构造代码块:子类任何一个构造器被调用的时候,都会执行一次,优先级低于父类构造器子类构造器:优先级低于子类构造代码块总结一下优先级:父类静态代码块 > 子类静态代码块 > 父类构造代码块 > 父类构造器 > 子类构造代码块 > 子类构造器

实例

1.默认构造器

新建一个类,不提供任何构造器,编译器会默认提供一个无参构造器,这就是为什么没定义任何构造器,却可以new 某个对象()

public class People { 
   } //以上这个People类就可以直接通过new People()来实例化 

2.禁止对象被外部创建

如果不希望People在外部通过new People()来实例化,只需要将构造器定义为private

public class People{ 
    private People(){ 
    } } 

3.构造器重载

重载可以简单理解为:同个方法名,不同的参数列表。如果希望People能在外部通过new People() 或 new People(“字符串”) 来实例化,则通过以下代码即可

public class People{ 
    //通过new People()调用 public People(){ 
    } //通过new People("字符串")调用 public People(String str){ 
    } } 

4.构造器的继承

定义父类构造器,由于该构造器自定义了一个带参构造器,覆盖了默认的无参构造器,所以不能直接 new Father() 调用了,除非再定义一个无参构造器

//父类构造器 public class Father{ 
    //自定义带参构造器 public Father(String str){ 
    System.out.println("父类的带参构造方法,参数为:"+str); } } 

定义子类构造器,继承Father,由于Father没有无参构造器,所以必须在子类构造器中通过 super(“字符串”)来调用,否则编译器会报错

//子类构造器 public class Son extends Father{ 
    //无参构造器 public Son(){ 
    //由于Father()没有无参构造器,所以必须在子类型构造器中通过super("字符串")来调用,否则编译器会报错。 //如果没定义这句,系统会默认调用super() super(""); } //带参构造器 public Son(String str){ 
    //由于Father()没有无参构造器,所以必须在子类型构造器中通过super("字符串")来调用,否则编译器会报错。 //如果没定义这句,系统会默认调用super() super(str); } } 

5. 构造器、静态代码块、构造代码块的执行顺序

5.1无继承的情况
public class Father { 
    static { 
    System.out.println("父类的静态代码块,程序启动后执行,只会执行一次"); } //父类无参构造方法 public Father(){ 
    System.out.println("父类的默认构造方法"); } //重载,自定义父类带参构造方法 public Father(String str){ 
    System.out.println("父类的带参构造方法,参数为:"+str); } { 
    System.out.println("父类构造代码块,每次调用构造方法都会执行的"); } } 

实例化Father

//实例化Father public static void main(String[] args) { 
    System.out.println("---------------------------------------"); Father father1 = new Father(); System.out.println("---------------------------------------"); Father father2 = new Father("阿马"); } 

执行上述代码

父类的静态代码块,程序启动后执行,只会执行一次 --------------------------------------- 父类构造代码块,每次调用构造方法都会执行的 父类的默认构造方法 --------------------------------------- 父类构造代码块,每次调用构造方法都会执行的 父类的带参构造方法,参数为:阿马 
5.2有继承的情况

定义父类Father

public class Father { 
    static { 
    System.out.println("父类的静态代码块,程序启动后执行,只会执行一次"); } //父类无参构造方法 public Father(){ 
    System.out.println("父类的默认构造方法"); } //重载,自定义父类带参构造方法 public Father(String str){ 
    System.out.println("父类的带参构造方法,参数为:"+str); } { 
    System.out.println("父类构造代码块,每次调用构造方法都会执行的"); } } 

定义子类Son,继承自父类Father

//子类构造器 public class Son extends Father{ 
    static { 
    System.out.println("子类的静态代码块,程序启动后执行,只会执行一次,先执行父类的,在执行子类的"); } { 
    System.out.println("子类构造代码块,每次调用构造方法都会执行的"); } //无参构造器 public Son(){ 
    //这里没有指定调用父类的哪个构造方法,会默认调用super(),调用父类的无参构造器public Father() } //重载构造器,多传两个参数 public Son(String str1,String str2){ 
    //必须写在构造器第一行,调用父类的带参构造器public Father(str) super(str1); System.out.println("子类带参构造器:"+str2); } } 

实例化Son

public static void main(String[] args) { 
    System.out.println("-----------------------------------"); Son son1 = new Son(); System.out.println("-----------------------------------"); Son son2 = new Son("子类第一个参数","子类第二个参数"); } 

执行上述代码

父类的静态代码块,程序启动后执行,只会执行一次 子类的静态代码块,程序启动后执行,只会执行一次,先执行父类的,在执行子类的 ----------------------------------- 父类构造代码块,每次调用构造方法都会执行的 父类的默认构造方法 子类构造代码块,每次调用构造方法都会执行的 ----------------------------------- 父类构造代码块,每次调用构造方法都会执行的 父类的带参构造方法,参数为:子类第一个参数 子类构造代码块,每次调用构造方法都会执行的 子类带参构造器:子类第二个参数 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/207406.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午1:54
下一篇 2026年3月19日 下午1:54


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号