继承的概念
继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
生活中也有许多继承的例子,如图:
继承的基本语法
class 子类 extends 父类{
}
【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
注意:
-
使用 extends 指定父类.
-
Java 中一个子类只能继承一个父类 (而C++/Python等语言支持多继承).
-
子类会继承父类的所有 public 的字段和方法.
-
对于父类的 private 的字段和方法, 子类中是无法访问的.
-
子类的实例中, 也包含着父类的实例. 可以使用 super 关键字得到父类实例的引用
继承的好处
当我不使用继承时,代码如下:
class Animal {
public String name;
public Animal(String name) {
this.name = name;
}
public void eat(String food) {
System.out.println(this.name+“正在干饭,并表示”+food+“很不错”);
}
}
// Cat.java
class Cat {
public String name;
public Cat(String name) {
this.name = name;
}
public void eat(String food) {
System.out.println(this.name+“正在干饭,并表示”+food+“很不错”);
}
}
// Bird.java
class Bird {
public String name;
public Bird(String name) {
this.name = name;
}
public void eat(String food) {
System.out.println(this.name+“正在干饭,并表示”+food+“很不错”);
}
public void fly() {
System.out.println(this.name + “正在飞 ︿( ̄︶ ̄)︿”);
}
}
由上面代码可以发现,该代码存在大量的冗余代码,如:Animal类,Cat类,Bird类相比较可以发现该3个类都具备相同的eat方法,而且行为完全是 一样的,都有相同的属性name而且意义相同,这种代码维护性不高(维护性主要是后期需要修改的时候,就需要修改很多的代码,容易出错),所以要从根本上解决这代码的问题,就需要继承,以达到代码重用的效果。
使用继承后的代码:
class Animal {
public String name;
public Animal(String name) {
this.name = name;
}
public void eat(String food) {
System.out.println(this.name+“正在干饭,并表示”+food+“很不错”);
}
}
// Cat.java
class Cat extends Animal{
public Cat(String name) {
// 使用 super 调用父类的构造方法.
super(name);
}
}
// Bird.java
class Bird extends Animal{
public Bird(String name) {
super(name);
}
public void fly() {
System.out.println(this.name + “正在飞 ︿( ̄︶ ̄)︿”);
}
}
什么是多态
多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作。
向上转型
通常来说,向上转型表示往父类的方向转
在之前代码的基础上,写一个例子
Bird bird = new Bird(“圆圆”);
Animal bird2 = bird;
// 或者写成下面的方式
Animal bird2 = new Bird(“圆圆”);
此时 bird2 是一个父类 (Animal) 的引用, 指向一个子类 (Bird) 的实例. 这种写法称为 向上转型.
动态绑定
当子类和父类中出现同名方法的时候, 再去调用会对前面的代码稍加修改,如以下代码:
class Animal {
public String name;
public Animal(String name) {
this.name = name;
}
public void eat(String food) {
System.out.println(“我是一只小动物”);
System.out.println(this.name+“正在干饭,并表示”+food+“很不错”);
}
}
// Cat.java
class Cat extends Animal{
public Cat(String name) {
super(name);
}
@Override
public void eat(String food) {
System.out.println(“我是一只小猫”);
System.out.println(this.name+“正在干饭,并表示”+food+“很不错”);
}
}
// Bird.java
class Bird extends Animal{
public Bird(String name) {
super(name);
}
@Override