文章目录
- 1.继承的概念
- 1.1.生活中的继承
- 1.2.程序中的继承
- 2.为什么需要继承
- 2.1.案例引入
- 2.2.抽取父类
- 2.3.继承的作用
- 3.继承的使用
- 4.继承-子类中访问父类成员变量特点
- 5.继承-子类中访问父类成员方法特点
- 6.继承特点
1.继承的概念
1.1.生活中的继承
- 生活中的“继承”是施方的一种赠与,受方的一种获得。
- 将一方所拥有的东西给予另一方。
1.2.程序中的继承
继承是面向对象软件技术中的一个概念。它使得复用以前的代码非常容易,能够大大缩短开发周期,降低开发费用。
Java语言是非常典型的面向对象的语言,在Java语言中继承就是子类继承父类的属性和方法,使得子类对象(实例)具有父类的属性和方法,或子类从父类继承方法,使得子类具有父类相同的方法。父类有时也叫基类、超类;子类有时也被称为派生类。
我们来举个例子:我们知道动物有很多种,是一个比较大的概念。在动物的种类中,我们熟悉的有猫(Cat)、狗(Dog)等动物,它们都有动物的一般特征(比如能够吃东西,能够发出声音),不过又在细节上有区别(不同动物的吃的不同,叫声不一样)。在Java语言中实现Cat和Dog等类的时候,就需要继承Animal这个类。继承之后Cat、Dog等具体动物类就是子类,Animal类就是父类。
继承满足一个is a 特性
2.为什么需要继承
2.1.案例引入
接下来我们通过实例来说明这个需求。开发动物类,其中动物分别为企鹅以及老鼠,要求如下:
狗类:属性(姓名,年龄,品种),方法(吃,看门)
猫类:属性(姓名,年龄,命数),方法(吃,爬树)
- 狗类
public class Dog {
private String name; //姓名
private int age; //年龄
private String breed; //品种
public void eat(){
System.out.println("吃东西!");
}
public void watchDoor(){
System.out.println("我可以看门");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getBreed() {
return breed;
}
public void setBreed(String breed) {
this.breed = breed;
}
}
- 猫类
public class Cat {
private String name; //姓名
private int age; //年龄
private int live; //命的条数
public void eat() {
System.out.println("猫吃东西!");
}
public void climbTree() {
System.out.println("我可以爬树");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getLive() {
return live;
}
public void setLive(int live) {
this.live = live;
}
}
从这两段代码可以看出来,代码存在重复了,导致后果就是代码量大且臃肿,而且维护性不高(维护性主要是后期需要修改的时候,就需要修改很多的代码,容易出错),所以要从根本上解决这两段代码的问题,就需要继承,将两段代码中相同的部分提取出来组成 一个父类。
2.2.抽取父类
2.3.继承的作用
- 继承就是把子类中共有的属性或者方法抽出去,提取到一个共有的类中(父类),把子类特有的属性和方法,保留在子类中。让子类继承父类!
- 将重复代码抽取到父类中,减少代码的重复
- 使得程序更加方便扩展
3.继承的使用
-
extends
关键字用作类的继承
- 动物类
public class Animal {
private String name; //姓名
private int age; //年龄
public void eat() {
System.out.println("吃东西!");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
- 猫类
public class Cat {
private int live; //命的条数
public void climbTree() {
System.out.println("我可以爬树");
}
public int getLive() {
return live;
}
public void setLive(int live) {
this.live = live;
}
}
- 狗类
public class Dog {
private String breed; //品种
public void watchDoor(){
System.out.println("我可以看门");
}
public String getBreed() {
return breed;
}
public void setBreed(String breed) {
this.breed = breed;
}
}
- 测试类
public class TestAnimal {
public static void main(String[] args) {
Cat cat=new Cat();
cat.setName("花花");
cat.setAge(3);
cat.setLive(9);
cat.eat(); //吃东西
cat.climbTree();//爬树
Dog d = new Dog();
d.setName("旺财");
d.setAge(4);
d.setBreed("牧羊犬");
d.eat(); //吃东西
d.watchDoor(); //看门
}
}
4.继承-子类中访问父类成员变量特点
了解了继承给我们带来的好处,提高了代码的复用性。继承让类与类或者说对象与对象之间产生了关系。那么,当继承出现后,类的成员之间产生了那些变化呢?
重点学习成员变量、成员方法的变化。
看如下代码:
package com.it.demo12;
class Fu {
//Fu中的成员变量。
int num = 5;
}
class Zi extends Fu {
//Zi中的成员变量
int num2 = 6;
//Zi中的成员方法
public void show() {
//访问父类中的num
System.out.println("Fu num=" + num);
//访问子类中的num2
System.out.println("Zi num2=" + num2);
}
}
class Demo {
public static void main(String[] args) {
Zi z = new Zi(); //创建子类对象
System.out.println(z.num2);
z.show(); //调用子类中的show方法
}
}
代码说明:Fu类中的成员变量是非私有的,子类中可以直接访问,若Fu类中的成员变量私有了,子类是不能直接访问的。
5.继承-子类中访问父类成员方法特点
当在程序中通过对象调用方法时,会先在子类中查找有没有对应的方法,若子类中存在就会执行子类中的方法,若子类中不存在就会执行父类中相应的方法。
class Fu {
public void show() {
System.out.println("Fu类中的show方法执行");
}
}
class Zi extends Fu {
public void show2() {
System.out.println("Zi类中的show2方法执行");
}
}
public class Test {
public static void main(String[] args) {
Zi z = new Zi();
z.show(); //子类中没有show方法,但是可以找到父类方法去执行
z.show2();
}
}
6.继承特点
- Java只支持单继承:就一个子类 只能最多直接继承一个父类
- Java支持多层继承,继承传递
- 父类定义了继承树中共性内容,子类定义了该类个性内容。