面向对象的三大特征之一继承
继承
继承的特性
-
概念:可以使得子类具有父类的属性(成员变量)和方法(成员方法),还可以在子类中重新定义,追加属性和方法。
-
继承的格式: public class 子类名 extends 父类名{}
-
父类:基类、超类 子类:派生类
-
继承中子类的特点:
- 子类可以有父类的内容(继承父类非私有的属性和方法)
- 子类还可以有自己特有的内容(自己重新定义新的属性和方法)
public class Animal{ private String name; public void show(){ System.out.println("你好!"); } } // 子类继承父类,可以继承非私有的, public class Dog extends Animal{ private int age; // 子类自己特有的内容 } public class Test{ public static void main(String args[]){ // 创建一个狗的对象 Dog d = new Dog(); // 调用方法 d.show(); // 我们看 Dog 类中并无 show() 方法,但是调用并不出错,是因为继承了父类 } }
继承的好处
-
提高了代码的复用性(多个类相同的成员可以放到同一个类中)
-
提高了代码的维护性(如果方法的代码需要修改,修改一处即可)
// 比如人类,和学生、老师、工人 public class Person{ private String name; private int age; public void eat(){ System.out.println("吃饭!"); } } // 学生继承人类 public class Student extends Person{ } // 老师继承人类 public class Teacher extends Person{ } // 工人继承人类 public class Worker extends Person{ }
我们可以看到,学生、老师、工人,都可以继承人类,提高了代码的复用性,我们知道,继承非私有的成员方法和成员变量,都可以继承 eat() 方法,那我们只需要Person类中修改 eat() 方法,那学生、老师、工人继承的也都修改了,这样提高了代码的维护性
继承的弊端
- 继承让类与类之间产生了关系,类的耦合性增强了
- 父类变化时,子类也随着变化,削弱了子类的独立性
什么时候使用继承
- 继承体现关系:is a (有两个类A和B,满足A是B的一种,或者B是A的一种,就说说明他们存在继承关系)
继承中成员变量访问的特点
-
在子类中访问一个变量
- 子类局部范围找(可简单理解为方法内)
- 子类成员范围找(类内)
- 父类成员范围找
注意:不考虑父亲的父亲,也就是说,假设子类和其父类中都无这个变量,就报错!
继承中成员方法访问的特点
-
通过子类对象访问一个方法
- 子类成员范围找
- 父类成员范围找
注意:不考虑父亲的父亲
super 关键字
-
通过上述的一些特性之后,我们发现,继承是子类和父类的关系,我们涉及到了在子类中访问父类的概念,this 关键字是指代本类对象,我们需要找到一个指代父类对象的关键字–super。
形式 作用 super.age 访问父类成员变量 super.成员方法(…) 访问父类成员方法 super(…) 访问父类的构造方法 注意:括号中的 “…” 是代表参数的意思,参数个数是 从 0 到多个
继承中构造方法的访问特点
-
接下来我们看段代码,来了解下,继承中构造方法的访问特点
public class Animal{ private String name; private int age; // 构造方法 public Animal(){ // ③ } public Animal(String name , int age){ // ④ this.name = name; this.age = age; } } // 继承动物类 public class Dog extends Animal{ // 产生继承关系 public Dog(){ super(); // ① } public Dog(String name , int age){ super(name,age); // ② } }
-
我们先看 ①和③ 的区别,在③中并无 super() 这行代码,根据我们super关键字的学习,我们知道 super() 其实就是调用 父类的 无参构造方法,其实也就是 调用 ③所在的 无参构造方法,那为什么 ③ 这行没写呢,其实自带 super() 只不过我们看不到而已。
-
根据上述这句话,我们思考一个问题:那 Animal 类中无参构造也有 super() 这行代码,那Animal 明明没有父类啊,那他调用的是谁呢?
// 这个就涉及到我们说的,所有类的祖宗类是谁呢,就是我们的 Object public class Animal extends Object{ // 原本这行应该这样写,只不过默认不写罢了 }
-
看完①和③ 的区别之后,我们看 ②和④的区别,那 ②相当于调用了 ④,那④中有没有 super() 这行代码呢,可以根据下面两图,发现,super(),只能在构造方法的第一行
综上所述:
? ①:子类继承父类中的数据,可能使用父类中的数据,所以子类初始化之前,一定要完成父类数据的初始化
? ②:每一个子类构造方法的第一条语句默认都是: super()
继承的注意事项
-
Java中类只支持单继承,不支持多继承
-
Java中类支持多层继承
方法重写(Override)
- 学继承后,我们知道,子类会继承父类的成员方法,但是我们不想要父类的方法,怎么办呢?那就是方法的重写。举个列子:你继承了你父亲的公司,但是你不想按照父亲的来,你重新调整公司的模式和经营方向,这就可理解为方法重写。
- 特点:
- 子类中出现了和父类一模一样的方法声明(下述代码,会讲解什么是定义什么是声明)
- 子类有自己特有内容的时候,重写父类中的方法
- 父类中的私有方法子类无法重写(父类私有成员子类是不能被继承的)
- 子类重写方法时候,访问权限(即权限修饰符,可点击了解这篇文章)不能比父类低
public class Person{
private String name;
private int age;
public void show(){
System.out.println("我是人类!");
}
// 私有无法被继承
private void eat(){
System.out.println("人类要吃饭!");
}
}
public class Student extends Person{
// 方法重写
public void show(){
System.out.println("我是学生!");
}
}
注意:
? ①:public void show() 就是方法的声明
? ②:public void show(){} 就是方法的定义
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!