java系列5:继承(inheritance)

解决了代码的重用问题。

一、继承

继承是利用现有的类创建新类的过程,现有的类称作基类(base class,父类),创建的新类称作派生类(derived class,子类)。

java系列5:继承(inheritance)_第1张图片
继承的优点

最高层是最普遍的、最一般的情况,往下每一层都比上一层更具体,并包含有高层的特征,通过这样的层次结构使下层的类能自动享用上层类的特点和性质;

继承其实就是自动地共享基类中成员属性和成员方法的机制。

[访问修饰符] class 派生类名 extends 基类名 {
    成员列表
}

class Student extends Person {

}

二、继承中的构造方法

父类中的构造方法不能被子类继承,即便它是public的;

父类的构造方法负责初始化属于它的成员变量,而子类的构造方法则只需考虑属于自己的成员变量,不必去关注父类的情况。

构造方法的执行顺序

当实例化子类的对象时,必须先执行父类的构造方法,然后再执行子类的构造方法;

如果父类还有更上级的父类,就会先调用最高父类的构造方法,再逐个依次地将所有继承关系的父类构造方法全部执行;

package test;

class ParentClass {  //定义父类
    public ParentClass() {  //构造方法
        System.out.println("这是父类的构造方法。");
    }
}

class ChildClass extends ParentClass {  //子类继承于父类
    public ChildClass() {  //构造方法
        System.out.println("这是子类的构造方法。");
    }
}

public class ConstructorTest {
    public static void main(String[] args) {
        ChildClass cc = new ChildClass();  //实例化子类对象
    }
}
java系列5:继承(inheritance)_第2张图片
运行结果

如果父类的构造方法执行失败,那么子类的对象也将无法实例化。

java系列5:继承(inheritance)_第3张图片

解释:
在实例化Circle类对象时,虚拟机一定会先调用其父类(Point类)的构造方法;
Point类的构造方法需要两个参数来初始化其成员,但此时并没有获得这两个参数,造成Point类的构造方法无法执行;
父类的构造方法执行失败从而导致子类(Circle类)的对象也无法创建;
问题的关键是:在实例化子类对象时,如何将参数传递给父类的构造方法?这将使用到super关键字。


三、super关键字

1、用途1:在子类的构造方法中,super关键字可以显式地调用父类的构造方法,用于将参数传递给它。

super(实际参数);
// 该语句必须是子类构造方法的第一条语句
java系列5:继承(inheritance)_第4张图片

2、用途2:如果父类和子类中有同名成员,在子类中默认访问是属于自己的那一个成员;super关键字可以明确地指定要访问父类中的成员。

super.成员名;
// 前提条件是:父类中的该成员不是private的。
java系列5:继承(inheritance)_第5张图片
  • 继承是单方向的,即派生类可以继承和访问基类中的成员,但基类则无法访问派生类中的成员;

  • 在Java中只允许单一继承方式,即一个派生类只能继承于一个基类,而不能象C++中派生类继承于多个基类的多重继承方式。


四、访问控制权限

1、信息隐藏

信息隐藏是面向对象程序设计的重要特点之一,它可以:

  • 防止类的使用者意外损坏数据;
  • 对任何实现细节所作的修改不会影响到使用该类的其它代码;
  • 使类更易于使用。

在Java中实现信息隐藏的是访问控制权限机制。

2、类的访问控制权限

只有public和缺省两种:

  • 被public修饰的类可以从任何地方访问,不受限制;
  • 不加访问修饰符,缺省修饰的类只能从本包中访问,不同包则无法访问到。

但要注意的是:

  • 在一个源文件中只能有一个被public修饰的类,并且文件名必须与public的类同名;
  • 如果要定义多个public的类,则必须分别写在不同的源文件中,一个源文件只写一个类是良好的编程习惯。

3、类成员的访问控制权限

java系列5:继承(inheritance)_第6张图片
4种类成员的访问控制权限
java系列5:继承(inheritance)_第7张图片
java系列5:继承(inheritance)_第8张图片
例子

7、访问权限

为了避免从类外部直接访问类成员而造成的数据损坏,Java对类成员的访问制定了约束;加上访问修饰符有时候可能会给操作数据带来不便,但可以在很大程度上保证数据的安全。

关键字public和private是访问修饰符,用来说明某个成员是否可以从类外部进行访问。
public修饰的成员可以在任何地方进行访问,不受任何约束;
private修饰的成员只能够被本类中的其它成员访问,而不能从类的外部进行访问。

一般地,我们会将成员属性声明为private,而将成员方法声明为public,但这样做并不是绝对的。
有时候,类外部可能要操作到某些私有数据成员,那么就可以增加一个公有的方法,再由这个方法来操作私有数据,避免因类外部的误操作而造成的数据损坏。
因为main方法要由类外部的虚拟机来调用,所以main方法必须声明成public。

java系列5:继承(inheritance)_第9张图片
Student类
java系列5:继承(inheritance)_第10张图片
修改Student类

你可能感兴趣的:(java系列5:继承(inheritance))