构造方法,super, this
-
常见问题:
-
(1)为什么在实例化子类的对象的时候,会先调用父类的构造方法?
-
实例化子类时,会调用子类的无参构造方法,子类的无参构造方法第一行有默认代码super();会去实例化父类,实例化父类的时候,会调用父类的无参构造方法;
-
-
(2)子类在哪里调用了父类的构造方法?
-
在子类的构造方法的第一行中默认(不显示)调用super()方法,即调用了父类构造方法;
-
如果父类里面没有定义有参构造,那么必须在子类的构造方法的第一行显示的调用super();
-
如果子类当中的构造方法的第一行写了this(); 那么默认(不显示)的那个super();语句就会不起作用;因为Super()和this()都只能定义在构造方法的第一行;
-
-
-
代码案例1:构造方法
public class Demo02 {
public static void main(String[] args) {
?
Student student=new Student();
student.haha();//Student
?
}
}
?
?
//父类
public class Person {
//正常方法
public void haha(){
System.out.println("Person");
}
?
}
?
//子类
public class Student extends Person {
?
public void haha(){
System.out.println("Student");
}
} -
总结:
-
调用构造器:可以用this(); 也可以用super();
-
super()调用父类构造器:必须放在子类构造器的第一行;否则会编译报错;
-
this()调用构造器,也必须放在构造器的第一行;
-
但是,super和 this不能同时调用,也就是说,要么调用父类构造器,要么调用子类构造器;
-
重点:子类无参构造中:有一句默认代码:super()//默认是不显示的;如果要显式调用,必须放在第一行
-
-
多态存在的条件:
-
有继承关系;
-
-
父类的引用指向子类的对象;
-
-
多态的注意点:
-
多态是方法的多态,属性没有多态;
-
instanceof方法:判断是否有继承关系;
-
-
代码案例:重点1
/**
* 测试类
*/
public class Demo02 {
public static void main(String[] args) {
?
//创建一个Student对象
Student student=new Student();
student.haha();//Student
?
//创建一个父类对象
Person person=new Person();
person.haha();//Person
?
//多态
Person person1=new Student();
person1.haha();//Student//子类重写父类的方法,执行的就是子类的方法;
?
}
}
?
?
//父类
public class Person {
//正常方法
public void haha(){
System.out.println("Person");
}
}
?
//子类
public class Student extends Person {
?
public void haha(){
System.out.println("Student");
}
} -
代码案例2:抽象类案例
public class Demo02 {
public static void main(String[] args) {
?
?
Student student=new Student();
?
student.haha();//Student
student.study();//study
Person person=new Student();
person.haha();//Student
person.study();//study
?
?
}
}
?
//父类
public abstract class Person {
?
//正常方法
public void haha(){
System.out.println("Person");
}
?
//抽象方法
public abstract void study();
?
}
?
//子类
public class Student extends Person {
?
public void haha(){
System.out.println("Student");
}
?