解决了代码的重用问题。
一、继承
继承是利用现有的类创建新类的过程,现有的类称作基类(base class,父类),创建的新类称作派生类(derived class,子类)。
最高层是最普遍的、最一般的情况,往下每一层都比上一层更具体,并包含有高层的特征,通过这样的层次结构使下层的类能自动享用上层类的特点和性质;
继承其实就是自动地共享基类中成员属性和成员方法的机制。
[访问修饰符] 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(); //实例化子类对象
}
}
如果父类的构造方法执行失败,那么子类的对象也将无法实例化。
解释:
在实例化Circle类对象时,虚拟机一定会先调用其父类(Point类)的构造方法;
Point类的构造方法需要两个参数来初始化其成员,但此时并没有获得这两个参数,造成Point类的构造方法无法执行;
父类的构造方法执行失败从而导致子类(Circle类)的对象也无法创建;
问题的关键是:在实例化子类对象时,如何将参数传递给父类的构造方法?这将使用到super关键字。
三、super关键字
1、用途1:在子类的构造方法中,super关键字可以显式地调用父类的构造方法,用于将参数传递给它。
super(实际参数);
// 该语句必须是子类构造方法的第一条语句
2、用途2:如果父类和子类中有同名成员,在子类中默认访问是属于自己的那一个成员;super关键字可以明确地指定要访问父类中的成员。
super.成员名;
// 前提条件是:父类中的该成员不是private的。
继承是单方向的,即派生类可以继承和访问基类中的成员,但基类则无法访问派生类中的成员;
在Java中只允许单一继承方式,即一个派生类只能继承于一个基类,而不能象C++中派生类继承于多个基类的多重继承方式。
四、访问控制权限
1、信息隐藏
信息隐藏是面向对象程序设计的重要特点之一,它可以:
- 防止类的使用者意外损坏数据;
- 对任何实现细节所作的修改不会影响到使用该类的其它代码;
- 使类更易于使用。
在Java中实现信息隐藏的是访问控制权限机制。
2、类的访问控制权限
只有public和缺省两种:
- 被public修饰的类可以从任何地方访问,不受限制;
- 不加访问修饰符,缺省修饰的类只能从本包中访问,不同包则无法访问到。
但要注意的是:
- 在一个源文件中只能有一个被public修饰的类,并且文件名必须与public的类同名;
- 如果要定义多个public的类,则必须分别写在不同的源文件中,一个源文件只写一个类是良好的编程习惯。
3、类成员的访问控制权限
7、访问权限
为了避免从类外部直接访问类成员而造成的数据损坏,Java对类成员的访问制定了约束;加上访问修饰符有时候可能会给操作数据带来不便,但可以在很大程度上保证数据的安全。
关键字public和private是访问修饰符,用来说明某个成员是否可以从类外部进行访问。
public修饰的成员可以在任何地方进行访问,不受任何约束;
private修饰的成员只能够被本类中的其它成员访问,而不能从类的外部进行访问。
一般地,我们会将成员属性声明为private,而将成员方法声明为public,但这样做并不是绝对的。
有时候,类外部可能要操作到某些私有数据成员,那么就可以增加一个公有的方法,再由这个方法来操作私有数据,避免因类外部的误操作而造成的数据损坏。
因为main方法要由类外部的虚拟机来调用,所以main方法必须声明成public。