构造方法和this关键字

一、构造方法
定义:构造方法是指当实例化一个对象的时候,第一个被调用的方法
如:Student stu = new Student();//Student()就是构造方法
创建一个构造方法:访问权限修饰符 类名(){
方法体
}
普通方法:访问权限修饰符 其他修饰符 返回值类型 方法名(参数){

}
重点:注意!!!:
1.构造方法分为无参的构造方法和有参的构造方法,构造方法是实例化对象的过程中自动调用的。
2.当我们没有手动创建一个有参的构造方法的时候,系统会为我们提供一个默认的无参的构造方法(隐式的显示,不会看到,但是存在),但是当我们创建了一个有参的构造方法的时候,我们就需要手动的把无参的构造方法也写出来
3.构造方法没有返回值

//演示构造方法的使用
class TextDemo05 
{
	public static void main(String[] args) 
	{
		//1.系统会默认提供一个无参的构造方法
		Animal a = new Animal();

		Animal aa = new Animal("fadhbf");
		aa.show();
		aa.show();
		aa.show();
	}
}

class Animal
{
	//无参的构造方法
	//2.构造方法是在实例化对象的过程中被自动调用的,不需要手动调用
	
	public Animal(){
		System.out.println("无参的构造方法被调用");
	}
	
	//3.当手动添加一个有参的构造方法之后,系统将不再提供无参的构造方法
	//如果要使用无参的构造方法,只能手动添加
	public Animal(String str) {
		System.out.println("String构造方法被调用");
	}

	public void show() {
	}
}

二、构造方法和普通方法的区别
1.构造方法是在创建对象的过程中自动调用的,普通方法需要我们实例化以后才能调用
2.构造方法没有返回值类型,普通方法的返回值要么是确定的要么是void(void的就是没有返回值)
3.系统会默认为我们提供一个无参的构造方法,普通方法需要我们手动创建
4.构造方法的方法名必须和所在类的类名一致
5.构造方法在创建的过程中就会执行,每个对象只执行一次,普通方法只有在需要的时候被调用,且可以被多次调用
构造方法的重载

class TextDemo06 
{
	public static void main(String[] args) 
	{
		//直接赋值
		/*
		Dog maomao = new Dog();
		maomao.name = "毛毛";
		maomao.age = 3;

		maomao.lookHome();
		*/

		//通过构造方法赋值
		Dog dahuang = new Dog("大黄",5);
		dahuang.lookHome();
	}
}

//实体类
class Dog
{
	//成员变量
	String name;
	int age;

	//构造方法
	public Dog() {}
	//有参的构造方法,参数一般设置为和成员变量有关的参数
	public Dog(String n,int a) {
		//给成员变量赋值
		name = n;
		age = a;
	}
	/*
	public Dog(String n) {
		name = n;
	}
	*/

	//成员方法
	public void lookHome() {
		System.out.println(name + "看家");
	}
}

三、this关键字
首先,我们了解一下this关键字的作用
1.访问本类的成员属性
2.为了区分成员变量和形参
this.方法名:访问本类的成员方法

例子://演示this的作用
class Demo1{
	public static void main(String[] args) 
	{
		//
		Cat maomao = new Cat("毛毛",10);
		maomao.setName("fhsdg");

		Cat xiaohei = new Cat("小黑",5);
		xiaohei.setName("hello");

		/*
		无参的构造方法被调用
		String int构造方法被调用
		无参的构造方法被调用
		String int构造方法被调用

		说明:每创建一个对象,只能自动的调用其中的一个构造方法,通过this()可以手动的去调用其他的构造方法
		*/

		//对象.
		xiaohei.show3();
	}
}

class Cat
{
	String name;
	int age;
	int num;
	int num1;

	//3.this()
	public Cat() {
		System.out.println("无参的构造方法被调用");
	}
	//1.this.属性
	public Cat(String name,int age) {
		//调用的是无参的构造方法
		this();
		this.name = name;
		this.age = age;

		System.out.println("String int构造方法被调用");
	}
	public Cat(String name,int age,int num,int num1) {
		//对this()的调用必须是构造方法中的第一个语句
		//this();
		//具体调用的是哪个构造方法,取决于所传的参数
		this(name,age);
		//可以简化代码
		//this.name = name;
		//this.age = age;
		this.num = num;
		this.num1 = num1;

		System.out.println("String int int int构造方法被调用");
	}

	public void setName(String name) {
		this.name = name;
	}
	public String getName() {
		return name;
	}

	public void setAge(int age) {
		this.age = age;
	}
	public int getAge() {
		return age;
	}

	//2.this.方法
	//普通方法
	public void show1() {
		//在本类中调用方法时,this可以省略
		this.show2();
		//在非静态方法中调用静态方法时,也可以使用this,this同样可以省略
		this.show3();
	}

	public void show2() {
	}

	//静态方法
	public static void show3() {
		//错误: 无法从静态上下文中引用非静态 变量 this
		//在静态方法中不能使用this
		/*
		在测试类中的main函数使用xiaohei调用了show3方法,所以此处的this代表的就是xiaohei
		而xiaohei本身是一个引用性的变量,是非静态的,所以在静态函数中不能访问非静态变量
		*/
		//this.show4();//错误演示
		show4();
	}

	public static void show4() {
	}
}

this()的作用
1.访问本类的构造方法
2.必须出现在构造 函数汇总
3.具体访问的是哪个构造方法,取决于所传的参数,因为构造方法的名字都一样
4.只能书写在构造方法的第一条语句中,就是在方法的最上面,后面还会学到super(),继承,也是要写在方法体内的最上面
5.this()在同一个构造方法里只能出现一次

class ThisUsageDemo02 
{
	public static void main(String[] args) 
	{
		System.out.println("Hello World!");
	}
}
class Dog
{
	 String name;
	 int age;
	 int num;
	 String hobby;

	//提高代码的可读性,可维护性
	//构造方法
	public Dog() {
	}
	public Dog(String name) {
		this.name = name;
	}
	public Dog(int age) {
		this.age = age;
	}

	public Dog(String name,int age) {
		this.name = name;
		this.age = age;
	}
	public Dog(String name,int age,int num,String hobby) {
		this(name,age);
		this.num= num;
		this.hobby = hobby;
	}
}