一、继承

  • 目的:实现代码重用,且在保持现有功能的前提下,加入新的功能,所产生的类称为派生类
  • 主要解决的问题:共性的抽取
  • 例如:鸟和猫都属于动物,二者在某些方面具有共性,将这些共性内容抽取出来,放在一个新的类Animal中,让Cat和Bird分别继承Animal类,以达到代码重用效果
    将Animal这种被继承的类称为父类/基类/超类
    将Cat和Bird这种类称为子类/派生类
  • 语法规则:
public class 子类 extends 父类{
}

注意:

  • 使用extends指向父类
  • Java中一个子类只能继承一个父类
  • 子类会继承父类的所有属性和方法,无论是public还是private,只不过父类中用private修饰的成员在子类中无法访问
  • 子类的实例中也包含着父类的实例
    例如:当我们去new一个Cat实例时,会先创建一个Animal实例在Cat内部

    子类中的name属性是从父类中继承得来的(即是同一个name),既可使用this.name方式获取,又可使用super.name方式获取
  • 子类继承父类后,子类需要先构造父类
    创建子类实例时,先构造父类对象(执行父类构造方法的逻辑),再构造子类对象(再执行子类构造方法的逻辑)
  • java中对于字段和方法共有四种访问权限
    (1)public:类内部和外部都能访问
    (2)private: 类内部能访问, 类外部不能访问------------实现封装
    (3)default:默认(也叫包访问权限): 类内部能访问, 同一个包中的类可以访问, 其他类不能访问
    (4)protected: 类内部能访问, 子类和同一个包中的类可以访问, 其他类不能访问
    **注意:**实际开发中主要使用public和private,能用private就尽量不用public
  • final关键字
    (1)当final用来修饰一个变量或者字段时,表示不可被修改的常量
final int a = 10; 
a = 20;  // 编译出错

(2)当final用来修饰类时,表示被修饰的类不能被继承
String类就是用final修饰的,不能被继承
二、组合

  • 目的:代码重用
  • 实现方式:将一个类的实例作为另外一个类的字段
public class School{
    public ClassRoom classroom1=new ClassRoom();
    public ClassRoom classroom2=new ClassRoom();
    
    public Student student1=new Student();
    public Student student2=new Student();
    
}

三、继承和组合的区别:

  • 组合表示"has-a"语义------有(学校有学生和教室)
  • 继承表示"is-a"语义---------是(猫和鸟是动物)
  • 实际开发中,用组合的情况更多