封装

  • 属性私有化,并提供get/set方法

    继承

  • 继承的关键字 extends

  • 子类 也叫派生类
  • 父类 也叫 基类,超类
  • 继承描述的是类和类之间的关系
  • 继承使子类复用父类的方法和属性,但是会带来高耦合(子类不想要继承的也要继承)
  • Java class 只支持单继承
  • 一个接口可以继承多个接口
  • 子类不能继承的
    • private 修饰的成员变量和方法不能被继承
    • 父类和子类不在同一个包,父类中使用默认访问权限的成员不能被继承。
    • 构造方法不能被继承
  • 继承具有传递性
    • 子类可以继承父类的父类
  • 子类一定要调用父类的构造器,因为编译器提供了默认构造器,并默认执行了super(),但是当父类没有提供无参构造的话,子类就要显式的调用父类的有参构造器了。

    多态

  • 多态:同一个引用类型,使用不同的实例而执行不同的操作。

  • 多态的语法特征:
    • 父类引用指向子类对象 或者 接口引用指向 实现类对象
    • 方法重写
  • 多态的应用
    • 类多态
    • 接口多态
    • 参数多态
  • 多态的好处
    • 屏蔽了子类的差异,容易替换实现类。
    • 一个父类类型,可以接受所有该子类的对象。
  • instanceof关键字

    • pet instanceof Dog 判断传入的pet变量的引用是不是指向Dog类的对象

      方法重载

  • 方法名相同,参数列表不同

    • 参数列表不同,参数类型和数量不同
    • 和返回没有关系
  • 从父类继承下来的方法,和子类的方法可以形成方法重载 ```java public class P {

    public void test(int a){

    1. System.out.println("int:" + a);

    }

}

public class S extends P {

  1. public long test(long l){
  2. System.out.println("long:" + l);
  3. return l;
  4. }
  5. public static void main(String[] args) {
  6. S s = new S();
  7. s.test(1);
  8. s.test(1L);
  9. }

} ```

int:1 long:1

方法重写

前提:子类继承父类

  • 只有实例成员方法才能被重写
  • 方法名要相同
  • 参数列表相同
    • 参数带有泛型,泛型会被擦除,不影响重写
    • 参数顺序,类型,数量都要相同
  • 返回值类型相同
    • 基本数据类型 要完全相同
    • 引用数据类型 子类返回值类型是父类返回值类型的子类型也可以
  • 访问修饰符不能比父类更严格
    • 比如父类是public,那子类只能是public
  • 异常种类不能父类更大

  • @Override 告诉编译器,这个方法是重写的方法
  • 重写的作用
    • 子类修改父类的功能
    • 子类增强父类的方法
  • final修饰的方法不能被重写

  • 重写在方法运行时,通过调用者的实际类型来确定调用的方法版本。(具体细说,就是子父类中的重写方法在对应的class文件常量池的位置相同,一旦子类没有重写,那么子类的实例就会沿着这个位置往上找,直到找到父类的同名方法)
  • 重写只发生在可见的实例方法中:
    • 静态方法不存在重写,形式上的重写只能说是隐藏。
    • 私有方法也不存在重写,父类中private的方法,子类中就算定义了,就是相当于一个新的方法。
    • 静态方法和实例方法不存在相互重写。
  • 重写满足一个规则:两同两小一大
    • 两同:方法名和形参列表一致
    • 两小:重写方法的返回值(引用类型)和抛出异常,要和被重写方法的返回值(引用类型)和抛出异常相同或者是其子类。注意,一旦返回值是基本数据类型,那么重写方法和被重写方法必须相同,且不存在自动拆装箱的问题。
    • 一大:重写方法的访问修饰符大于等于被重写方法的访问修饰符。