回顾:实例化对象的产生格式:
①类名称 ②对象名称 = ③new ④类名称() ;
下面分析这个格式每一部份的组成:
可以看出,构造方法是使用关键字new实例化新对象时调用的操作方法,构造方法的定义需要遵守如下原则:
范例:定义一个无参的构造方法
class Person { // 定义一个类,注意类名称每个单词首字母大写
private String name ;
private int age ;
// 构造方法名称与类名称相同,并且没有返回值类型声明
public Person() { // 如果类中不写此定义,系统也会创建一个无参无返回值的方法
System.out.println("new对象时调用这个构造方法") ; // 系统创建的无参构造方法不会有任何功能
}
public void setName(String n) {
name = n ;
}
public void setAge(int a) {
if(a > 0 && a < 120){
age = a ;
} else
age = 0 ;
}
public String getName() {
return name ;
}
public int getAge() {
return age ;
}
public void info() { // 一个普通方法
System.out.println("name = " + name + " age = " + age) ;
}
}
public class TestDemo { // 定义一个程序类
public static void main(String args[]) {
// 类名称 对象名称 = new 类名称() ;
Person per = new Person() ; // new时调用构造方法
per.setName("Dexter") ;
per.setAge(20) ;
per.info() ;
}
}
既然构造方法中没有返回数据,为什么不使用void进行定义呢?
public Person() ;
public void Person() ;
通过二者程序上的区别来区分,而不能根据方法名来区分。
对于类中自动生成的无参构造方法实际上是有一个前提:类中没有定义任何构造方法。
范例:类中定义一个有参构造方法
// 构造方法名称与类名称相同,并且没有返回值类型声明
// 定义了一个有参构造,默认的无参构造不会在编译时自动生成
public Person(String n , int a) { // 如果类中不写此定义,系统也会创建一个无参无返回值的方法
System.out.println("new时调用这个构造方法") ;
}
修改上一个范例的第5行,编译时可以看到:
可以看到是因为new时调用构造方法Person()时参数不匹配。
范例:调用有参构造方法
class Person { // 定义一个类,注意类名称每个单词首字母大写
private String name ;
private int age ;
// 构造方法名称与类名称相同,并且没有返回值类型声明
// 定义了一个有参构造,默认的无参构造不会在编译时自动生成
public Person(String n , int a) { // 如果类中不写此定义,系统也会创建一个无参无返回值的方法
System.out.println("new时调用这个构造方法") ;
setName("Dexter") ;
setAge(20) ;
}
public void setName(String n) {
name = n ;
}
public void setAge(int a) {
if(a > 0 && a < 120){
age = a ;
} else
age = 0 ;
}
public String getName() {
return name ;
}
public int getAge() {
return age ;
}
public void info() {
System.out.println("name = " + name + " age = " + age) ;
}
}
public class TestDemo { // 定义一个程序类
public static void main(String args[]) {
// 类名称 对象名称 = new 类名称() ;
Person per = new Person("Dexter" , 20) ; // new时调用构造方法
per.info() ;
}
}
通过上面代码,可以看出构造方法的作用:
per.setAge(25) ;
class Person { // 定义一个类,注意类名称每个单词首字母大写
private String name ;
private int age ;
public Person(String n , int a) {
System.out.println("new时调用这个构造方法") ;
setName("Dexter") ;
setAge(20) ;
}
public Person(String n) {
System.out.println("一个参数的构造方法") ;
setName("Dexter") ;
}
public Person() {
System.out.println("无参数时构造方法") ;
}
public void setName(String n) {
name = n ;
}
public void setAge(int a) {
if(a > 0 && a < 120){
age = a ;
} else
age = 0 ;
}
public String getName() {
return name ;
}
public int getAge() {
return age ;
}
public void info() {
System.out.println("name = " + name + " age = " + age) ;
}
}
public class TestDemo { // 定义一个程序类
public static void main(String args[]) {
// 类名称 对象名称 = new 类名称() ;
Person per = new Person("Dexter") ; // new时调用构造方法
// per.setName("Dexter") ;
per.setAge(25) ;
per.info() ;
}
}
可以看到这时new调用的是public Person(String n) {}
这个构造方法。
在进行构造方法的重载时要注意定义时的代码结构:
在进行类定义时按照以下结构:
既然构造方法可以传递属性的内容,为了使用方便往往会使用匿名对象完成
Person per = new Person("Dexter" , 20) ;
,per
并不是真正的内容,new Person("Dexter" , 20)
才是。就是说per对象并没有被使用到。 Person per = new Person("Dexter" , 20) ; // new时调用构造方法
per.info() ;
可以用
new Person("Dexter" , 20).info() ;
直接取代。
匿名对象存在的问题:
匿名对象的使用是一个经验问题,先从有名对象开始慢慢积累经验。
阿里云【名师课堂】Java面向对象开发8:构造方法与匿名对象
原文:https://www.cnblogs.com/playerone/p/13060579.html