一、继承
- 目的:实现代码重用,且在保持现有功能的前提下,加入新的功能,所产生的类称为派生类
- 主要解决的问题:共性的抽取
- 例如:鸟和猫都属于动物,二者在某些方面具有共性,将这些共性内容抽取出来,放在一个新的类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"语义---------是(猫和鸟是动物)
- 实际开发中,用组合的情况更多