作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!

在方法与数据成员中,我们提到,Java中的对象在创建的时候会初始化(initialization)。初始化时,对象的数据成员被赋予初始值。我们可以显式初始化。如果我们没有给数据成员赋予初始值,数据成员会根据其类型采用默认初始值。

显式初始化要求我们在写程序时就确定初始值,这有时很不方便。我们可以使用构造器(constructor)来初始化对象。构造器可以初始化数据成员,还可以规定特定的操作。这些操作会在创建对象时自动执行。

定义构造器

构造器是一个方法。像普通方法一样,我们在类中定义构造器。构造器有如下基本特征:

  1. 构造器的名字和类的名字相同
  2. 构造器没有返回值

我们定义Human类的构造器:

public class Test
{public static void main(String[] args){Human aPerson = new Human(160);System.out.println(aPerson.getHeight());}}class Human
{    /**     * constructor     */    Human(int h){this.height = h;        System.out.println("I'm born");}/*** accessor*/int getHeight(){return this.height;}int height;
}

上面的程序会打印

I'm born
160

构造器可以像普通方法一样接收参数列表。这里,构造器Human()接收一个整数作为参数。在方法的主体中,我们将该整数参数赋予给数据成员height。构造器在对象创建时做了两件事:

  • 为数据成员提供初始值 this.height = h;
  • 执行特定的初始操作 System.out.println("I'm born");

这样,我们就可以在调用构造器时,灵活的设定初始值,不用像显示初始化那样拘束。

构造器是如何被调用的呢?我们在创建类的时候,采用的都是new Human()的方式。实际上,我们就是在调用Human类的构造器。当我们没有定义该方法时,Java会提供一个空白的构造器,以便使用new的时候调用。但当我们定义了构造器时,在创建对象时,Java会调用定义了的构造器。在调用时,我们提供了一个参数160。从最后的运行结果中也可以看到,对象的height确实被初始化为160。

初始化方法的优先级

在方法与数据成员中,我们可以看到,如果我们提供显式初始值,那么数据成员就会采用显式初始值,而不是默认初始值。但如果我们既提供显式初始值,又在构造器初始化同一数据成员,最终的初始值将由构造器决定。比如下面的例子:

public class Test
{public static void main(String[] args){Human aPerson = new Human(160);System.out.println(aPerson.getHeight());}}class Human
{    /**     * constructor     */Human(int h){this.height = h; }/*** accessor*/int getHeight(){return this.height;}int height=170; // explicit initialization
}

运行结果为:

160

对象最终的初始化值与构建方法中的值一致。因此:

构建方法 > 显式初始值 > 默认初始值

(事实上,所谓的优先级与初始化时的执行顺序有关,我将在以后深入这一点)

方法重载

一个类中可以定义不止一个构造器,比如:

public class Test
{public static void main(String[] args){Human neZha   = new Human(150, "shit");System.out.println(neZha.getHeight()); }}class Human
{/*** constructor 1*/Human(int h){this.height = h;System.out.println("I'm born");}/*** constructor 2*/Human(int h, String s){this.height = h;System.out.println("Ne Zha: I'm born, " + s);}/*** accessor*/int getHeight(){return this.height;}int height;
}

运行结果:

Ne Zha: I'm born, shit
150

上面定义了两个构造器,名字都是Human。两个构造器有不同的参数列表。

在使用new创建对象时,Java会根据提供的参数来决定构建哪一个构造器。比如在构建neZha时,我们提供了两个参数: 整数150和字符串"shit",这对应第二个构建方法的参数列表,所以Java会调用第二个构建方法。

在Java中,Java会同时根据方法名和参数列表来决定所要调用的方法,这叫做方法重载(method overloading)。构建方法可以进行重载,普通方法也可以重载,比如下面的breath()方法:

public class Test
{public static void main(String[] args){Human aPerson = new Human();aPerson.breath(10);}}class Human
{/*** breath() 1*/void breath(){System.out.println("hu...hu...");}/*** breath() 2*/void breath(int rep){int i;for(i = 0; i < rep; i++) {System.out.println("lu...lu...");}}int height;
}

运行结果:

lu...lu...
lu...lu...
lu...lu...
lu...lu...
lu...lu...
lu...lu...
lu...lu...
lu...lu...
lu...lu...
lu...lu...

可以看到,由于在调用的时候提供了一个参数: 整数10,所以调用的是参数列表与之相符的第二个breath()方法。

总结

constructor特征: 与类同名,无返回值

constructor目的: 初始化,初始操作

方法重载: 方法名 + 参数列表 -> 实际调用哪一个方法

欢迎继续阅读“Java快速教程”系列文章

转载于:https://www.cnblogs.com/wvqusrtg/p/4980889.html

Java基础03 构造器与方法重载相关推荐

  1. [JAVA基础] 了解构造器Constructor———你真的会用构造器吗?

    引言 相信大家对于java里的构造器应该都是有了解的,这次我们来了解一些构造器的不同使用方式,了解构造器的调用顺序,最后可以灵活的在各种情况下定义使用构造器,进一步优化我们的代码: 构造器简介 还是简 ...

  2. 【重难点】【Java基础 03】hashCode() 和 equals()、代理模式

    [重难点][Java基础 03]重写hashCode() 和equals(). 文章目录 [重难点][Java基础 03]重写hashCode() 和equals(). 一.hashCode() 和 ...

  3. 学习-Java继承和多态之方法重载

    第1关:学习-Java继承和多态之方法重载 任务描述 相关知识 编程要求 测试说明 任务描述 本关任务:使用重载方法为 Student 类创建三个构造方法. 相关知识 Java 中重载是指一个类中可以 ...

  4. java基础 ArrayList集合基本方法演示

    java基础 ArrayList集合基本方法演示 import java.util.ArrayList; import java.util.Iterator;public class ArrayLis ...

  5. java关于重写正确,在Java中,以下关于方法重载和方法重写描述正确的是( )

    在Java中,以下关于方法重载和方法重写描述正确的是( ) 答:方法重写的返回值类型必须相同或相容.(或是其子类) 对乙酰氨基酚临床用途是抗炎抗风湿作用 答:错 观念艺术是哲学的反思,传统的理论可以对 ...

  6. java构造方法可以重载吗_Java基础教程之构造器与方法重载

    在方法与数据成员中,我们提到,Java中的对象在创建的时候会初始化(initialization).初始化时,对象的数据成员被赋予初始值.我们可以显式初始化.如果我们没有给数据成员赋予初始值,数据成员 ...

  7. JAVA基础语法:函数(方法)、类和对象

    文章目录 函数 static修饰符 类和对象 了解其他JAVA 常用API和算法点这里 >> https://blog.csdn.net/GD_ONE/article/details/10 ...

  8. java基础03(基本语法)

    学习笔记--Java基础 JAVA基本语法01 关键字 保留字 标识符 变量 Java基本语法02 基本数据类型之间的运算规则 String类型变量的使用 Java基本语法03-进制转换(了解) JA ...

  9. Java基础系列(一)—— 重载(Overload)和重写(Override)

    文章目录 一.方法签名 二.方法重载(Overload) 2.1 方法同名且参数列表相同,但是返回值不同? 2.2 方法同名,但是参数列表和返回值不同? 2.3 方法同名且参数列表相同,但是抛出异常不 ...

最新文章

  1. 从GPT-3到DETR,一起来盘点2020有哪些突破?
  2. Node_MongoDB
  3. Winform中设置ZedGraph因设置小刻度导致的竖直虚线显示过多
  4. Zookeeper入门总结
  5. 对+=赋值运算符的认识
  6. java jxl.jar_jxl.jar官方下载-jxl.jar(java操作excel) 免费版 - 河东下载站
  7. Pycharm安装chardet模块
  8. Win10 打开图片,提示文件系统错误(-2147219196)
  9. 【重磅】云栖社区2017年度内容特辑
  10. Ubuntu解决文件带锁问题
  11. c++中“箭头(-)”和“点号(.)”操作符的区别 .
  12. D2D 学习笔记第一课 初始化D2D 画一个矩形
  13. 使用binlog备份恢复myqsl数据
  14. 【数据增强】用cv2旋转图像并自定义填充背景颜色(主要用到cv2.getRotationMatrix2D 和 cv2.warpAffine)
  15. python数据分析面试题_面试题——Python数据分析与应用(补充:简答)
  16. LeetCode 309. 最佳买卖股票时机含冷冻期 | Python
  17. python画风向杆_matplotlibquiver画风速风向
  18. 什么事项可在劳动合同中约定
  19. H3C MSR3600 dot1x认证问题
  20. 基于xDSL宽带网络测试系统的TL1通信协议设计与实现

热门文章

  1. 使用代理下载android系统源码和SDK
  2. STM32F103ZE单片机在WWDG窗口看门狗的EWI中断中喂狗导致系统复位的原因及解决办法(中断函数重入问题)
  3. MySQL探秘(三):InnoDB的内存结构和特性(可靠性和持久性)
  4. C语言内存字节对齐小结
  5. [NOTE] Linux环境变量
  6. 记录之关于tensoflow中使用Adam优化算法导致模型保存时参数的变化的记录
  7. c++ primer 5th p289页练习题自己的解答程序
  8. matlab单边衰减正弦信号,指数衰减正弦信号
  9. python基础开发环境_Python基础教程,第一讲,开发环境搭建
  10. TCP协议连接过程详解