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

什么是构造器

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

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

文章目录

  • Java构造器(构造方法)详解
    • Java构造器
    • 怎么定义构造器
    • 构造器的使用
    • 构造器的继承
    • 构造器、静态代码块、构造代码块的执行顺序,详见下文实例
    • 实例
      • 1.默认构造器
      • 2.禁止对象被外部创建
      • 3.构造器重载
      • 4.构造器的继承
      • 5. 构造器、静态代码块、构造代码块的执行顺序
        • 5.1无继承的情况
        • 5.2有继承的情况

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

//实例化Fatherpublic 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("子类第一个参数","子类第二个参数");}

执行上述代码

父类的静态代码块,程序启动后执行,只会执行一次
子类的静态代码块,程序启动后执行,只会执行一次,先执行父类的,在执行子类的
-----------------------------------
父类构造代码块,每次调用构造方法都会执行的
父类的默认构造方法
子类构造代码块,每次调用构造方法都会执行的
-----------------------------------
父类构造代码块,每次调用构造方法都会执行的
父类的带参构造方法,参数为:子类第一个参数
子类构造代码块,每次调用构造方法都会执行的
子类带参构造器:子类第二个参数

Java构造器(构造方法)详解相关推荐

  1. java构造块_java中的静态代码块、构造代码块、构造方法详解

    运行下面这段代码,观察其结果: package com.test; public class HelloB extends HelloA { public HelloB() { } { System. ...

  2. java基础(十三)-----详解内部类——Java高级开发必须懂的

    java基础(十三)-----详解内部类--Java高级开发必须懂的 目录 为什么要使用内部类 内部类基础 静态内部类 成员内部类 成员内部类的对象创建 继承成员内部类 局部内部类 推荐博客 匿名内部 ...

  3. 4.6 W 字总结!Java 11—Java 17特性详解

    作者 | 民工哥技术之路 来源 | https://mp.weixin.qq.com/s/SVleHYFQeePNT7q67UoL4Q Java 11 特性详解 基于嵌套的访问控制 与 Java 语言 ...

  4. java 反射机制详解

    火星十一郎 海纳百川, 有容乃大,QQ:791909235,Tel:13137910179 posts - 774, comments - 556, trackbacks - 0, articles ...

  5. Java Pattern类详解

    Java Pattern类详解 Pattern在java.util.regex包中,是正则表达式的编译表示形式,此类的实例是不可变的,可供多个并发线程安全使用. 定义 public final cla ...

  6. Java Servlet关键点详解

    Java Servlet关键点详解 1.理解Servlet的生命周期 Servlet引擎控制着Servlet的生命周期 Servlet的生命周期由以下三个方法进行描述(五个生命周期阶段) 1)初始化 ...

  7. Java注解(Annotation)详解

    转: Java注解(Annotation)详解 幻海流心 2018.05.23 15:20 字数 1775 阅读 380评论 0喜欢 1 Java注解(Annotation)详解 1.Annotati ...

  8. java枚举使用详解

    http://www.cnblogs.com/linjiqin/archive/2011/02/11/1951632.html java枚举使用详解 在实际编程中,往往存在着这样的"数据集& ...

  9. Java 线程池详解及实例代码

    转载自  Java 线程池详解及实例代码 这篇文章主要介绍了Java 线程池的相关资料,并符实例代码,帮助大家学习参考,需要的朋友可以参考下 线程池的技术背景 在面向对象编程中,创建和销毁对象是很费时 ...

  10. Java :内部类基础详解

    可以将一个类的定义放在另一个类的定义内部,这就是内部类. 第一次见面 内部类我们从外面看是非常容易理解的,无非就是在一个类的内部在定义一个类. public class OuterClass {pri ...

最新文章

  1. 第五周周记(国庆第七天)
  2. Azure自动化部署运维浅谈
  3. 配置ASA 7.x to Router LAN−to−LAN IPsec Tunnel
  4. 自己动手构建iSCSI磁盘阵列
  5. elasticsearch aggregation的入门案例
  6. Object 转 String
  7. [JSP暑假实训] 一.MyEclipse安装及JAVA基础知识
  8. 服务器网口正在验证身份6,无法使用基本身份验证进行身份验证(示例代码)
  9. rmmod无法卸载驱动_从hello world到LED驱动
  10. dentry path_lookat dput
  11. 使用MATLAB进行二次规划求解最优值
  12. mysql解锁_mysql锁表如何解锁
  13. 期货市场计算机技术指难,期货交易中最重要的是什么?最难的是什么?
  14. 股票中的KDJ三根线分别代表什么?
  15. windows10配置WSL(Ubuntu)环境
  16. 在CAD里怎么测量面积?
  17. git add .添加文件时报错 error: ‘fileName/‘ does not have a commit checked out 解决方法
  18. RNG分析:线性同余法 LCG
  19. 10qbt超导量子计算机,南京大学于扬、朱诗亮团队在超导量子比特中实现参数空间的新型磁单极...
  20. 读王坚博士著作《在线》笔记(二)

热门文章

  1. 电脑没声音(qq音乐提示没声卡) 联想小新为例
  2. mui android 状态栏,MUI——设置沉浸式状态栏
  3. 浅议应用系统“垂直切换”
  4. 线性表顺序存储结构图书管理
  5. 基于Java的校园图书管理APP设计
  6. 人脸比对软件_上海市动态人脸识别终端
  7. 职场秘籍|年终总结写得好 升职加薪少不了
  8. Python下载文件到指定文件夹
  9. 专业运动蓝牙耳机品牌、无线蓝牙运动耳机推荐
  10. OWASP top10 详解