知识点

  • 什么是构造器

    构造器通常也叫构造方法、构造函数,构造器在每个项目中几乎无处不在。当你new一个对象时,就会调用构造器。构造器格式如下:
[修饰符,比如public] 类名 (参数列表,可以没有参数){
//这里不能有return
}
  • 默认构造器

    如果没有定义构造器,则会默认一个无参构造器,这就是为什么你定义了一个对象,比如 People,没有定义任何构造器却可以new这个对象,比如 new People() 。如果自定义了构造器,则会覆盖默认构造器。

  • 如何禁止对象被外部创建

    一些特殊需求,不希望定义的对象被外部创建(典型的就是单例了),那直接将构造器的修饰符改为 private 即可。这样就不能在外部通过new来创建这个对象了。

  • 构造器重载

    与普通方法一样,构造器也支持重载。一个对象中是可以支持同时定义多个构造器,通过不同的参数列表来实现重载。经常看到代码中new一个对象时,有时传入参数,有时又可以不用传。比如:new People()跟new People("张三"),这里就是重载了。

  • 构造器的继承

    子类构造器会默认调用父类无参构造器,如果父类没有无参构造器,则必须在子类构造器的第一行通过 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 SuperClass() 调用了,除非再定义一个无参构造器

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

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

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

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

5.1 无继承的情况

public class People {

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

实例化People

public static void main(String[] args){
System.out.println("--------------people----------------");
People people = new People();
System.out.println("--------------people1----------------");
People people1 = new People("张三");
}

执行以上代码,输出:

--------------people----------------
静态代码块,程序启动后执行,只会执行一次
构造代码块,每次调用构造方法都会执行一次
默认构造器
--------------people1----------------
构造代码块,每次调用构造方法都会执行一次
带参构造器,参数:张三

5.2 有继承的情况

定义父类SuperClass

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

定义子类SubClass,继承SuperClass

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

实例化SubClass

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

执行以上代码,输出:

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

源码获取

以上示例都可以通过我的GitHub获取完整的代码,点击获取

java 构造器(构造方法)使用详细说明的更多相关文章

  1. Java构造器(构造方法)与方法区别

    构造器,又称为构造方法.构造器用于构造该类的实例,也就是对象. 格式如下:[修饰符]  类名 (形参列表){//n条语句} 构造方法是一种特殊的方法,与一般的方法区别:  1.构造方法的名字必须与定义 ...

  2. Java中构造方法的详细介绍

    构造方法是一个特殊的方法 它会在实例化对象时自动调用 构造方法的定义 必须同时满足下面的三个条件 方法名与类名相同 方法名前面没有返回值类型的声明 在方法中不能使用return语句返回值 class ...

  3. 乐字节Java构造器(构造方法|构造函数)、方法与内存分析

    一. 构造器(构造方法|构造函数) 在创建对象时(new),必会调用一个特殊的方法,这个方法是初始化对象信息的为new服务的.这个方法称为“构造器” 使用 new + 构造方法创建一个新的对象. 构造 ...

  4. Java Object 构造方法的执行顺序

    Java Object 构造方法的执行顺序 @author ixenos 为了使用类而做的准备工作包括三个步骤 1)加载:类加载器查找字节码(一般在classpath中找),从字节码创建一个Class ...

  5. Java 构造器Constructor 继承

    Java默认构造方法 构造方法作用:初始化所定义的类的对象和属性. 构造方法没有返回类型. 2 继承中的构造器 子类是不继承父类的构造器(构造方法或者构造函数)的,它只是调用(隐式或显式). 如果父类 ...

  6. 基于Java 生产者消费者模式(详细分析)

    Java 生产者消费者模式详细分析 本文目录:1.等待.唤醒机制的原理2.Lock和Condition3.单生产者单消费者模式4.使用Lock和Condition实现单生产单消费模式5.多生产多消费模 ...

  7. java中构造方法和方法super/this超类与子类中初始化顺序

    java中构造方法和方法全面解析 我相信大多说人都对构造方法.方法不陌生,而且很了解,但我也相信有很多像我这样的没有一个很好很清晰很全面的认识,今天就把它整理如下,希望能给大家带来点方便与帮助,也希望 ...

  8. 关于java中构造方法、实例初始化、静态初始化执行顺序

    在Java笔试中,构造方法.实例初始化.静态初始化执行顺序,是一个经常被考察的知识点. 像下面的这道题(刚刚刷题做到,虽然做对了,但是还是想整理一下) 运行下面的代码,输出的结果是... class ...

  9. JAVA构造器,重载与重写

    1. java构造器 构造器也叫构造方法(constructor), 用于对象初始化. 构造器是一个创建对象时被自动创建的特殊方法,目的是对象的初始化. 构造器 的名称与类的名称一致. JAVA通过n ...

  10. (转)Java中的容器详细总结

    Java中的容器详细总结(编辑中) 原文链接:http://anxpp.com/index.php/archives/656/ 注:本文基于 Jdk1.8 编写 通常程序总是根据运行时才知道的某些条件 ...

随机推荐

  1. 使用mui框架开发App,当input获取焦点时,键盘弹出,底部导航栏上升。

    转自 https://blog.csdn.net/elementFei/article/details/72917393 感谢 问题: 使用mui框架开发App,当input获取焦点时,键盘弹出,底部 ...

  2. EXAM-2018-8-3

    EXAM-2018-8-3 D H 喜闻乐见的水题 J lower_bound + upper_bound 一个可以查找第一个大于,另一个可查找第一个不小于. F 找规律+奇偶分析 偶数好找,就是奇数 ...

  3. STM32学习中出现的错误

    1.添加了多个文件后编译发现出现了无效的重复声明: 原因:文件(头文件)调用的时候重复调用, 解决办法:每个头文件写的时候包含以下代码: #ifndef   __STM32F10X_H   //头文件 ...

  4. 62)PHP,提示跳转

    由于就是一个普通的页面展示,提示的样式,可以轻松定制! 语法: Header()后的代码会执行,因此在处理好跳转相关操作后,脚本也应该被DIE掉! 案例中实现跳转 封装一个可以完成跳转的方法,需要时, ...

  5. 80)PHP,扩展工具类

    啥是扩展工具类:这个问题很深奥,自己慢慢理解吧. 首先  对于session的处理函数是扩展工具类. ②图片处理类 ③验证码生成类 ④算是项目中的一个功能模块. 扩展工具类   放在我们的framew ...

  6. 2019ICPC南京网络赛B super_log(a的b塔次方)

    https://nanti.jisuanke.com/t/41299 分析:题目给出a,b,mod求满足条件的最小a,由题目的式子得,每次只要能递归下去,b就会+1,所以就可以认为b其实是次数,什么的 ...

  7. 机器学习算法之——LR(未完成)

    LR的形式 sklearn中的LR模块sklearn.linear_model.LogisticRegression LR的目标函数 主要的考虑点有三个:处理什么类型的问题?是否正则以及什么正则?求解 ...

  8. django框架基础-框架介绍-长期维护

    ###############    MVC架构介绍    ################ # MVC架构 # 一个软件框架有很多的模块,每一个模块有不同的功能 # 模块与模块之间相互配合来完成软件 ...

  9. seckill

    京东自动登录 注:本文所做操作皆以京东web为例 包含:xpath,splinter,ocr 遇到的坑: 登录页面通过查看网页元素,能看到账户,密码唯一id,但是执行 12 browser.fill( ...

  10. 简单的文件上传服务器(上传到FastDFS服务器)

    现在文件服务器使用越来越多,其中FastDFS文件服务器非常出色,可以支持分布式存储,多文件系统集群和多主机备份 环境中使用的文件服务器为172.16.100.10,其中trackerd服务和stor ...