产生对象的方法--构造方法

278 阅读5分钟

1、什么是构造方法

1、构造方法就是类构造对象时调用的方法,用于对象的初始化工 作
2、构造方法是实例化一个类的对象时,也就是new 的时候,最先调用的方法。

构造方法的定义:
构造方法是在类中定义的,构造方法的定义格式:
方法名称与类名称相同无返回值类型的声明。
对象的实例化语法: 代码实例:

Dog dog = new Dog(); //new Dog后面有个括号,带括号表示调用了方法,此时调用的方法就是构造方法了

2、构造方法的重载

如果你不写构造方法的话,他是有默认的构造方法,里面什么都没有,也没有参数,但是如果在一个类中,写了一个有参数的构造方法,那么构造方法就无效了,如果你还想用默认的无参的构造方法时,你得把它写上不然他会报没有找到合适的构造器,..
那我可不可以在构造方法里调用另外的构造方法呢,答案是可以的,构造方法也是方法呀肯定是可以的废话不多说,直接上代码


import java.util.Arrays;
public class Test8{
	public static void main(String[] args){	
	Dog dog2=new Dog("旺旺",3);
	}	
}
//没有封装之前
class Dog{
	public Dog(){
		System.out.println("构造方法执行了");
	}
	public Dog(String name){
		this.name=name;
		System.out.println("我是被构造方法调用的构造方法");
	}
	//有的同学就会说,这个和set方法很像,确实很像都是给对象传参,
	//但是set方法是对象创建之后才能调用,构造方法是对象创建时调用
	public Dog(String name,int age){
		this(name);//this(name); 代表的就是我调用了带一个参数,参数类型是String的构造方法
		//this.name=name;
		this.age=age;
		System.out.println("带参数的构造方法执行了");
	}
	//在类中定义属性(特征)
	private String name;//成员变量 ,在类中定义
	private int age;//;//成员变量 ,在类中定义
	public  void run(int leng){//参数也是局部变量
		int m=leng;//m 也是局部变量
	}
}

运行结果

问题来了,如果你把this(name)放到System.out.println()后边行不行呢?行不行的咱试一试不就行了,邓爷爷说过,实践是检验真理的唯一标准!

果不其然,报错了,对this的调用必须是构造器中的第一个语句!
也就是说,如果你想在构造方法里使用this()调用构造方法,必须写在改方法的第一条语句所以呢,也就是说,构造方法调用构造方法只能调一个。并且在构造方法相互调用的时候一定要有出口!不能我调了你,你又调了我!这就成了递归调用,程序会死给你看的!看到这里的能不能给我点个赞扣一个666!

3、this关键字

在Java基础中,this关键字是一个最重要的概念。使用this关键字可以完成以下的操作:

/***
this关键字 
调用类中的属性
调用类中的方法或构造方法
表示当前对象:在方法被调用的过程中,哪个对象调用可方法,在方法中的this,就表示谁
*/
public class Test8{
	public static void main(String[] args){	
	Cat cat=new Cat();
	cat.setName("喵喵");
	cat.setAge(3);
	
	}	
}

class Cat{

	private String name;
	private int age;
	public void setName(String name){//相当于 name="喵喵"
		this.name=name;//this代表的是当前对象
	}
	public String getName(){
		return name;
	}
	public void setAge(int age){
		this.age=age;
	}
	public int getAge(){
		return age;
	}
	public void eat(){
	    System.out.println("我是"+this.getName()+",我爱吃鱼");
	}
	
}

  • 调用类中的属性 也可以省略,但是因为和参数名重名了,还有就近原则所以,就不能省略了

  • 调用类中的方法或构造方法 这个eat里的this可以省略,this也是当前对象,cat(谁调用就是谁)

  • 表示当前对象 因为cat调用了setName方法,所以this表示cat

  • 类名.this,表示谁的对象 Cat.this这个在匿名内部类中调用外部类的时候会用到!

4、小结

  • 构造方法名称与类名相同,没有返回值声明(包括 void)

  • 构造方法用于初始化数据(属性)

  • 每一个类中都会有一个默认的无参的构造方法

  • 如果类中有显示的构造方法,那么默认构造方法将无效

  • 如果有显示的构造方法,还想保留默认构造 方法,需要显示的写出来。

  • 构造方法可以有多个,但参数不一样,称为构造方法的重载

  • 在构造方法中调用另一个构造方法,使用this(...),该句代码必须在第一句。

  • 构造方法之间的调用,必须要有出口。

  • 给对象初始化数据可以使用构造方法或setter方法,通常情况下,两者都会保留。

  • 一个好的编程习惯是要保留默认的构造方法。(为了方便一些框架代码使用反射来创建对象)

  • private Dog(){},构造方法私有化,当我们的需求是为了 保正该类只有一个对象时。 什么时候一个类只需要一个对象?比如,工具类(没有属性的类,只有行为)并且该工具对象被频繁使用。权衡只用一个对象与产生多个对象的内存使用,来确定该类是否要定义为只需要一个对象。私有化之后 你就new 不了哦!

  • this的用法