构造方法,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");
      }
    ?
       @Override
       public void study() {
           System.out.println("study");//子类重写父类的抽象方法
      }
    }
    ?