构造方法与匿名对象

实例化对象产生格式:

 (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.构造方法允许重载,重载的时候只考虑参数的类型和参数的个数即可。

猜你喜欢

转载自blog.csdn.net/weixin_38266599/article/details/81303442