1.继承的概念,分类与实现
(1).继承的概念
- 在面向对象程序设计中,继承表示两个类之间的一种关系,是一种由已有类创建新类的机制。
- 子类不仅可以从父类中继承成员变量和方法,还可以重新定义它们以及扩充新的内容。
- Java继承具有单继承的特点, 每个子类只有一个直接父类。
-
类:类是具有共同属性的一组对象。它是创建对象的模板或蓝图。
-
子类:子类是继承其他类的类。它也称为派生类,扩展类或子类。
-
超类/父类:超类是子类继承功能的类。它也称为基类或父类。
(2).继承的分类
1.单继承:一个子类最多只能有一个父类。
2.多继承:一个子类可有两个以上的父类。
使用继承的注意点:
- Java的类只支持单继承,而接口支持多继承,即Java多继承的功能是通过接口方式来间接实现的。
- 子类一般比父类包含更多的属性和方法。
- 父类中的 private 成员在子类中是不可见的,因此在子类中不能直接使用它们。
- 父类和其子类间必须存在“是一个”即“is-a”的关系,否则不能用继承。但也并不是所有符合“is-a”关系的都应该用继承。例如,正方形是一个矩形,但不能让正方形类来继承矩形类,因为正方形不能从矩形扩展得到任何东西。正确的继承关系是正方形类继承图形类。
(3)继承的实现
子类定义的一般格式:
[类修饰符] class 子类名 extends 父类名 {
成员变量定义;
成员方法定义;
}
在子类的定义中,用关键字extends 来,明确指出它所继承的父类。例如:
class Student extends person { }
其中person类叫作父类,也称为超类或基类;Student 类叫作子类,也叫派生类。
例如Person类:
class Person {
private String name ;
private int age ;
public void setName(String name) {
this.name = name ;
}
public void setAge(int age) {
this.age = age ;
}
public String getName() {
return this.name ;
}
public int getAge(){
return this.age ;
}
}
Student类:
class Student {
private String name ;
private int age ;
private String school ;
public void setName(String name) {
this.name = name ;
}
public void setAge(int age) {
this.age = age ;
}
public void setSchool(String school) {
this.school = school ;
}
public String getName() {
return this.name ;
}
public int getAge(){
return this.age ;
}
public String getSchool() {
return this.school ;
}
}
观察继承的基本实现:
package com.wz.extendsdemo;
class Person {
private String name;
private int age;
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return this.name;
}
public int getAge() {
return this.age;
}
}
class Student extends Person { // Student类继承了Person类
}
public class TestDemo {
public static void main(String args[]) {
Student stu = new Student(); // 实例化的是子类
stu.setName("张三"); // Person类定义
stu.setAge(20); // Person类定义
System.out.println("姓名:" + stu.getName() + ",年龄:" + stu.getAge());
}
}
运行结果:
姓名:张三,年龄:20
2.构造方法在继承中的应用
(1).构造方法的继承遵循以下原则:
- 子类无条件地继承父类的无参数的构造方法。
- 如果子类没有定义构造方法,则它将继承父类无参数的构造方法为自己的构造方法。如果子类定义了构造方法,则在创建子类对象时,将先执行来自继承父类的无参数的构造方法,然后再执行自己的构造方法。
- 对于父类带参数的构造方法,子类可以通过在自己的构造方法中使用super关键字来调用它,但这个调用语句必须是子类构造方法中的第一条可执行语句。
(2).不管是构造父类对象还是子类对象,都要遵循以下步骤执行:
- 静态语句的执行。
- 成员变量的初始化。
- 语句块的初始化。
- 构造方法的执行。