常见问题:
(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"); } @Override public void study() { System.out.println("study");//子类重写父类的抽象方法 } }