继承的定义
继承是Java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。
继承就是子类继承父类的特性和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
所以继承需要符合的关系是:is-a,父类更通用,子类更具体。
我们创建一个类需要它来继承某一个类的语法:
class 子类 extends 父类
例如我们定义了一个 Animal 类,我们在创建一个 Cat 类,我们需要它继承 Animal 类
class Cat extends Animal {
...
}
我们先创建一个父类 Animal
public class Animal {
public Animal() {
System.out.println("Animal被调用");
}
public void eat() {
System.out.println("我就是在吃饭");
}
}
在创建一个子类
public class Cat extends Animal {
}
上面便是Cat类继承了父类Animal,我们Cat类里什么都没有写,其实它继承了父类Animal,所以Cat类拥有Animal类的全部方法和属性(除开private方法和属性)。我们创建一个测试类测试以下。
class Test{
public static void main(String[] args) {
Cat cat = new Cat();
cat.eat();
}
}
为什么需要继承?
如果有两个类相似,那么它们会有许多重复的代码,导致后果就是代码量大且臃肿,后期的维护性不高。通过继承就可以解决这个问题,将两段代码中相同的部分提取出来组成一个父类,实现代码的复用。
继承的特点:
- 子类拥有父类除private以外的所有属性和方法
- 子类可以拥有自己的属性和方法
- 子类可以重写实现父类的方法
- Java中的继承是单继承,一个类只有一个父类
提示:(1)Java实现多继承的一个办法是 implements(实现)接口. (2)为了防止子类在想要重写父类方法时写错,造成无法覆盖,我们采用注解@Override
,注解是给编译器的注释,告诉编译器,如果下面的方法没有覆盖父类方法,则给出报错
继承的优点
- 提高代码复用性和可维护性
- 父类的属性方法可以用于子类
- 可以轻松的定义子类
- 使设计应用程序变得简单
继承的缺点
打破了封装性,子类依赖于父类的实现细节(类的耦合性增强了,开发的原则是高内聚低耦合,提高可扩展性.)
耦合:类与类的关系
内聚:就是自己完成某件事的能力
方法的重写(Overriding)
虽然子类可以继承父类的方法,但如果子类对父类的方法不满意,想在里面加入适合自己的一些操作时,我们就需要将方法进行重写。并且子类在调用方法中,优先调用子类的方法。
比如上一个例子中 Animal 有bark()
这个方法代表了动物叫,但是不同的动物有不同的叫法,比如狗是汪汪汪,猫是喵喵喵。
当然在方法重写时我们需要注意,重写的方法一定要与原父类的方法语法保持一致,比如返回值类型,参数类型及个数,和方法名都必须一致。
例如:
public class Cat extends Animal {
//重写父类的eat方法
public void eat() {
System.out.println("猫就是在吃饭");
}
}
我们写个测试类来看看输出结果:
public class Test{
public static void main(String args[]){
Animal a = new Animal(); // Animal 对象
Cat c = new Cat(); // Cat 对象
Animal b = new Cat(); // Cat 对象,向上转型为Animal类型
a.eat();// 执行 Animal 类的方法
d.eat();//执行 Cat 类的方法
b.eat();//执行 Cat 类的方法
}
}
以上编译运行结果如下:
我就是在吃饭
猫就是在吃饭
猫就是在吃饭
继承的初始化顺序
父类的静态变量 --> 父类的静态代码块 --> 子类的静态变量 --> 子类的静态代码块 --> 父类的非静态变量(父类的非静态代码块) --> 父类的构造方法 --> 子类的非静态变量(子类的非静态代码块) --> 子类的构造方法
父类的非静态变量根父类的非静态代码块是同一级别,看那个部分写在类的最前面谁就先被执行, 子类的非静态变量和子类的非静态代码块也是一样的
网友评论