网站首页 > java教程 正文
“这里是云端源想IT,帮你轻松学IT”
嗨~ 今天的你过得还好吗?
关关难过关关过
长路漫漫亦灿灿
- 2023.08.18 -
前面我们学习了Java中类的创建以及成员变量和全局变量,你在写的时候有没有感觉给对象的成员变量一个一个的赋值太繁琐,那么有没有什么方法能一下子就把值赋好呢?当然有,用Java中的构造方法就能做到这一点。
一、构造方法的概念
构造方法,是一种特殊的方法,它是一个与类同名的方法。对象的创建就是通过构造方法来完成,其功能主要是完成对象的初始化。当类实例化一个对象时会自动调用构造方法。构造方法和其他方法一样也可以重载。
代码演示:
public class Data {
public int year;
public int month;
public int day;
//构造方法:
public Data(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
System.out.println("调用构造方法");
}
public void printDate() {
System.out.println(year + "-" + month + "-" + day);
}
public static void main(String[] args) {
//创建一个对象
Data data = new Data(2022,11,13);
data.printDate();
}
}
运行结果:
注意:构造方法的作用就是对对象中的成员进行初始化,并不负责给对象开辟空间。
我们说构造方法是用来初始化对象的,那么它是怎样去初始化的呢,回想我们创建对象的语法。例 : Car car= new Car();
我们可以看到new关键字右边的这一块 ,这其实就是调用了Car类的构造方法来创建此对象的。
构造方法的定义要求
- 构造方法的名称要和类名一致。
- 构造方法不允许有返回值类型声明。
当一个类中没有提供任何构造方法,系统默认提供一个无参无返回值的构造方法,就像这样:
Student() {
}
但如果类中显式地定义了一个或多个构造方法,则系统不再提供默认构造方法。
在一个类中,与类名相同的方法就是构造方法。每个类可以具有多个构造方法,但要求它们各自包含不同的方法参数,比如这样:
Student() {
System.out.println("这是自定义的一个没有参数的构造方法");
}
Student(String name) {
this.name = name;
System.out.println("这是自定义的带有一个参数的构造方法");
}
- 示例就定义了两个构造方法,分别是无参构造方法和有参构造方法。
- 如果在一个类中定义多个具有不同参数的同名方法,称作方法的重载。
- 这两个构造方法的名称都与类名相同,均为Student。在实例化该类时可以调用不同的构造方法进行初始化。
二、构造方法的特性
Java中构造方法有以下特性:
- 构造方法的名字必须与类名相同;
- 没有返回值类型,设置成void也不行;
- 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次;
- 构造方法可以重载;
- 如果用户没有显式定义构造方法,编译器就会默认生成一份构造方法,而且默认生成的构造方法一定是无参的;
- 构造方法中,可以通过this调用其他的构造方法来简化代码。
下面分别来举例说明
1、构造方法的名字必须与类名相同
因为如果构造方法的名字与类名不相同,JAVA的编译器就会将该方法归结为成员方法,而不会将其认定为构造方法,而构造方法是无返回值类型的,但是成员方法是必须有返回值类型,因此这就会导致编译通不过。
2、没有返回值类型,设置成void也不行
这就是JAVA中对构造方法的规定,我们遵守即可。
3、创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次(相当于每个人的出生,每个人只能出生一次)。
示例如下:
public class Data {
public int year;
public int month;
public int day;
//构造方法:
public Data(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
System.out.println("调用构造方法");
}
public void printDate() {
System.out.println(year + "-" + month + "-" + day);
}
public static void main(String[] args) {
//创建一个对象,并且在new对象的时候由编译器自动调用构造方法
Data data = new Data(2022,11,13);
data.printDate();
}
}
运行结果:
在运行结果中可以清晰地看到调用了Data中的构造方法 ,但是我们并没有在new出类后调用构造方法,这正验证了构造方法是在new对象时由编译器自动调用。
4、构造方法可以重载(用户可以根据自己的需求提供不同参数的构造方法)。
public class Data {
public int year;
public int month;
public int day;
//不带参数的构造方法
public Data() {
this.year = 2022;
this.month = 11;
this.day = 13;
}
//带有三个参数的构造方法:
public Data(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
System.out.println("调用构造方法");
}
public void printDate() {
System.out.println(year + "-" + month + "-" + day);
}
public static void main(String[] args) {
//创建两个个对象
Data data = new Data(2022,11,13);
Data data1 = new Data();
data.printDate();
}
}
上述代码中的两个构造方法名字相同,参数列表不同,因此构成了方法重载。
5、如果用户没有显式定义构造方法,编译器就会默认生成一份构造方法,而且默认生成的构造方法一定是无参的。
public class Data {
public int year;
public int month;
public int day;
//没有显式定义构造方法
public void printDate() {
System.out.println(year + "-" + month + "-" + day);
}
public static void main(String[] args) {
//创建对象
Data data = new Data();
data.printDate();
}
}
上述代码中没有显式定义构造方法,但是依然可以new出对象,这就验证了编译器会默认给我们生成一个不带参数的构造方法。
一旦用户定义了一个构造方法,编译器就不会自动生成构造方法。
public class Data {
public int year;
public int month;
public int day;
//定义构造方法:
public Data(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
public void printDate() {
System.out.println(year + "-" + month + "-" + day);
}
public static void main(String[] args) {
//创建对象
//这里如果编译器会自动生成,则生成的构造方法一定是无参的
//则此处创建对象就可以通过编译
//但实际情况是:编译报错
Data data = new Data();
data.printDate();
}
}
6、 构造方法中,可以通过this调用其他的构造方法来简化代码。
咱们之前说了,同一个类中可以同时有多个构造函数,通过this()还可以在一个构造函数里调用另一个构造函数。
class Cat {
String name;
int age;
Cat() {
System.out.println("这是自定义的一个不带参数的构造函数");
}
public Cat(String name, int age) {
this(); // 调用另一个不带参数的构造方法
this.name = name;
this.age = age;
System.out.println(this.name + this.age + "岁了");
System.out.println("这是自定义的一个带两个参数的构造函数");
}
}
public class TestDemo2 {
public static void main(String[] args) {
Cat cat = new Cat("小花", 3);
}
}
从输出结果可以看出通过this(),我们成功在一个构造方法中调用另一个不带参数的构造方法。
但有几个问题需要我们注意一下:
- this( ) 不能在普通方法中使用,只能写在构造方法中。
- 在构造方法中使用时,必须是第一条语句。
另外,再补充一些小细节:
很多小伙伴可能不理解,为什么要通过这种方式来调用构造方法呢?我们在上面调用Cat类中一个不带参数的构造方法时,难道不能直接写一个Cat();来调用吗?
原因是:在Java语言中,一个类的构造方法与类名相同。但是,一个类当中也可以定义一个与类名相同的”普通方法”,换句话说就是:并不是只有构造方法与类名相同,”普通方法”也可以取和类相同的名称(只不过全世界的程序员都不会这么干)。
那么,在这种情况下,编译器如何区分这个方法是”普通方法”还是”构造方法”呢?很简单,”普通方法”的名称前面必须定义返回值类型,而”构造方法”的名称前面则没有返回值类型的定义。这样,编译器就能够分得清哪个是”构造方法”,哪个是”和类同名的普通方法”。
定义的时候分得清,但是在调用的时候,都是通过方法名来调用的,这时如何分得清代码中哪一句调用的是”构造方法”, 哪一句调用的是”和类同名的普通方法”呢?为了解决这个问题,Java语言规定,在本类中调用构造方法的时候,需要通过”this(参数)”的方式来调用。
以上就是Java中构造方法的概念及特性的介绍,实际开发中我们可以根据需求来灵活设计构造方法,来创建不同的对象,希望对你的学习有所帮助。
我们下期再见!
END
文案编辑|云端学长
文案配图|云端学长
内容由:云端源想分享
猜你喜欢
- 2024-11-14 Java 19 的结构化并发,一种新的多线程编程模式
- 2024-11-14 构建高效Java项目结构:以业务为中心的模块化设计实践
- 2024-11-14 JAVA虚拟机(JVM)一:了解JAVA体系结构
- 2024-11-14 Java构建树结构的公共方法(java构造树结构)
- 2024-11-14 Java构造器:类的生命之源(java构造器是什么)
- 2024-11-14 Java三大结构是什么?Java程序员进阶知识点
- 2024-11-14 Java构造方法之间调用(java 构造方法调用构造方法)
- 2024-11-14 Java大牛一文让你秒懂构造方法和无参构造方法
- 2024-11-14 Java默认构造方法(java默认构造方法里面super)
- 2024-11-14 Java中的构造器应该怎么使用?(java构造器调用构造器)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)