java构造器的使用和理解

     创建3个类,Teacher类,Student类,Manager类。其中主函数main()在Manager类里面。

 1. Teacher类

public class Teacher {

	// 自己声明了一个无参构造器
	public Teacher() {

	}

	public String name; 
	private int num;
	public String getName() {
		return name;
	}

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

2.Student类

public class Student {
	// 方法的重载 : 同一个方法名(学习) 根据参数的区别:1.形参个数的区别 2.形参类型的区别 3.顺序的区别
	
	public String name;
	public int num;

	// 每一个类 都有一个隐式的没有形参的构造器 前提:没有自己声明构造器时
	public Student() {
		this("张三");
       }

	public Student(String name) {
		this("李四", 140); // 构造器调用构造器的语句只能写在第一行
		this.name = name;
	}

	public Student(String name, int num) {
		this.name = name;
		this.num = num;
	}

	public void study() {
		System.out.println("学生正在自学!");
	}

	public void study(int time) {
		System.out.println("学生正在自学:" + time);
	}
	public void study(Teacher t) {
		System.out.println("学生正在上课,跟:" + t.getName() + "上课!");
		this.study(2);	// 谁在调用this所在的方法 那么this就指谁
	}
}

 3.Manager类

public class Manager {

	public static void main(String[] args) {
		
		Student stu = new Student(); 
		Student stu1 = new Student("张三");
		Student stu2 = new Student(); 	
		
		stu.study();
		stu.study(2);
		stu.study(t); // 调用study(Teacher)的是stu对象
		stu1.study(t);
		
		System.out.println(stu.name);
		System.out.println(stu1.name);	
	}
}

基本知识: 

    (1) java构造器的作用是对象初始化,在new  类名()时完成的。基本类型,像int,float,bool类型都有默认值,任何一个类里,在没有声明有参构造函数的情况下,new一个对象都会调用一个隐式的无参构造函数。如果类里定义了有参构造函数,那么无参构造函数失效。

    (2) 例如Student stu = new Student();    new的对象都在堆里,而stu是实例的引用,存放的是堆里新建对象的地址。

    (3) 构造器可以重载,根据需求调用不同的构造器。

    (4) this不会出现在主函数main()里,会出现在类的方法里。谁调用该方法,this就指向那个对象。

收获心得:

     this关键字的使用和构造器互用。

    (1)在下面的场景下使用this进行方法的调用:

public void study() {
	System.out.println("学生正在自学");
}
public void study(int time) {
	System.out.println("学生正在自学:"+ time);
}
public void study(Teacher t){
	System.out.println("学生正在上课,跟" + t.getName() +  "学习";
}

 若学生正在上课,跟某某老师学习,又自学2个小时,可以通过重载一个新的study()方法:

public void study(Teacher t,int time){
	System.out.println("学生正在上课,跟" + t.getName() +  "学习";
	System.out.println("学生正在自学:"+ time);
}

 这样做就是将上述study(int time)和study(Teacher  t)的整合,就显得多余,造成代码的重复。所以就考虑到使用this调用本类方法。只需要在study(Teacher t)方法里加一句this.study(2),就会调用方法study(int time)实现需求。

public void study(Teacher t){
	System.out.println("学生正在上课,跟" + t.getName() +  "学习";
        this.study(2);
}

 (2)构造器的互用

     构造器调用构造器的方法是this(参数表),而且一个构造器里最多只能出现一次this(参数表),且构造器的语句只能写在第一行。

	public Student() {
		this("张三"); 	
       }

	public Student(String name) {
		this("李四", 140); // 构造器调用构造器的语句只能写在第一行
		this.name = name;
	}

	public Student(String name, int num) {
		this.name = name;
		this.num = num;
	}

   例如在上面的无参构造器Student()中有一条语句this("张三"),则在代码中有new Student(),调用无参构造器Student(),进入方法里将会调用有参构造器Student(String name)。若运行Manager文件,则显示:

张三

张三

     将Manager类里的Student stu1 = new Student("李四");运行得到:

张三

李四

     这样就实现了对象stu1的定制化。

    构造器可以一层一层委托其他的构造器链式操作,实现需求。

  

猜你喜欢

转载自405824674.iteye.com/blog/2221023