构造器这个概念,各种语言都有出现,虽然为了考试或者其他学了好多遍,但是自己一直不能理解这个概念,前几天又学了一遍,突然就明白了,下面随小编来一起学习一下吧。

什么是构造器?

在类别基础的面向对象程序设计中,构造器(英语: Constructor;别称:构造方法、构造函数、建构子)是一个类里用于建立对象的特殊子程序。它能初始化一个新建的对象,并时常会接受参数用以设定实例变量。

构造器跟一般的实例方法十分相似;但是与其它方法不同,构造器没有返回类型,不会被继承,且不会有范围修饰符。构造器的函数名称一般与它所属的类的名称相同。 它承担着初始化对象数据成员并建立类不变象的任务;在类不变象无效的时候它会失败。一个正确编写的构造器会使它生成的对象保持在一个有效状态。不可变物件必须在构造器内完成所有初始化。

多数编程语言允许构造器重载 - 一个类被允许拥有多个接受不同参数种类的构造器同时存在。一些编程语言允许某些特殊种类的构造器。使用单个类来具体地建立和返回新实例的构造器,时常被抽象为工厂方法 - 一种同样用来建立新对象,但会同时使用多个类,或者一些诸如对象池的分配方案来完成这一过程的子程序。

简而言之,当我们实例化一个对象的时候,就回去调用它的构造器,比如

String cons = new String();就调用了String的构造器。

构造器的特点

构造器有如下几个特点:

1.没有返回类型

2.没有范围修饰符

3.任何一个类都有构造器,当我们没有写构造器的时候,系统会给这个类分配一个默认的构造器。

4.构造器可以重载。

5.当我们重载构造器时,系统不再为该类分配默认构造器。

构造器的使用

下面我们可以从几个例子中来学习构造器的使用。

第一个例子:

package com.javatest.lang;

import org.junit.jupiter.api.Test;

/**
* Created by L on 2017-05-31.
*/
public class Constructor {
public String name;
public int count; //自定义木有参数的构造器
//该构造器即默认构造器
public Constructor(){
//this.name="默认";
//this.count=23;
}
//main方法
public static void main(String[] args){
//使用不带参数的构造器来创建Constructor对象
Constructor constructor = new Constructor(); System.out.println(constructor.name);
System.out.println(constructor.count); }
}

运行main方法,将会打印

默认

23

第二个例子

    import org.junit.jupiter.api.Test;

    /**
* Created by L on 2017-05-31.
*/
public class Constructor {
public String name;
public int count; //自定义木有参数的构造器
public Constructor(){
//this.name="默认";
//this.count=23;
}
////自定义一个有一个参数的构造器
public Constructor(String name){
//初始化name
this.name=name;
}
public static void main(String[] args){
//使用不带参数的构造器来创建Constructor对象
//Constructor constructor = new Constructor();
//使用带一个参数的构造器来创建Constructor对象
Constructor constructor = new Constructor("一个参数"); System.out.println(constructor.name);
System.out.println(constructor.count); }
}

将会打印

一个参数

0

第三个例子

    package com.javatest.lang;

    import org.junit.jupiter.api.Test;

    /**
* Created by L on 2017-05-31.
*/
public class Constructor {
public String name;
public int count; //自定义木有参数的构造器
public Constructor(){
this.name="默认";
this.count=23;
}
////自定义一个有一个参数的构造器
public Constructor(String name){
//初始化name
this.name=name;
}
////自定义一个有两个参数的构造器
public Constructor(String name,int count){
//初始化这两个值
this.name=name;
this.count=count;
} public static void main(String[] args){
//使用不带参数的构造器来创建Constructor对象
//Constructor constructor = new Constructor();
//使用带一个参数的构造器来创建Constructor对象
//Constructor constructor = new Constructor("一个参数");
//使用带两个参数的构造器来创建Constructor对象
Constructor constructor = new Constructor("两个参数",80);
System.out.println(constructor.name);
System.out.println(constructor.count); }
}

打印出来结果是

两个参数

80

初始化块

学习构造器,还应该了解初始化块这个东西,初始化块的执行顺序在构造器之前,如果重复赋值,构造器的值将覆盖初始化块的内容。

初始化块有以下特点:

1.静态初始化块的优先级最高,也就是最先执行,并且仅在类第一次被加载时执行;

2.非静态初始化块和构造函数后执行,并且在每次生成对象时执行一次;

3.非静态初始化块的代码会在类构造函数之前执行。因此若要使用,应当养成把初始化块写在构造函数之前的习惯,便于调试;

4.静态初始化块既可以用于初始化静态成员变量,也可以执行初始化代码;

5.非静态初始化块可以针对多个重载构造函数进行代码复用。

所以看一下第四个例子

    package com.javatest.lang;

    import org.junit.jupiter.api.Test;

    /**
* Created by L on 2017-05-31.
*/
public class Constructor {
public String name;
public int count; //初始化块
{
this.name="初始化块";
this.count=51;
}
//自定义木有参数的构造器
public Constructor(){
this.name="默认";
this.count=23;
}
////自定义一个有一个参数的构造器
public Constructor(String name){
//初始化name
this.name=name;
}
////自定义一个有两个参数的构造器
public Constructor(String name,int count){
//初始化这两个值
this.name=name;
this.count=count;
} //public void testCon(){
// this.name="测试";
// this.count=14;
//} public static void main(String[] args){
//使用不带参数的构造器来创建Constructor对象
//Constructor constructor = new Constructor();
//使用带一个参数的构造器来创建Constructor对象
//Constructor constructor = new Constructor("一个参数");
//使用带两个参数的构造器来创建Constructor对象
Constructor constructor = new Constructor("两个参数",80);
//调用普通方法
//constructor.testCon();
System.out.println(constructor.name);
System.out.println(constructor.count); }
}

此时如果使用默认构造器来实例化constructor,将打印

默认

23

如果使用带一个参数的来实例化constructor,将打印

一个参数

51

如果使用带两个参数的来实例化constructor,将打印

两个参数

80

总结

总的来说,构造器的概念还是很好理解的,在初期,可以将其理解为实例化时会默认调用的方法,这个方法将会帮助我们完成类的实例化。动动手,敲几个例子,很好理解的,有什么问题可以给我留言,帮助我进步~

[java]java构造器 标签: java面向对象 2017-06-11 11:16 195人阅读 评论(12)的更多相关文章

  1. java面试和笔试大全 分类: 面试 2015-07-10 22:07 10人阅读 评论(0) 收藏

    2.String是最基本的数据类型吗? 基本数据类型包括byte.int.char.long.float.double.boolean和short. java.lang.String类是final类型 ...

  2. Java中的日期操作 分类: B1_JAVA 2015-02-16 17:55 6014人阅读 评论(0) 收藏

    在日志中常用的记录当前时间及程序运行时长的方法: public void inject(Path urlDir) throws Exception { SimpleDateFormat sdf = n ...

  3. [J2EE规范]JDBC简单例子 标签: 数据库j2eejdbcjava 2017-06-29 10:55 353人阅读 评论(12)

    JDBC是什么? JDBC是java数据库连接(Java Database Connectivity),它是用于java编程语言和数据库之间的数据库无关连接的标准Java API,就是说,JDBC是用 ...

  4. [Linux]环境配置之jdk的安装 标签: jdk服务器linux 2016-08-07 22:18 502人阅读 评论(21)

    这两天服务器崩了,所以需要重新配置环境,然后从头到尾配置了一遍,现在记录总结一下自己这两天的工作,首先是jdk的配置! 很多软件,需要jdk为基础,所以第一个装的就是jdk. 第一步,拷贝文件 首先将 ...

  5. OC基础:继承.初始化方法,便利构造器 分类: ios学习 OC 2015-06-16 19:27 84人阅读 评论(0) 收藏

    继承: 1.单向继承,一个类只能有一个父类,一个父类可以有多个子类. 2.单向继承,基类(根类)是OSObject 3.子类可以继承父类的属性和方法 当父类的方法不满足子类的需求时,子类可以重写父类的 ...

  6. 数字图像处理:基于MATLAB的车牌识别项目 标签: 图像处理matlab算法 2017-06-24 09:17 98人阅读 评论(0)

    学过了数字图像处理,就进行一个综合性强的小项目来巩固一下知识吧.前阵子编写调试了一套基于MATLAB的车牌识别的项目的代码.今天又重新改进了一下代码,识别的效果好一点了,也精简了一些代码.这里没有使用 ...

  7. 杭电acm刷题(3):1062,Text Reverse 标签: 杭电acm 2017-05-15 08:26 126人阅读 评论(0)

    Problem Description Ignatius likes to write words in reverse way. Given a single line of text which ...

  8. [运维]Dell R710 raid配置 标签: raid运维 2017-04-15 19:35 581人阅读 评论(16)

    Dell R系列的一些服务器,raid的配置都大同小异,公司大部分的服务器,都是Dell R710型号的,这个型号的raid界面配置起来还是很简单的,下面来跟随小编体验一下raid如何配置吧.ps:图 ...

  9. [ITOO]动态建库 标签: 库数据库mysql 2016-07-17 21:23 241人阅读 评论(2) 收

    最近一直在做权限系统的动态建库,动态建库,说白了就是在你点击"注册"按钮的时候,根据你输入的信息,来创建一个企业所需要的数据库的过程,因为现阶段并没有提供购买等功能,所以暂时咱们是 ...

随机推荐

  1. python jieba模块详解

    借鉴于 [jieba 模块文档] 用于自己学习和记录! jieba 模块是一个用于中文分词的模块 此模块支持三种分词模式 精确模式(试图将句子最精确的切开,适合文本分析) 全模式(把句子在所有可以成词 ...

  2. LeetCode387First Unique Character in a String字符串中第一个唯一字符

    给定一个字符串,找到它的第一个不重复的字符,并返回它的索引.如果不存在,则返回 -1. 案例: s = "leetcode" 返回 0. s = "loveleetcod ...

  3. lc13 Roman to Integer

    lc13 Roman to Integer 遇到那六种特殊情况分别-2,-20,-200, 按照罗马数字的规则,每种只可能出现一次.所以只需要考虑一次,用indexOf()即可判断是否出现这几种特殊情 ...

  4. 吴恩达《机器学习》课程总结(5)_logistic回归

    Q1分类问题 回归问题的输出可能是很大的数,而在分类问题中,比如二分类,希望输出的值是0或1,如何将回归输出的值转换成分类的输出0,1成为关键.注意logistics回归又称 逻辑回归,但他是分类问题 ...

  5. 分享非常漂亮的WPF界面框架源码及插件化实现原理

      在上文<分享一个非常漂亮的WPF界面框架>中我简单的介绍了一个界面框架,有朋友已经指出了,这个界面框架是基于ModernUI来实现的,在该文我将分享所有的源码,并详细描述如何基于Mod ...

  6. CentOS设置打开终端快捷键

  7. switch的练习

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  8. Hibernate-HQL-Criteria-查询优化

    1 查询总结 oid查询-get 对象属性导航查询 HQL Criteria 原生SQL 2 查询-HQL语法 2.1 基础语法 2.2 进阶语法 排序 条件 分页 聚合 投影 多表查询 SQL HQ ...

  9. jquery校验是否为空

    function lang(key) { mylang = { 'ls_input_myb': '请输入您的账户', 'ls_myb_email': '漫游币账户为邮箱地址', 'ls_login_p ...

  10. c++ 链接mysql:error LNK2019: 无法解析的外部符号

    使用VS2012编译项目报错如下: error LNK2019: 无法解析的外部符号 _mysql_real_connect@32,该符号在函数 _main 中被引用 error LNK2019: 无 ...