本章目标
- 掌握构造方法的概念及调用时机
- 掌握构造方法的重载
- 掌握匿名对象的使用
1、具体内容
1.1、什么叫构造方法?
只要一有对象实例化,则就会调用构造方法。
声明一个构造方法
class Person{
public Person(){ // 声明构造方法
System.out.println("一个新的Person对象产生。") ;
}
};
public class ConsDemo01{
public static void main(String args[]){
System.out.println("声明对象:Person per = null ;") ;
Person per = null ; // 声明对象时并不去调用构造方法
System.out.println("实例化对象:per = new Person() ;") ;
per = new Person() ;//实例化对象
}
};
输出结果:
声明对象:Person per = null ;
实例化对象:per = new Person() ;
一个新的Person对象产生。
大概了解了构造方法之后,这时候又会有一个新问题产生:之前在编写类的时候并没有定义构造方法,为什么也可以执行呢?
这就属于Java的操作机制,如果一个类没有明确的声明一个构造方法,则会自动生成一个无参的、什么都不做的构造方法,供用户使用、就类似于以下形式:
class Person{
public Person(){ // 如果没有编写构造方法,则会自动生成此代码
}
};
构造方法的目的
为类中的属性初始化。既然是方法,则方法中肯定可以传递参数,此时定义一个构造,同时向里面传递参数。
class Person{
private String name ;
private int age ;
public Person(String n,int a){ // 声明构造方法,为类中的属性初始化
this.setName(n) ;
this.setAge(a) ;
}
public void etName(String n){
name = n ;
}
public void etAge(int a){
if(a>0&&a<100){
age = a ;
}
}
public String getName(){
return name ;
}
public int getAge(){
return age ;
}
public void tell(){
System.out.println("姓名:" + this.getName() + ";年龄:" + this.getAge()) ;
}
};
public class ConsDemo02{
public static void main(String args[]){
System.out.println("声明对象:Person per = null ;") ;
Person per = null ; // 声明对象时并不去调用构造方法
System.out.println("实例化对象:per = new Person() ;") ;
per = new Person("张三",30) ;//实例化对象
per.tell() ;
}
};
输出结果:
声明对象:Person per = null ;
实例化对象:per = new Person() ;
姓名:张三;年龄:30
可以发现构造方法的主要目的就是为类中的属性初始化。
1.2、构造方法重载
构造犯法与普通方法一样,都是支持重载操作的,只要参数的类型和个数不同,就可以完成重载操作。
class Person{
private String name ;
private int age ;
public Person(){} // 声明一个无参的构造方法
public Person(String n){ // 声明有一个参数的构造方法
this.setName(n) ;
}
public Person(String n,int a){ // 声明构造方法,为类中的属性初始化
this.setName(n) ;
this.setAge(a) ;
}
public void setName(String n){
name = n ;
}
public void setAge(int a){
if(a>0&&a<150){
age = a ;
}
}
public String getName(){
return name ;
}
public int getAge(){
return age ;
}
public void tell(){
System.out.println("姓名:" + this.getName() + ";年龄:" + this.getAge()) ;
}
};
public class ConsDemo03{
public static void main(String args[]){
System.out.println("声明对象:Person per = null ;") ;
System.out.println("实例化对象:per = new Person() ;") ;
Person per1 = new Person("张三",30) ;//实例化对象
Person per2 = new Person("李四") ;//实例化对象
per1.tell() ;
per2.tell() ;
}
输出结果:
声明对象:Person per = null ;
实例化对象:per = new Person() ;
姓名:张三;年龄:30
姓名:李四;年龄:0
1.3、匿名对象
匿名:没有名字,在Java中,如果一个对象只使用一次,则就可以将其定义为匿名对象。
class Person{
private String name ;
private int age ;
public Person(String n,int a){ // 声明构造方法,为类中的属性初始化
this.setName(n) ;
this.setAge(a) ;
}
public void setName(String n){
name = n ;
}
public void setAge(int a){
if(a>0&&a<150){
age = a ;
}
}
public String getName(){
return name ;
}
public int getAge(){
return age ;
}
public void tell(){
System.out.println("姓名:" + this.getName() + ";年龄:" + this.getAge()) ;
}
};
public class NonameDemo01{
public static void main(String args[]){
new Person("张三",30).tell() ; //匿名对象
}
};
输出结果:
姓名:张三; 年龄:30
所谓的匿名对象,就是比之前少了一个栈内存的引用关系,缺少了引用。。
2、总结
1、构造方法的定义及使用原则
- 对象在实例化时必须调用构造方法
- 每个类中都至少有一个构造方法
2、匿名对象:只开辟了堆内存的实例化对象