持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第8天,点击查看活动详情
继承概述
继承引入
面向对象语言三大基本特征:
封装(private)、继承(extends)、多态
Java中的类是描述生活中的任何事物的。而在生活中任何事物之间必然会存在一些联系。那么我们在前面学习的过程中,仅仅只是在描述单个的事物,并没把握事物和事物之间的关系。
接下来我们要研究的是如何通过Java中的类,展示所描述的事物和事物之间的关系。
一般事物和事物之间会有继承的关系。在Java中我们的类就是描述事物的,那么也就是说我们的类之间也应该存在继承的关系。
需求:
分别描述学生和老师两个类。
学生:
属性:年龄、性别、姓名
行为:学习、吃饭
定义构造函数给属性初始化
老师:
属性:年龄、性别、姓名、薪水
行为:上课、吃饭
定义构造函数给属性初始化.
代码如下所示:
/*
学生:
属性:年龄、性别、姓名
行为:学习、吃饭
*/
class Student
{
String name;
int age;
String sex;
Student( String name , int age , String sex )
{
this.name = name;
this.age = age;
this.sex = sex;
}
//行为
void study()
{
System.out.println(name+"在 学习 java ......");
}
void eat()
{
System.out.println("吃饭.......");
}
}
/*
老师:
属性:年龄、性别、姓名、薪水
行为:上课、吃饭
*/
class Teacher
{
String name;
int age;
String sex;
double salary;
Teacher( String name , int age , String sex , double salary )
{
this.name = name;
this.age = age;
this.sex = sex;
this.salary = salary;
}
void teach()
{
System.out.println(name+"正在讲 Java....");
}
void eat()
{
System.out.println("吃饭.......");
}
}
上述程序在描述学生和老师这2类事物,但是学生和老师这两类事物中有共同的属性和行为,我们应该只描述一次就可以了,然后让学生和老师共享这些属性和行为。
把学生和老师中的共性行为和属性进行抽取。抽取到哪里合适呢?
在描述事物的时候,发现描述的两个事物之间没有继承的关系,但是2个事物之间有共同的属性和行为,那么我们就找这2个事物的共同祖先。
学生和老师,没有继承关系,但是学生和老师都属于人这类事物。那么我们就可以把学生和老师的共性内容抽取到人这个类中,然后让学生和老师与人这个类产生关系即可。
其中,多个类可以称为子类,单独被继承的那一个类称为父类、超类(superclass) 或者基类。
继承的含义
继承描述的是事物之间的所属关系。例如,兔子属于食草动物,食草动物属于动物。可见,父类更通用,子类更具体。我们通过继承,可以使多种事物之间形成一种关系体系。
继承:就是子类继承父类的属性和行为,使得子类对象可以直接具有与父类相同的属性、相同的行为。子类可以直接访问父类中的非私有的属性和行为。
Java中的继承体现
需求:把学生和老师中的共性内容抽取到人这个类中
然后分别建立学生、老师和人的关系,可以让学生和老师使用人类中的属性和方法。
怎么建立Person类和Student类还有Teacher类之间的关系?
在java中使用关键字extends 建立类和类之间的关系,extends在java中表示继承的意思。
关键字extends的使用格式:
classs 类1 extends 类2
{
//代码
}
说明:类1叫做子类。类2叫做父类
代码如下:
/*
把学生和老师中的共性内容抽取到人这个类中
*/
class Person
{
String name;
int age;
String sex;
void eat()
{
System.out.println("吃饭.......");
}
}
/*
学生:
属性:年龄、性别、姓名
行为:学习、吃饭
*/
class Student extends Person
{
Student( String name , int age , String sex )
{
this.name = name;
this.age = age;
this.sex = sex;
}
//行为
void study()
{
System.out.println(name+"在 学习 java ......");
}
}
/*
老师:
属性:年龄、性别、姓名、薪水
行为:上课、吃饭
*/
class Teacher extends Person
{
double salary;
Teacher( String name , int age , String sex , double salary )
{
this.name = name;
this.age = age;
this.sex = sex;
this.salary = salary;
}
void teach()
{
System.out.println(name+"正在讲 Java....");
}
}
class ExtendsDemo2
{
public static void main(String[] args)
{
Student s = new Student("张三",23,"男");
s.eat();
s.study();
Teacher t = new Teacher("黑旋风",28,"男",9999.99);
t.eat();
t.teach();
}
}
Java中的继承代码体现:
当某个类需要继承其他类的时候,在当前定义这个类的地方使用 extends 关键字,然后让这个类去继承需要继承的其他类。
这时被继承的类称为 父类。 实现继承的这个类称为 子类。
例如:
classs 类1 **extends** 类2
{
//代码
}
类2就是父类,类1就是子类。
在Java的继承语法中,只要使用extends 关键字 任何2个类之间都可以完成继承。但是我们在写程序的时候,一定要心里清楚2个类之间有没有联系,能不能继承。
继承的好处
- 提高代码的复用性(减少代码冗余,相同代码重复利用)。
- 使类与类之间产生了关系。
小结
1.继承实际上是子类相同的属性和行为可以定义在父类中,子类特有的属性和行为由自己定义,这样就实现了相同属性和行为的重复利用,从而提高了代码复用。
2.子类继承父类,就可以直接得到父类的成员变量和方法。是否可以继承所有成员呢?请看下节!
子类不能继承的内容
引入
并不是父类的所有内容都可以给子类继承的:
子类不能继承父类的构造器,因为子类有自己的构造器。
值得注意的是子类可以继承父类的私有成员(成员变量,方法),只是子类无法直接访问而已,可以通过getter/setter方法访问父类的private成员变量。
演示代码
class Fu {
public int num1 = 10;
private int num2 = 20;
public void show1() {
System.out.println("show1");
}
private void show2() {
System.out.println("show2");
}
public int getNum2() {
return num2;
}
public void setNum2(int num2) {
this.num2 = num2;
}
}
class Zi extends Fu {
}
public class Demo03 {
public static void main(String[] args) {
Zi z = new Zi();
System.out.println(z.num1);
// System.out.println(z.num2); // 私有的子类无法使用
// 通过getter/setter方法访问父类的private成员变量
System.out.println(z.getNum2());
z.show1();
// z.show2(); // 私有的子类无法使用
}
}