今日学习内容:
一、继承
二、多态
三、接口与抽象类
一、继承:
1.
class 子类名 extends 父类名{
……
}
2.
父类(parent class)
超类(super class)
基类(base class)
例:
子类自动拥有父类声明为public和protected的成员,这就是继承特性的体现之一。
class Animal {
}
class Lion extends Animal {
}
3.继承条件下类的访问权限
public | 外界可自由访问 |
private | 外界不可访问 |
protected | 同一包中的子类都可以访问,另一包中的子类(派生于同一个父类)也可以访问 |
default | 如果不指明任何权限,则默认同一包中的类可以访问 |
4.不允许继承的类
final class 类名 {
}
以final声明的方法不允许覆盖。 以final声明的变量不允许更改。 利用final,可以设计出一种特殊的“只读” 的“不可变类”。此对象的属性不可改,而且也无法从此类派生出新子类。
5.子类与父类方法间的关系
由于Java并未对子类方法的命名做过多的限制,因此,子类与父类各自定义的方法之间,可以出现以下三种情况:
扩充(Extends) | 子类定义的方法父类没有同名 |
覆盖/重写(Override) | 子类父类定义了完全一样的方法 |
重载(Overloads) | 子类有父类的同名方法,但两者的参数类型或参数数目不一样 |
6.“方法覆盖(override)”的要点
方法覆盖要求子类与父类的方法一模一样,否则就是方法重载(overload)!
7.Java“方法覆盖”的语法规则
(1)覆盖方法的允许访问范围不能小于原方法。
(2)覆盖方法所抛出的异常不能比原方法更多。
(3)声明为final方法不允许覆盖。 例如,Object的getClass()方法不能覆盖。
(4)不能覆盖静态方法。
二、多态
1.
多态的最本质特征就是父类(或接口)变量可以引用子类(或实现了接口的类)对象。换句话说:子类对象可以被当成基类对象使用!
2.Java中子类与基类变量间的赋值
子类对象可以直接赋给基类变量。 基类对象要赋给子类对象变量,必须执行类型转换,
其语法是: 子类对象变量=(子类名)基类对象名; 也不能乱转换。
如果类型转换失败Java会抛出以下这种异常: ClassCastException.
三、抽象和接口
1.抽象类和抽象方法
有abstract修饰的类称为“抽象类”,它只定义了什么方法应该存在,不能创建对象,必须派生出一个子类,并在子类中实现其未实现的方法之后,才能使用new关键字创建对象。
在方法前加上abstract就形成抽象方法,只有方法声明,没有实现代码.
一个抽象类中可以包含非抽象方法和成员变量。包含抽象方法的类一定是抽象类,但抽象类中的方法不一定是抽象方法.
从抽象类继承的子类必须实现父类的所有抽象方法,否则,它仍然是抽象类.
2.抽象类的三种“类型”
(1)直接定义了一个抽象方法
(2)继承了一个抽象父类,但没有完全实现父类包含的抽象方法
(3)实现了一个接口,但没有完全实现此接口所包容的抽象方法。
3.使用抽象类
抽象类不能创建对象,一般用它来引用子类对象.
抽象类 抽象类变量 = new 派生自抽象类的具体子类();
4.Java中“接口”的语法特性
定义一个接口,采用关键字interface,实现一个接口,采用关键字implements
接口的成员函数自动成为public的,数据成员自动成为 static和final的。
如果接口不声明为public的,则自动变为package。
一个类可以同时实现多个接口。
5.接口的使用
接口类型 接口类型的变量=new 实现了接口的具体类型();
6.接口的扩充
可以通过继承接口来扩充已有接口,并形成一个新的接口。
interface OneInterface {
void f1();
}
interface TwoInterface extends OneInterface {
void f2();
}