1.继承的概念
- 面向对象的特点之一,可以实现对类的复用。可以通过以下两种方法实现
- a.合成/聚合关系(包含其他类):将一个类当作另一个类的属性。
- b.派生类:一个类继承另一个类,实现继承的类称为派生类,被继承类称为父类,基类,超类。
- 父类的成员方法和成员变量被子类继承,但是父类的构造方法没有被继承。
- 在Java中只支持单继承,和C++多继承不一样。
2.super关键字
1.super可以访问父类的成员变量
2.super可以调用父类的成员方法
3.super可以在子类构造方法里调用父类的构造方法
注意:super只能在成员方法和构造方法里使用,不能在static方法里使用(和this一样),
在构造方法中使用必须放在第一行。
3.this和super关键字比较(都不能在static方法中调用)
4.方法覆盖
- 方法覆盖只存在子类和父类之间
- 子类覆盖父类的方法时,访问权限不能缩小,可以扩大,其他写法一样
- 父类的静态方法不能被子类覆盖为非静态方法
5.访问权限
类的访问修饰符
- public:任何包中的类(即一切的类)都可以访问该类
- 默认值:同一包中的类可以访问该类
成员的访问修饰符
- private:只对本类可见,对子类不可见
- 默认值:对同一包中的类可见
- protected:对同一包中的类和所有子类可见
- public:对一切类可见
注意:访问成员的前提是首选能访问成员所在的类
6.重写和重载的比较
7.对象的多态性
多态是指引用类型在不同情况下的多种形态,也可以理解为通过指向父类的指针调用不同子类中覆盖的方法
- 一个基类的引用类型变量可以"指向"其子类的对象。
- 一个基类的引用不可以访问其子类中新增加的成员(属性和方法)。
- instanceof : 对象 instanceof 类名/接口 //判断该对象是否是该类/该类的子类/实现该接口。
- 子类对象可以当作父类对象来使用称为向上转型,反之称为向下转型。
8.抽象类和抽象方法(abstract)
抽象类(abstract修饰):任何声明为abstract的抽象类无法实例化,除非其子类全部覆盖其抽象方法,
这样子类就不是抽象类,不一定要包含抽象方法,但是有抽象方法的类必须声明为抽象类。
抽象方法(abstract修饰):没有方法体的成员方法。不可以用abstract修饰构造方法。
抽象类的子类:1.抽象父类有抽象方法:
a.非抽象的子类:子类覆盖重写父类所有的抽象方法
b.抽象的子类:父类中的抽象方法只要有一个没有覆盖重写而继承了必须声明为abstract类
2.抽象父类没有抽象方法:
a.非抽象的子类:不用abstract修饰子类且不添加抽象方法即可(此时可以实例化)
b.抽象的子类:可以用abstract修饰,或者添加抽象方法再声明为抽象类。
注意:抽象方法被可视化的修饰符修饰的只有两个即public ,protected,即除了"默认访问修饰符"
"public","protected"修饰抽方法,其余的(private ,static ,final)不可以修饰。
9.abstract,final,static比较
10.接口(interface)
接口:比抽象类还抽象的抽象类,是抽象方法和常量值的定义的集合。没有变量和方法的实现。
接口常量:默认public static final 属性(注意:不接受其他修饰符), type name=value;
接口方法:默认public abstract 属性(注意:不接受其他修饰符),returnType methodName (paramlist)
接口的实现类(implements):实现接口的类必须覆盖所有接口的方法,否则成为抽象类。可实现多个接口
接口的好处:
- 解决了Java的单一继承带来的局限性,也解决了C++多重继承带来的问题,
- 多重继承的危险会导致子类继承同一方法的不同实现。而接口里的方法都没有实现,所以多重继承的问题。
- 通过接口实现不相关类的相同行为,而无需考虑这些类之间的关系。
- 通过接口了解对象的交互界面,而无需了解对象所对应的类
11.抽象类和接口的比较