实例化对象产生格式:
(1)类名称 (2) 对象名称 = (3)new (4)类名称();
对于以上格式观察组成部分:
(1)类名称:任何对象都应该有其对应的类,没有类就不知道对象具有的功能。
(2) 对象名称: 对象唯一的标记。
(3)new :表示开辟新的堆内存空间。
(4)类名称():构造方法。
通过以上的分析,所谓的构造方法指的就是在使用关键字new实例化新对象时来进行调用的方法。
构造方法的定义需要遵守:
构造方法名称必须与类名称相同,并且构造方法没有返回值类型声明,同时每个类中至少存在有一个构造方法,如果一个类中没有明确定义一个构造方法,那么类中会自动生成一个无参的构造方法。
范例:定义一个无参的什么都不做的构造方法。
class Person{
String name;
int age;
//无论是否使用,setter和getter方法都应该写
public void setName(String n){
name = n;
}
//构造方法名称与类名称相同,并且没有返回值类型,就算不写也会在编译中自动生成
public Person(){
System.out.println("在new对象时才会调用")
}
public void setAge(int a){ //可以在setter方法中做一个检测
if(a>=0&&a<250){
age = a;
}
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 pr = new Person();
pr.setName("张三");
pr.setAge(-200);
pr.info();
}
}
一个对象只能调用一次构造方法。
类中无参的构造方法,就算不写,在代码编译时也会自动生成。
问题:构造方法无返回值,为什么不能添加void
现在类中的组成:属性、普通方法、构造方法。
属性是在对象开辟堆内存时开辟的空间;
构造方法是在使用new关键字时同时调用的,只调用一次;
构造方法:public Person()
普通方法是在对象实例化完成时调用的,并且可以调用多次。
普通方法: public void Person(),命名不标准
对于类中可以自动生成的无参构造方法,前提是类中没有定义构造方法。
范例:类中定义一个有参的构造方法
class Person{
String name;
int age;
//无论是否使用,setter和getter方法都应该写
public void setName(String n){
name = n;
}
//构造方法名称与类名称相同,并且没有返回值类型,就算不写也会在编译中自动生成
//有参数的构造方法
public Person(String n,int a){
name = n;
setAge(a);
}
public void setAge(int a){ //可以在setter方法中做一个检测
if(a>=0&&a<250){
age = a;
}
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[]){
//有参的构造方法,调用时对应的传递参数
Person pr = new Person("张三",30);
pr.info();
}
}
构造方法作用:
构造方法的调用和对象的内存分配几乎是同步完成的,可以利用构造方法对类中的属性进行初始化;
利用构造方法避免了setter方法的重复使用。
在实际开发中,setter方法除了有设置属性的功能,也有修改属性的功能。
构造方法本身属于方法,可以进行类的重载,构造方法的重载只是实现参数的类型或个数不同。
范例:构造方法的重载
class Person{
String name;
int age;
//无论是否使用,setter和getter方法都应该写
public void setName(String n){
name = n;
}
//构造方法名称与类名称相同,并且没有返回值类型,就算不写也会在编译中自动生成
//有参数的构造方法
public Person(String n,int a){
name = n;
setAge(a);
}
//构造方法的重载
public Person(String n){
name = n;
}
//构造方法的重载
public Person(){
}
public void setAge(int a){ //可以在setter方法中做一个检测
if(a>=0&&a<250){
age = a;
}
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[]){
//有参的构造方法,调用时对应的传递参数
Person pr = new Person("张三",30);
Person pr1 = new Person("张三");
Person pr2 = new Person();
pr.info();
}
}
但是在进行构造方法重载时注意一下定义结构。建议若干个构造方法建议按照参数的个数升序或者降序排序。
同时需要注意:在进行类定义时,请按照 属性、构造方法、普通方法的结构定义。
发现构造方法可以传递属性内容,往往会使用匿名对象。
范例:匿名对象
class Person{
String name;
int age;
//构造方法
public Person(String n,int a){
name = n;
setAge(a);
}
//普通方法
public void setName(String n){
name = n;
}
public void setAge(int a){
if(a>=0&&a<250){
age = a;
}
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("张三",30);
pr.info();
}
}
由于匿名对象不会有任何的栈空间所指向,使用一次将会成为垃圾。
结论:
1.构造方法每个类中至少存在有一个;
2.构造方法的名称与类名称相同,无返回值类型;
3.构造方法允许重载,重载的时候只考虑参数的类型和参数的个数即可。