创建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的定制化。
构造器可以一层一层委托其他的构造器链式操作,实现需求。