构造方法
[toc]
一 构造方法概念
构造方法是类的一种特殊方法,用来初始化类的一个新的对象,在创建对象(new 运算符)之后自动调用。和前面学习的方法不一样。方法是对象的行为。构造方法是为创建对象时初始化用的。
之前学习的Book类,在每次创建之后,都要赋值书的名字,作者等信息,看起来比较麻烦。如果我们在调用new的时候,就将值赋给成员变量,代码会变得很简洁清爽。
Java中的每个类都有一个默认的构造方法,并且可以有一个以上的构造方法。默认的构造方法是隐藏的,由编译器生成。
Java 构造方法有以下特点:
- 方法名必须与类名相同
- 可以有 0 个、1 个或多个参数
- 没有任何返回值,包括 void
- 默认返回类型就是对象类型本身
- 只能与 new 运算符结合使用
这里Java语言对构造方法的定义就是区别于一般的方法,所以没有返回值,不能用return,也没有void。
二 构造方法语法
class class_name {
public class_name(){} // 默认无参构造方法
public ciass_name(paramList ...){} // 定义有参数的构造方法
…
// 类主体
}
在一个类中,与类名相同的方法,且没有返回值也没有被void修饰的就是构造方法。每个类可以具有多个构造方法,但要求它们各自包含不同的方法参数。
三 构造方法使用
public class BookConstructor {
String name; //书名,类型为字符串String,默认值为null
String author; //作者,类型为字符串String,默认值为null
int rank; //排名,类型为整型int,默认值为0
String brief;//书名简介 , 类型为字符串String
int totalRead;//本书总阅读人数, 类型为整型 int, 默认值为0
int totalComment; //本书总评价数, 类型为整型 int
double score; //本书平均评分 ,类型为小数, double类型。
public BookConstructor(){
System.out.println("无参构造方法被调用。");
score = 100.00;//设置评分默认值为100分。
System.out.println("构造方法里可以对特殊变量赋值。");
}
public BookConstructor(String nameArg, String authorArg){
System.out.println("两个参数的有参构造方法被调用。");
name = nameArg;
author = authorArg;
}
public BookConstructor(String nameArg, String authorArg, int rankArg){
System.out.println("三个参数的有参构造方法被调用。");
name = nameArg;
author = authorArg;
rank = rankArg;
}
public static void main(String[] args) {
BookConstructor bookEmpty = new BookConstructor();
System.out.println("默认构造方法,给书评分赋值初始化为:"+bookEmpty.score);
//从数据库或者其它地方获取到的数据,按照业务设计需要,给对象初始化赋值。
BookConstructor bookHongLouMeng = new BookConstructor("红楼梦","曹雪芹");
System.out.println("两个参数的构造方法,赋值初始化。书名:"+bookHongLouMeng.name+",作者:"+bookHongLouMeng.author);
BookConstructor bookWeiCheng = new BookConstructor("围城","钱钟书",3);
System.out.println("三个参数的构造方法,赋值初始化。书名:"+bookWeiCheng.name+",作者:"+bookWeiCheng.author+",排名:"+bookWeiCheng.rank);
}
}
当我们不需要在创建对象的时候初始化值,可以不写构造方法,使用默认的构造方法,默认的构造方法无参数,方法体为空。也是按照业务需求决定。
当定义了有参构造方法后,如果不写无参构造方法,那么默认的无参构造方法将失效。
四 构造方法返回当前类的对象
类的构造方法也可以理解成是有返回值的,当使用 new 关键字来调用构造方法时,构造方法返回该类的实例,可以把这个类的实例当成构造器的返回值,因此构造器的返回值类型总是当前类,无须定义返回值类型。但必须注意不要在构造方法里使用 return 来返回当前类的对象,因为构造方法的返回值是隐式的。
五 关键字this
this 关键字是Java常用的关键字,可用于任何实例方法内指向当前对象,使用该对象的成员变量,或者在同一个类中的构造方法中调用别的构造方法。或者当作对象的引用传递。
5.1 this.属性名
在构造方法的使用中, 我们构造方法参数是这样的: (String nameArg, String authorArg, int rankArg) ,看起来很别扭。有了this关键字后,我们可以让方法参数和属性名相同。
public class BookThis {
String name; //书名,类型为字符串String,默认值为null
String author; //作者,类型为字符串String,默认值为null
int rank; //排名,类型为整型int,默认值为0
String brief;//书名简介 , 类型为字符串String
int totalRead;//本书总阅读人数, 类型为整型 int, 默认值为0
int totalComment; //本书总评价数, 类型为整型 int
double score; //本书平均评分 ,类型为小数, double类型。
public BookThis(String name,String author,double score){
this.name = name; //等号左边的 this.name 是指当前对象具有的变量 name,等号右边的 name 表示参数传递过来的数值。
this.author = author;
this.score = score;
}
public static void main(String[] args) {
//在构造方法里面使用this关键字,代码变得简洁,开发工具也可以快速提示输入。
BookThis book = new BookThis("经济学原理第七版","曼昆",9.9);
}
}
大部分时候,普通方法访问其他方法、成员变量时无须使用 this 前缀,但如果方法里有个局部变量和成员变量同名,但程序又需要在该方法里访问这个被覆盖的成员变量,则必须使用 this 前缀。以区分类的属性和方法中的参数。
5.2 this( )访问构造方法
public class BookThis {
String name; //书名,类型为字符串String,默认值为null
String author; //作者,类型为字符串String,默认值为null
int rank; //排名,类型为整型int,默认值为0
String brief;//书名简介 , 类型为字符串String
int totalRead;//本书总阅读人数, 类型为整型 int, 默认值为0
int totalComment; //本书总评价数, 类型为整型 int
double score; //本书平均评分 ,类型为小数, double类型。
public BookThis(String name,String author,double score){
this.name = name;
this.author = author;
this.score = score;
}
public BookThis(String name){
// System.out.println("打开该注释,会报错,this()构造方法调用必须在第一行");
this(name,null,0.0);
System.out.println("构造方法执行结束。");
}
public static void main(String[] args) {
//this(),调用该类的其它构造方法,必须在第一行。
BookThis bookThis = new BookThis("经济学原理第七版");
}
}
this()用来访问本类的构造方法(构造方法是类的一种特殊方法,方法名称和类名相同,没有返回值。
this()不能在普通方法中使用,只能写在构造方法中。
5.3 this.方法名和参数传递
public class BookThisReference {
String name; //书名,类型为字符串String,默认值为null
String author; //作者,类型为字符串String,默认值为null
int rank; //排名,类型为整型int,默认值为0
String brief;//书名简介 , 类型为字符串String
int totalRead;//本书总阅读人数, 类型为整型 int, 默认值为0
int totalComment; //本书总评价数, 类型为整型 int
double score; //本书平均评分 ,类型为小数, double类型。
public BookThisReference(String name, String author, double score, int rank){
this.name = name;
this.author = author;
this.score = score;
this.rank = rank;
this.printInfo();//这里添加this没必要。确实可以这么用。
}
public void printInfo(){
printBook(this);//该方法所在的对象this,作为printBook的参数传递进去。
}
public void printBook(BookThisReference book){
System.out.println("书名:"+book.name+",作者:"+book.author+",评分:"+book.score);
}
public static void main(String[] args) {
//this可以将自己作为对象引用进行参数传递。
BookThisReference book = new BookThisReference("经济学原理第七版","曼昆",9.9,1);
System.out.println("初始化调用该方法后,再次调用,打印信息。");
book.printInfo();
}
}
文章和项目开源地址
一起学习,最简单易懂的Java零基础入门,答疑解惑,关注点赞github
开源:https://github.com/BradYan/easy-java