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