Java继承

继承的定义

继承是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 类的方法
       }
}

以上编译运行结果如下:

我就是在吃饭
猫就是在吃饭
猫就是在吃饭

继承的初始化顺序

父类的静态变量 --> 父类的静态代码块 --> 子类的静态变量 --> 子类的静态代码块 --> 父类的非静态变量(父类的非静态代码块) --> 父类的构造方法 --> 子类的非静态变量(子类的非静态代码块) --> 子类的构造方法
父类的非静态变量根父类的非静态代码块是同一级别,看那个部分写在类的最前面谁就先被执行, 子类的非静态变量和子类的非静态代码块也是一样的

你可能感兴趣的:(Java继承)