类的继承
- 类的继承
在Java中定义一个类时,让该类通过关键字extends继承一个已有的类,这就是类的继承
被继承的类称为父类(超类、基类),新的类称为子类(派生类)
子类继承父类的所有属性和方法,同时也可以增加自己的属性和方法
- 继承的语法
[修饰符] class 子类名 extends 父类名
- 继承的好处
实现类的重用
易于维护
- 继承的规则
Java中只支持单继承,也就是说每个类只能有一个父类,不允许有多重继承
一个父类可以有多个子类
子类继承父类所有的属性和方法,但不继承父类的构造方法
- 子类的构造方法——子类不能继承父类的构造方法
使用默认的构造方法
在子类中创建构造方法
在子类中创建构造方法时,必须调用父类的构造方法
子类可以在自己的构造方法中使用super关键字来调用父类的构造方法
super(参数1,参数2);
如果使用super关键字调用父类构造方法,必须写在该子类构造方法的第一行
如调用的是父类中无参的构造方法,则可以不写super()
如果子类中调用了父类无参的构造方法,而父类中没有无参构造方法则系统编译出错
- 方法的覆盖(override)
重写
对从父类中继承来的方法进行改造
在子类继承父类时发生
- 方法覆盖的规则
在子类中的覆盖方法与父类中被覆盖的方法应具有
相同的方法名
相同的参数列表(参数数量、参数类型、参数顺序都要相同)
相同的返回值类型
子类覆盖方法的访问权限要不小于父类中被覆盖的方法的访问权限
- final关键字
final可以修饰的元素:
类:不能被继承
变量(属性和局部变量):不能被重新赋值(一般用于定义常量)
在声明的同时赋值
系统不会对final属性默认的赋初始值
方法:不能在子类中被覆盖,即不能修改(在子类中无法进行方法的重写)
接口(interface)
- 抽象方法
只有方法声明,没有方法实现的方法
[访问权限修饰符] abstract 返回值类型 抽象方法名(参数类型);
class A{
abstract int method1(int a,int b);
}
- 抽象类
抽象类是抽象方法和非抽象方法的集合
[访问权限修饰符] abstract class 类名{
.....
}
特殊情况
全部是抽象方法
全部为非抽象方法
注意:
抽象类不能被实例化;
其包含的抽象方法必须在其子类中被实现,否则该子类中只能声明为abstract;
抽象方法不能为static;
在下列情况下,一个类必须声明为抽象类:
当一个类的一个或多个方法是抽象方法时;
当类是一个抽象类的子类,并且没有实现父类的所有抽象方法,即只实现部分;
当一个类实现一个接口,并且不能为全部抽象方法都提供实现时;
- 接口的声明
接口是一种特殊的抽象类,这种抽象类中只包含常量和抽象方法,而没有变量和方法的实现
[访问权限修饰符] interface 接口名{
接口的成员
}
接口的成员
常量(字段)
抽象方法
注意
接口不是一个类,没有构造方法,不能被实例化
接口使用interface关键字来定义,而不是class
接口默认:
常量:public static final
抽象方法:public abstract
- 拓展接口(接口的继承)
interface A extends B{}
interface A extends B,C,D{}
- 类实现接口——implements
为了使用一个接口,你要编写实现接口的类
如果一个类要实现一个接口,那么这个类就必须实现接口中所有抽象方法。否则这个类只能声明为抽象类。
多个无关的类可以实现一个接口,一个类可以实现多个无关的接口
一个类可以在继承一个父类的同时,实现一个或多个接口
- 接口的意义
接口可以实现多继承
用接口可以实现混合类型(主类型,副类型),java中可以通过接口分出主次类型
主类型使用继承,副类型,使用接口实现(无现实说法,意思就是一个实现类可以实现多个接口)
接口可以使方法的定义和实现相分离,降低模块间或系统间的耦合性
针对接口编程可以屏蔽不同实现间的差异,看到的只是实现好的功能。
- 引用数据类型的转换(对象造型)
向上转型(Upcasting)——子类转换为父类,自动转换
前提——具有继承或实现关系
向上转换损失了子类新拓展的属性和方法
仅可以使用父类中继承的属性和方法
向下转换(Downcasting):强制转换
将父类对象显示的转换成子类类型
Animal a = new Cat();
Cat c =(Cat) a;
- instanceof 运算符
判断一个类是否实现了某个接口
对象 instanceof 接口
判断一个实例对象是否属于一个类
对象 instanceof 类
它的返回值是boolean型的
- 多态
一个对象具有多种特征,根据不用的情况来做出不同的响应
多态存在的三个必要条件
要有继承,或实现
要有重用
父类的引用指向子类的对象
一旦满足以上3个条件,当调用父类中被重写的方法后,运行时创建的是哪个子类的对象,就调用该子类中重写的那个方法
在执行期间(而非编译期间)判断所引用对象的实际类型,根据其实际类型调用相应的方法
- 多态的优点
简化代码
改善代码的组织性和可读性
易于拓展