师承陈立臣
继承
背景
下面C语言的代码中定义了两个在内容上高度重复的结构体
#include <stdio.h>
struct Person //人
{
int name;
char* address;
void (*pEat)();
void (*pDrink)();
};
struct Student //学生也是人,所以有一定的重复性
{
int name;
char* address;
void (*pEat)();
void (*pDrink)();
int score; //学生独有的特征,有分数,要上学
void (*goToSchool)();
};
然而对于C语言来说这两个结构体没有任何联系,这样造成了代码的浪费,重复。
而java的继承特性,就解决了这一问题。
继承的概念和实现
生活中,继承的概念随处可见。
比如:
java继承背后的思想是:基于已存在的类来构建新类。
当从已存在类继承时,就重用了他的方法和属性,还可以添加新的方法和属性来定制新类以应对要求。
继承的意义:代码重用,体现不同抽象层次
约定:从其他类导出的类叫做子类,通常父类更通用更抽象,子类更特殊更具体。在java中,除了object外,所有类都是子类,都只有唯一的父类,即为object。
所以继承在OOP(Object-Oriented Program面向对象编程 )中不可或缺,创建一个类时,总是在继承
extends关键字
在java语言中,用extends关键字来表示一个类继承了另一个类,如Student继承了Person
public class Student extends Person{
...
}
例子:
class Person {
String name;
String address;
void eat() {
System.out.println("人吃饭");
}
void drink() {
System.out.println("人喝水");
}
}
class Student extends Person{
//可以直接使用Person中的属性了
int score;
void goToSchool() {
System.out.println("学生要上学");
}
}
public class Demo1 {
public static void main(String[] args) {
Person p = new Person();
p.name = "人";
p.eat();
Student s = new Student();
s.name = "学生"; //person中的特征
s.eat(); //person中的方法
}
}
super关键字
super和this关键字的特点类似:super代表的是对父类对象的引用
作用:
(1)当子父类的成员出现同名时,可以通过super来区分
(2)子类的构造方法中,通过super关键字调用父亲的构造方法
强调:
(1)当构造一个子类对象的时候一定会先调用父类的构造方法来构造父类的对象。
(2)调用父类构造方法的语句必须是子类构造方法中的第一条指令
例子:
class Person {
String name;
String address;
void eat() {
System.out.println("人吃饭");
}
void drink() {
System.out.println("人喝水");
}
//Person(){}//解决方法一:无参的构造方法
Person(String name,String address){
this.name = name;
this.address = address;
System.out.println("父类构造方法被调用");
}
}
class Student extends Person{
//可以直接使用Person中的属性了