前言
本篇文章来给大家讲解java面向对象三大特性中的继承。本次的内容相比上篇的封装内容要多很多,同时难度也有所增加,我会用最通俗,最直观的案例带大家学习。
继承这一章节我会分三次进行讲解,初识继承、深入继承特性以及继承JVM内存分布。如果能将继承深入的理解,那么你对OOP设计思想也会得到质的飞跃,同时也为今后的学习打下坚实的基础!接下来带大家初识面向对象的继承。
基本概念
- 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的属性和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
- Java继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类
相信没接触继承的小伙伴,看到上面概念会觉得很抽象。下面我给大家引出继承。
引出问题
有一个需求:统计一年级和二年学生的基本信息。首先我们想到的是编写两个类FirstGrade和SecondGrade两个类,包含着姓名,年龄、性别等基本信息,如下:
public class FirstGrade {
public String name;
public int age;
public String sex;
//introduce()方法输出学生的基本信息
public void introduce(){
System.out.println("我是一年级的学生,"+"姓名:"+name+",年龄:"+age+",性别:"+sex);
}
//会说的语言
public void speak(){
System.out.println("我会说中文!");
}
}
public class SecondGrade {
public String name;
public int age;
public String sex;
//introduce()方法输出学生的基本信息
public void introduce(){
System.out.println("我是二年级的学生,"+"姓名:"+name+",年龄:"+age+",性别:"+sex);
}
//会说的语言
public void speak(){
System.out.println("我会说中文!");
}
}
上面两个类可以完成对一二两级学生的统计,此时又添加一个需求:要求统计三四五六两级学生的信息。怎么办?继续编写三四五六年级的类?
引出继承
仔细观察以上代码,我们可以发现,它们有共同的属性,独有的方法。如果接着往后编写其余年级的类,会使代码臃肿,复用性不高。此时我们可以使用继承来解决这个问题,编写一个Student类,将共同的属性方法放在一个类中,让其它类(子类)继承该类(父类),子类拥有父类非私有化的属性和方法。代码修改如下:
Student类
public class Student {
//共同的属性
public String name;
public int age;
public String sex;
//共同的方法
public void speak(){
System.out.println("我会说中文!");
}
}
FirstGrade类和SecondGrade类
让这两类继承Student类,使用extend关键字。
/* 一年级 */
public class FirstGrade extends Student{
//独有的方法
public void introduce(){
System.out.println("我是一年级的学生,"+"姓名:"+name+",年龄:"+age+",性别:"+sex);
}
}
/* 二年级 */
public class SecondGrade extends Student{
//独有的方法
public void introduce(){
System.out.println("我是二年级的学生,"+"姓名:"+name+",年龄:"+age+",性别:"+sex);
}
}
StudentTest测试类
/*测试*/
public class StudentTest {
public static void main(String[] args) {
FirstGrade firstGrade = new FirstGrade();
firstGrade.name="张三";
firstGrade.age=10;
firstGrade.sex="男";
firstGrade.speak();
firstGrade.introduce();
System.out.println("================");
SecondGrade secondGrade = new SecondGrade();
secondGrade.name="李四";
secondGrade.age=11;
secondGrade.sex="男";
firstGrade.speak();
secondGrade.introduce();
}
}
控制台打印:
我会说中文!
我是一年级的学生,姓名:张三,年龄:10,性别:男
================
我会说中文!
我是一年级的学生,姓名:李四,年龄:11,性别:男
继承带来的优缺点
优点:
- 代码共享,减少创建类的工作量,每个子类都拥有父类的方法和属性;
- 继承提高了代码的复用性
- 代码的扩展性和维护性提高了,实现父类的方法就可以“为所欲为”了,君不见很多开源框架的扩展接口都是通过继承父类来完成的
缺点:
-
增强了类之间的耦合,软件开发的原则是高内聚,低耦合。
以上就是本篇内容,提出问题的同时并引出继承,当然继承的内容远远不及这么多,本篇的目的就是让大家直观明了的初识继承,后续将会讲解继承的特性。