Java基础03 构造器与方法重载
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!
在方法与数据成员中,我们提到,Java中的对象在创建的时候会初始化(initialization)。初始化时,对象的数据成员被赋予初始值。我们可以显式初始化。如果我们没有给数据成员赋予初始值,数据成员会根据其类型采用默认初始值。
显式初始化要求我们在写程序时就确定初始值,这有时很不方便。我们可以使用构造器(constructor)来初始化对象。构造器可以初始化数据成员,还可以规定特定的操作。这些操作会在创建对象时自动执行。
定义构造器
构造器是一个方法。像普通方法一样,我们在类中定义构造器。构造器有如下基本特征:
- 构造器的名字和类的名字相同
- 构造器没有返回值
我们定义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 构造器与方法重载相关推荐
- [JAVA基础] 了解构造器Constructor———你真的会用构造器吗?
引言 相信大家对于java里的构造器应该都是有了解的,这次我们来了解一些构造器的不同使用方式,了解构造器的调用顺序,最后可以灵活的在各种情况下定义使用构造器,进一步优化我们的代码: 构造器简介 还是简 ...
- 【重难点】【Java基础 03】hashCode() 和 equals()、代理模式
[重难点][Java基础 03]重写hashCode() 和equals(). 文章目录 [重难点][Java基础 03]重写hashCode() 和equals(). 一.hashCode() 和 ...
- 学习-Java继承和多态之方法重载
第1关:学习-Java继承和多态之方法重载 任务描述 相关知识 编程要求 测试说明 任务描述 本关任务:使用重载方法为 Student 类创建三个构造方法. 相关知识 Java 中重载是指一个类中可以 ...
- java基础 ArrayList集合基本方法演示
java基础 ArrayList集合基本方法演示 import java.util.ArrayList; import java.util.Iterator;public class ArrayLis ...
- java关于重写正确,在Java中,以下关于方法重载和方法重写描述正确的是( )
在Java中,以下关于方法重载和方法重写描述正确的是( ) 答:方法重写的返回值类型必须相同或相容.(或是其子类) 对乙酰氨基酚临床用途是抗炎抗风湿作用 答:错 观念艺术是哲学的反思,传统的理论可以对 ...
- java构造方法可以重载吗_Java基础教程之构造器与方法重载
在方法与数据成员中,我们提到,Java中的对象在创建的时候会初始化(initialization).初始化时,对象的数据成员被赋予初始值.我们可以显式初始化.如果我们没有给数据成员赋予初始值,数据成员 ...
- JAVA基础语法:函数(方法)、类和对象
文章目录 函数 static修饰符 类和对象 了解其他JAVA 常用API和算法点这里 >> https://blog.csdn.net/GD_ONE/article/details/10 ...
- java基础03(基本语法)
学习笔记--Java基础 JAVA基本语法01 关键字 保留字 标识符 变量 Java基本语法02 基本数据类型之间的运算规则 String类型变量的使用 Java基本语法03-进制转换(了解) JA ...
- Java基础系列(一)—— 重载(Overload)和重写(Override)
文章目录 一.方法签名 二.方法重载(Overload) 2.1 方法同名且参数列表相同,但是返回值不同? 2.2 方法同名,但是参数列表和返回值不同? 2.3 方法同名且参数列表相同,但是抛出异常不 ...
最新文章
- 从GPT-3到DETR,一起来盘点2020有哪些突破?
- Node_MongoDB
- Winform中设置ZedGraph因设置小刻度导致的竖直虚线显示过多
- Zookeeper入门总结
- 对+=赋值运算符的认识
- java jxl.jar_jxl.jar官方下载-jxl.jar(java操作excel) 免费版 - 河东下载站
- Pycharm安装chardet模块
- Win10 打开图片,提示文件系统错误(-2147219196)
- 【重磅】云栖社区2017年度内容特辑
- Ubuntu解决文件带锁问题
- c++中“箭头(-)”和“点号(.)”操作符的区别 .
- D2D 学习笔记第一课 初始化D2D 画一个矩形
- 使用binlog备份恢复myqsl数据
- 【数据增强】用cv2旋转图像并自定义填充背景颜色(主要用到cv2.getRotationMatrix2D 和 cv2.warpAffine)
- python数据分析面试题_面试题——Python数据分析与应用(补充:简答)
- LeetCode 309. 最佳买卖股票时机含冷冻期 | Python
- python画风向杆_matplotlibquiver画风速风向
- 什么事项可在劳动合同中约定
- H3C MSR3600 dot1x认证问题
- 基于xDSL宽带网络测试系统的TL1通信协议设计与实现
热门文章
- 使用代理下载android系统源码和SDK
- STM32F103ZE单片机在WWDG窗口看门狗的EWI中断中喂狗导致系统复位的原因及解决办法(中断函数重入问题)
- MySQL探秘(三):InnoDB的内存结构和特性(可靠性和持久性)
- C语言内存字节对齐小结
- [NOTE] Linux环境变量
- 记录之关于tensoflow中使用Adam优化算法导致模型保存时参数的变化的记录
- c++ primer 5th p289页练习题自己的解答程序
- matlab单边衰减正弦信号,指数衰减正弦信号
- python基础开发环境_Python基础教程,第一讲,开发环境搭建
- TCP协议连接过程详解