文档章节

构造函数

一真的鱼
 一真的鱼
发布于 2017/02/27 05:30
字数 1918
阅读 0
收藏 0
点赞 0
评论 0

 1.构造函数的概念

  很多java新手谈到构造函数就会犯晕,我们先来看看什么是构造函数。

  首先,构造函数是函数的一种特殊形式,特殊在哪里?构造函数中不需要定义返回类型(void是无需返回值的意思,请注意区分两者),且构造函数的名称与所在的类名完全一致,其余的与函数的特性相同,可以带有参数列表,可以存在函数的重载现象。

  2.构造函数的格式

  了解了构造函数的基本概念,现在来写一个构造函数,希望大家可以了解、记忆其格式,通过实例发现其与普通函数的不同之处。

01  public class Demo{

02     private int num=0;

03     //无参构造函数

04     Demo()

05    {

06      System.out.println("constractor_run");

07    }

08     //有参构造函数

09     Demo(int num)

10    {

11      System.out.println("constractor_args_run");

12    }

13     //普通成员函数

14    public void demoFunction()

15    {

16      System.out.println("function_run");

17    }

18  }

  在这里要说明一点,如果在类中我们不声明构造函数,JVM会帮我们默认生成一个空参数的构造函数;如果在类中我们声明了带参数列表的构造函数,JVM就不会帮我们默认生成一个空参数的构造函数,我们想要使用空参数的构造函数就必须自己去显式的声明一个空参的构造函数。

  3.构造函数的作用

  通过开头的介绍,构造函数的轮廓已经渐渐清晰,那么为什么会有构造函数呢?构造函数有什么作用?构造函数是面向对象编程思想所需求的,它的主要作用有以下两个:

    1)  创建对象。任何一个对象创建时,都需要初始化才能使用,所以任何类想要创建实例对象就必须具有构造函数。

    2)  对象初始化。构造函数可以对对象进行初始化,并且是给与之格式(参数列表)相符合的对象初始化,是具有一定针对性的初始化函数。

  4.构造函数与普通函数的区别

  下面来详细的分析下构造函数与普通函数的区别,通过两者的一个对比,希望可以加深对构造函数的概念的理解。

    1)  格式不同:

      构造函数不存在返回类型,函数名与所在类的类名一致;

      普通函数有返回类型,函数名可以根据需求进行命名。

    2)调用时期不同

      构造函数在类的对象创建时就运行;

      普通函数在对象调用时才会执行。

    3)执行次数不同

      一个对象创建后,其构造函数只执行一次,就是创建时执行;

      一个对象创建后,其普通函数可以执行多次,取决于对象的调用次数。

  5.构造函数的使用场景

    分析了那么多构造函数的信息,那么什么时候使用构造函数呢?既然构造函数是对新对象进行初始化,那么当开发中分析事物的时候,发现事物一出现就具备了某些特征时,就可以将其定义在构造函数中,这样方便快捷,也符合面向对象的编程思想。

  6.构造函数在继承中的特点

  在继承中,子类创建的对象可以调用父类的公共方法和属性,那么子类会不会调用父类的构造函数呢?子类的构造函数与父类的构造函数有什么关系?子类的构造函数需要注意些什么问题呢?下面来解答这三个问题。

    1)  子类会不会调用父类的函数?

      子类继承父类,子类对象初始化时父类的构造函数也会执行,因为子类需要使用父类中的属性,子类需要知道是如何初始化的,所以子类初始化必然会调用父类的构造函数(除非父类没有属性,那么这个类的描述也太差了点,或者没有必要去创建这个类了)。

    2)  子类的构造函数与父类的构造函数有什么关系?

      子类的构造函数中默认的第一行有一条隐式语句super(),该语句会访问父类中的空参数构造函数,除非父类中没有空参数的构造函数,那么子类构造函数的第一行必须显式调用父类的构造函数,即super(int x,…) 。

    3)  子类的构造函数需要注意些什么问题呢?

      子类的构造函数中,super()语句代表调用了父类的构造函数;this()语句代表调用了子类自身的构造函数。需要注意的是,如果这两条语句显式写出来必须放在构造方法的第一行,而且这两条语句不能共存,一个构造函数中的第一行要么是this()要么是super()。

      为什么在第一行?因为需要首先进行初始化。

      为什么不能共存?因为this()代表的本类的其他构造函数,也会去调用super(),出现了this()就没有必要再出现super()了,重复调用没有意义。换言之,子类中至少有一个构造函数的开头为super(),当然可以隐式存在;也就是说至少有一个构造函数的开头不是this()。

  7.构造函数的扩展

  以上的六条已经讲构造函数的概念、特点、使用等问题介绍的比较清楚,下面来介绍几点与构造函数相关的扩展性的小知识。

    1)  所有的类都有构造函数么?构造函数可以被私有化么?

      既然构造函数用于创建对象并且初始化对象,那么当一个类不需要创建对象时,就不需要定义构造函数,但是在java中,所有的类都拥有构造函数,只是有些类的构造函数对开发人员来说是隐藏不可见的,这一点与我们的预期并不相同,不过换个角度这也很好理解,因为java是面向对象的,我们创建类的目的就是为了创建对象或者创建其子类对象,所以没有构造函数的类(无法创建对象的类)并没有什么意义。

      而对于第二个问题,一个类不想要外界创建其对象时,就可以将其构造函数私有化,本类中提供返回对象的方法,并且多数情况下提供的对象是唯一的,单例设计模式就是一个很好的例子,而当我们开发中需要保证对象唯一性的时候,往往就采取这种做法。

    2)  构造代码块与构造函数有什么相似和不同?

      构造代码块用一对“{}”表示,代码块位置没有具体的要求,但必须与类的成员同等级别,在括号的区域内,可以对所有该类的对象进行初始化,也就是说该类对象创建时都会执行到该代码块,并且其优先于构造函数执行。构造函数如前面提到的是具有针对性的,而构造代码块是作用于所有本类对象的。

本文转载自:http://www.cnblogs.com/itmlt1029/p/4765147.html

共有 人打赏支持
一真的鱼
粉丝 1
博文 38
码字总数 21290
作品 0
武汉

暂无相关文章

005. 深入JVM学习—Java堆内存参数调整

1. JVM整体内存调整图解(调优关键) 实际上每一块子内存区域都会存在一部分可变伸缩区域,其基本流程:如果内存空间不足,则在可变的范围之内扩大内存空间,当一段时间之后,内存空间不紧张...

影狼 ⋅ 19分钟前 ⋅ 0

内存障碍: 软件黑客的硬件视图

此文为笔者近日有幸看到的一则关于计算机底层内存障碍的学术论文,并翻译(机译)而来[自认为翻译的还行],若读者想要英文原版的论文话,给我留言,我发给你。 内存障碍: 软件黑客的硬件视图...

Romane ⋅ 52分钟前 ⋅ 0

SpringCloud 微服务 (七) 服务通信 Feign

壹 继续第(六)篇RestTemplate篇 做到现在,本机上已经有注册中心: eureka, 服务:client、order、product 继续在order中实现通信向product服务,使用Feign方式 下面记录学习和遇到的问题 贰 or...

___大侠 ⋅ 今天 ⋅ 0

gitee、github上issue标签方案

目录 [TOC] issue生命周期 st=>start: 开始e=>end: 结束op0=>operation: 新建issueop1=>operation: 评审issueop2=>operation: 任务负责人执行任务cond1=>condition: 是否通过?op3=>o......

lovewinner ⋅ 今天 ⋅ 0

浅谈mysql的索引设计原则以及常见索引的区别

索引定义:是一个单独的,存储在磁盘上的数据库结构,其包含着对数据表里所有记录的引用指针. 数据库索引的设计原则: 为了使索引的使用效率更高,在创建索引时,必须考虑在哪些字段上创建索...

屌丝男神 ⋅ 今天 ⋅ 0

String,StringBuilder,StringBuffer三者的区别

这三个类之间的区别主要是在两个方面,即运行速度和线程安全这两方面。 首先说运行速度,或者说是, 1.执行速度 在这方面运行速度快慢为:StringBuilder(线程不安全,可变) > StringBuffer...

时刻在奔跑 ⋅ 今天 ⋅ 0

java以太坊开发 - web3j使用钱包进行转账

首先载入钱包,然后利用账户凭证操作受控交易Transfer进行转账: Web3j web3 = Web3j.build(new HttpService()); // defaults to http://localhost:8545/Credentials credentials = Wallet......

以太坊教程 ⋅ 今天 ⋅ 0

Oracle全文检索配置与实践

Oracle全文检索配置与实践

微小宝 ⋅ 今天 ⋅ 0

mysql的分区和分表

1,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一...

梦梦阁 ⋅ 今天 ⋅ 0

exception.ZuulException: Forwarding error

错误日志 com.netflix.zuul.exception.ZuulException: Forwarding error Caused by: com.netflix.hystrix.exception.HystrixRuntimeException: xxx timed-out and no fallback available. Ca......

jack_peng ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部