4. 面向对象三大特性——继承

继承

  • 继承的本质是对某一批类的抽象,从而实现对现实世界更好的建模。

  • extends 的意思是“扩展”,子类是父类的扩展。

  • Java中类只有单继承,没有多继承。

  • 继承是类和类之间的一种关系。除此之外,类和类之间的关系还有依赖、组合、聚合等。

  • 继承关系的两个类,一个为子类(派生类),一个为父类(基类)。子类继承父类,使用 extends 关键字表示。

  • 子类和父类之间,从意义上讲应该具有 “ is a”的关系

 

只要子类继承了父类,也会同时继承父类中所有的方法或属性

public static void main(String[] args) {
   Student student = new Student();
   student.student();

   Teacher teacher = new Teacher();
   teacher.teacher();
}
public class Preson {

   public void student(){
       System.out.println("学生在学习!");
  }

   public void teacher(){
       System.out.println("老师在给学生上课!");
  }
}
//只要子类继承了父类,也会同时继承父类中所有的方法或属性
public class Teacher extends Preson{
}
public class Student extends Preson {
}

 

  • object类

  • super:用于调用父类的属性或方法

super注意点:

  1. super调用父类的构造方法,必须在构造方法的第一个

  2. super必须只能出现在子类的方法或构造方法中

  3. super 和 this 不能同时调用构造方法

super 和 this 的不同:

  • 代表的对象不同:

    • this:本事调用者这个对象

    • super:代表父类对象的应用

  • 前提:

    • this:没有继承也可以使用

    • super:只能在继承条件下才能使用

  • 构造方法:

    • this():本类的构造

    • super():父类的构造

public class Preson {

   public String name = "zhangsan";

   public Preson() {
       System.out.println("Preson父类无参构造执行");
  }
}
package com.demo02;

/**
* super:用于调用父类的属性或方法
*/
public class Student extends Preson {

   public String name = "张三";

   public Student() {
       /**
        * 隐藏代码,默认调用父类中的无参构造方法
        * 并且必须是在方法的第一行,
        * super() 和 this() 不能同时在一个方法中即调用父类构造器,又调用子类构造器
        */
       super();
       //       this();调用自己的构造器
       System.out.println("Student子类无参构造执行");
  }

   public void print(String name){

       System.out.println(name);
       System.out.println(this.name);
       System.out.println(super.name);
  }
}
public class Apuliction {
   public static void main(String[] args) {
       Student student = new Student();
       student.print("zs");
  }
}

 

  • 方法重写:需要有继承关系,子类重写父类的方法!(override:重写)

    1. 方法名必须相同

    2. 参数列表必须相同

    3. 修饰符:范围可以扩大,但不能缩小

    4. 抛出的异常:范围可以被缩小,不能扩大。

    5. 子类的方法和父类必须一致;方法体不同!

    6. 重写是针对非静态方法的,静态方法不是重写

静态方法:静态方法不是重写

public static void main(String[] args) {

   /**
        * 父类和子类中的方法,属于静态方法时,
        * 调用的结果取决于左边的数据类型
        */
   A a = new A();
   a.test();

   B b = new A();
   b.test();
}
A=>test()
   B=>test()
   -------------------------------------------
   public class A extends B {

       public static void test(){
           System.out.println("A=>test()");
      }
  }
------------------------------------------------
   public class B {
       public static void test(){
           System.out.println("B=>test()");
      }
  }

 

非静态方法:重写

public static void main(String[] args) {
   A a = new A();
   a.test();

   B b = new A();
   b.test();
}
A=>test()
A=>test()
------------------------------
   public class A extends B {
       public void test(){
           System.out.println("A=>test()");
      }
  }
------------------------------
   public class B {
       public void test(){
           System.out.println("B=>test()");
      }
  }

在父类的构造器中使用 this 关键字,调用的是子类的方法

 

 

posted @ 2021-03-11 00:27  初夏_雨露  阅读(74)  评论(0)    收藏  举报