在创建类的时候会出现多次重复性代码,导致代码重复性高,此时可以通过继承提高代码复用性。
比如:
要描述动物园里的动物状态,我们需要Dog类,Cat类等代码如下
class Dog{
String name;
int age;
void eat(){
System.out.println("在吃饭");
}
}
class Cat{
String name;
int age;
void eat(){
System.out.println("在吃饭");
}
}
可以看到里面的eat方法和成员变量都是重复的,此时我们可以提取不同种动物的共同特性作为父类Animal类,代码如下
public class ExtendsTest {
public static void main(String[] argc){
Dog dog = new Dog();
Cat cat = new Cat();
dog.eat();
cat.eat();
}
}
class Animal{
String name;
int age;
void eat(){
System.out.println("在吃饭");
}
}
class Dog extends Animal{
}
class Cat extends Animal{
}
结果如下:
可以看到Dog和Cat都能够调用他们的父类的方法(即将父类方法继承下来)这样
注意: Java中所有的类都继承于java.lang.Object,当一个类没有继承关键字,则默认继承 Object(这个类在 java.lang 包中,所以不需要 import)祖先类。
继承的两个关键字
- extends
- implements(此关键字可以通过继承多个接口变相实现多继承)
public interface A {
public void eat();
public void sleep();
}
public interface B {
public void show();
}
public class C implements A,B {
}
父类成员的访问
子类中通过super
访问父类成员,this
指向自己
class Dog extends Animal {
void eat() {
System.out.println("dog : eat");
}
void eatTest() {
this.eat(); // this 调用自己的方法
super.eat(); // super 调用父类方法
}
}
如果父类有带参构造,子类要使用super
显示调用,无参构造不需要调用,默认调用
final关键字
- 使用
final
修饰的方法不能被子类重写 - 使用
final
修饰的类不能被继承
修饰符(public/private/default/protected) final 返回值类型 方法名(){//方法体}
- 修饰的变量必须初始化(一般就会设为
public static final
)
方法的重写
子类中写一个与父类同样的方法(也可以增减参数),调用时默认调用子类重写后的方法,但也可以用super
继续调用父类方法,也可以在重写的方法中先调用父类方法再进行补充。
class Animal{
String name;
int age;
void eat(){
System.out.println("在吃饭");
}
}
class Dog extends Animal{
void eat(){
super.eat();
System.out.println("Dog在吃饭");
}
}
继承特性:
- 子类拥有父类非 private 的属性、方法。
- Java 的继承是单继承,不支持多继承(一个子类继承多个父类),但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如 B 类继承 A 类,C 类继承 B 类,所以按照关系就是 B 类是 C 类的父类,A 类是 B 类的父类,但是可以通过
implements
继承多个接口来变相实现多继承
抽象类
抽象类中不只有抽象方法也有非抽象方法
抽象方法
- 无方法体
- 有抽象方法的类必须是抽象类
abstract class A{
abstract void show();
}