继承的概念
面向对象的三大特征:封装,多态,继承
继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
生活中的继承
兔子和羊属于食草动物类,狮子和豹属于食肉动物类。
食草动物和食肉动物又是属于动物类。
所以继承需要符合的关系是:is-a,父类更通用,子类更具体。
虽然食草动物和食肉动物都是属于动物,但是两者的属性和行为上有差别,所以子类会具有父类的一般特性也会具有自身的特性。
在日常生活中,“继承”是施方的一种赠与,受方的一种获得,是将一方所拥有的东西给予另一方。
继承还与发扬光大息息相关,站在巨人的肩膀上,社会主义接班人
开发中的”继承“,其实和我们日常生活中所熟知的含义类似,代表着子类可以从父类中得到的承接。并可以拥有父类没有的东西
继承的概念是指一个类(子类)可以继承另一个类(父类)的属性和方法。子类可以在继承的基础上进行扩展和重写,从而实现代码的复用和灵活性。在Java中,使用extends关键字来实现继承。
为什么要使用继承呢。存在重复代码
再看一个例子
开发动物类,其中动物分别为企鹅以及老鼠,要求如下:
企鹅:属性(姓名,id),方法(吃,睡,自我介绍)
老鼠:属性(姓名,id),方法(吃,睡,自我介绍)
从这两段代码可以看出来,代码存在重复了,导致后果就是代码量大且臃肿,而且维护性不高(维护性主要是后期需要修改的时候,就需要修改很多的代码,容易出错),所以要从根本上解决这两段代码的问题,就需要继承,将两段代码中相同的部分提取出来组成 一个父类
继承的格式
在 Java 中通过 extends 关键字可以申明一个类是从另外一个类继承而来的,一般形式如下:
被继承的类称为父类(超类、基类)
继承父类的类为子类(导出类、派生类)
继承的意义
复用代码——子类拥有父类的所有可见成员
不同的类具有某些共同的属性和行为
实现多态
继承的实例
上面的例子公共父类
Animal类就可以作为一个父类,然后企鹅类和老鼠类继承这个类之后,就具有父类当中的属性和方法,子类就不会存在重复的代码,维护性也提高,代码也更加简洁,提高代码的复用性(复用性主要是可以多次使用,不用再多次写同样的代码) 继承之后的代码:
练习:
定义一个cat, 一个dog类,有eat方法,有run方法,有name属性,有color属性
public class Cat {
private String name;
private String color;
public void run(){
System.out.println(" run");
}
public void eat(){
System.out.println(" eat");
}
}
public class Dog {
private String name;
private String color;
public void run(){
System.out.println(" run");
}
public void eat(){
System.out.println(" eat");
}
}
发现有代码重复
//代码重复 定义一个Animal类
//代码重复 定义一个Animal类
public class Animal {
private String name;
private String color;
public void run(){
System.out.println(" run");
}
public void eat(){
System.out.println(" eat");
}
}
extends 每个类只能直接继承于一个父类
public class Dog extends Animal {
}
public class Cat extends Animal {
}
Test类访问
Dog dog = new Dog();
dog.run();
dog.eat();
Cat cat = new Cat();
cat.run();
cat.eat();
继承子类的权限问题
注意子类可以访问父类的非私有成员(属性和方法),包括公有(public)、受保护(protected)和默认(没有修饰符)访问级别的成员
把Animal 中的name 改为private
Test 方法中 System.out.println(dog.name);
因为是私有的不能访问
System.out.println(dog.color);
1.子类与父类在同一包中的继承性
子类继承了父类中所有非private的成员作为自己的成员
class A {
int x;
private int y;
}
class B extends A {
void f() {
x = 10;
y = 10;//非法,子类没有继承 y
}
}
在这段程序中 y = 10;会报错,即友好变量x被子类所继承,而私有变量y没有被继承。
2.子类与父类在不同一包中的继承性
子类只会继承父类中的protected和public访问权限的成员变量作为子类的成员变量,而private和友好访问权限的成员变量则不会被子类继承。
继承的例子练习
class Animal{
public String name;
public int age;
public void eat(){
System.out.println(this.name + " 正在吃饭! ");
}
}
// 继承 子类 extends 父类
class Dog extends Animal{
public void bark() {
System.out.println(this.name + " 正在汪汪叫! ");
}
}
class Cat extends Animal{
public void miaomiao(){
System.out.println(this.name + " 正在汪汪叫! ");
}
}
注意
限制一:一个子类只能够继承一个父类,存在有单继承局限。
实际上这种做法是相对于早期其它编程语言来讲(对彪“C++”,“C++”一个子类可以同时继承多个父类),实际上所谓的多继承的需求是希望一个子类可以同时继承多个父类(这种继承的结构称为“多重继承”)。
范例:错误的继承结构
class Book {} // 图书功能类
class Toilet {} // 厕所功能类
class MathBook extends Book, Toilet {} // 多继承的语法,Java之中此类语法是错误的
那么如果万一现在是真的有可能出现一个子类可能需要同时继承多个父类的需求的话呢?这种时候往往可以采用多层继承。例如,现在要求设计有一个描述线性代数的类,那么按照正常的结构来讲,此类应该属于数学类的图书,而数学类的图书应该又属于图书的一个详细描述。
范例:多层继承解决多重继承的设计问题
class Book {} // 图书功能类
class MathBook extends Book {} // 数学类图书
class LinearAlgebra extends MathBook {} // 线性代数图书
public class YootkDemo { // 李兴华编程训练营
public static void main(String args[]) {
}
}