1) 生活中的继承
a) 生活中,继承的例子随处可见
b) 分析生活中的继承:
1. 谁是父类?
2. 谁是子类?
3. 能说出继承的特点吗?
c) 分析:
1. 兔子和羊都是食草动物,它们都具有食草动物的基本特征和行为。如果把食草动物称为父类,兔子和羊就是食草动物的子类。
2. 由于豹子和狮子都具有食肉动物的基本特征和行为,可以说豹子和狮子都是食肉动物的子类
3. 食草动物和食肉动物都具有动物的基本特征和行为,所以它们都是动物的子类,而动物是它们的父类
4. 兔子的直接父类是食草动物,间接父类是动物
5. 动物、食草动物、兔子形成了一个继承树分支
d) 在上面的继承树分支中:
1. 位于下层的子类会继承上层所有直接或间接父类的特征和行为
2. 如果两个类不在同一个继承分支上,就不会存在继承关系
e) 继承特点:
1. 父类更通用、子类更具体
a) 父类具有更一般的特征和行为,而子类除了具有父类的特征和行为,还具有自己特殊的特征和行为
2. 继承需要符合的关系:is-a
a) 比如:兔子是食草动物,满足is-a的关系
b) 兔子不是老虎,所以兔子和老虎不存在继承关系
f) 再分析以下示例:
g) 请问:出租车包含哪些属性和行为呢?
1. 出租车是汽车的子类,继承了父类的属性和行为,又具有自身特殊的属性和行为,所以出租车有4个属性和3种行为
a) 属性:所属公司、最大载客数量、引擎数量、外观颜色
b) 行为:打发票、刹车、加速
h) 需要注意的是:
1. 在继承的表述中,父类和子类、超类和子类、基类和派生类,表达的意思是一样的。
2) 什么是继承
a) 概念
1. 提供子类可以沿用父类的某些行为和特征的一种方式。
b) 在程序中使用继承,有利于程序的扩展
c) 在Java程序中为什么需要继承呢
d) 通过以下示例进行分析
1. 建立一个Person类,其中Person分为:教师,学生,要求如下:
a) Teacher类的属性:name,address;方法:sayHai
b) Student类的属性:name,address;方法: sayHai
e) 代码示例:
f) 以上代码中:代码存在重复,违背了“write once, only once”的原则
1. 即没有做到代码只在一个地方写一次的原则
g) 如何改进?有没有可能建立继承关系,让子类自动继承父类的属性和方法?
h) 而继承就是将程序中共同的特征和行为抽取出来建立一个新的类,使其他类可以沿用此类中的属性和方法。
i) 这样不仅可以减少程序中的重复代码,而且易于程序扩展
以下就来实现继承
3) 如何实现继承
a) 分析两个类的特点:
b) 将所有子类中相同的代码都抽取到父类(Person类)中,代码如下:
public class NewPerson {
private String name;
private String address;
public NewPerson(String name, String address) {
this.name = name;
this.address = address;
}
public void sayHai() {
System.out.println("hello!我是来自于:" + address + "的" + name);
}
}
c) 在子类中,使用继承,可以有效实现代码复用
d) 子类自动继承父类的属性和方法,子类中不再存在重复代码
1. 代码示例如下:
class Teacher extends NewPerson {
public Teacher(String name, String address) {
super(name, address);
}
public void sayHai() {
super.sayHai();
System.out.println("我的工作是教学工作!");
}
}
class Student extends NewPerson {
public Student(String name, String address) {
super(name, address);
}
public void sayHai() {
super.sayHai();
System.out.println("我的工作是学习知识!");
}
}
e) 在Java语言中,用extends关键字来表示一个类继承了另一个类
f) 在父类中只定义一些通用的属性与方法
g) 子类自动继承父类的属性和方法,子类中可以定义子类特有的属性和方法
4) 继承的特点
a) 继承具有单根性:即一个子类不允许有多个父类
b) 在实现时:extends关键字后面不允许有两个类的名字
c) 例如:虽然门也实现了报警器的功能,但是门不是报警器:即:门的主要功能不是报警。
d) 继承具有传递性,即一个类可以即是某个类的子类,同时又是另一个类的父类
e) 代码示例:
/*
* Person类
*/
class Person07 {
public int age;
public String sex;
}
// Man是Person的子类,同时又是Father的父类
class Man extends Person07 {
public boolean marrired;
}
/*
* Father类
*/
class Father extends Man {
public String address;
public void getInfo() {
System.out.println("this is a father");
}
}
5) 一切的类的“祖先”——Object
a) 在Java 中,所有的Java类都直接或间接地继承了java.lang.Object类
b) 定义一个类时,如果没有使用extends关键字,那么该类实际上隐式继承了Object
c) Object类
6) 继承中父子类关系
a) 父类的引用可以指向子类的对象
b) 父类对象不能够强制类型转换成子类对象;子类的对象可以转换成父类的对象
/*
* Person类
*/
class Person08 {
public String name = "person";
public void printInfo() {
System.out.println("this is a person");
}
}
/*
* 子类
*/
public class Child08 extends Person08 {
public void printInfo() {
System.out.println("this is a child");
}
public static void main(String args[]) {
Person08 person = new Child08(); // 父类引用指向子类对象
// 调用子类中的方法,因为是子类的对象,所以调用的是子类的方法,
//但在父类中必须定义这个方法
person.printInfo();
//父类对象不能够强制类型转换成子类对象
// Child child = (Child)new Person();
}
}
7) 小结
a) 在继承关系中,父类更通用、子类更具体
b) 父类具有更一般的特征和行为。而子类除了具有父类的特征和行为,还具有一些自己特殊的特征和行为
c) 在继承关系中,父类和子类需要满足is-a 的关系
d) 使用继承可以有效实现代码复用
e) 如果在子类中定义的一个方法,其名称、返回类型及参数列表正好与父类中的某个方法的名称、返回类型及参数列表相匹配,那么就说明:子类的方法重写了父类的方法。
f) 编程:
1. 请编码实现动物世界的继承关系:
a) 动物(Animal)具有行为:吃(eat)、睡觉(sleep)
b) 动物包括:兔子(Rabbit),老虎(Tiger)
c) 这些动物吃的行为各不相同(兔子吃草,老虎吃肉);但睡觉的行为是一致的
2. 请通过继承实现以上需求,并编写测试类AnimalTest进行测试
g) 代码示例:
public class AnimalTest {
public static void main(String[] args) {
// 创建兔子对象
Animal a1 = new Rabbit();
a1.eat();
// 创建老虎对象
Animal a2 = new Tiger();
a2.eat();
}
}
/*
* 动物类
*/
class Animal {
public void eat() {
System.out.println("动物在吃东西!");
}
}
// 兔子类
class Rabbit extends Animal {
public void eat() {
System.out.println("兔子吃草!");
}
}
// 老虎类
class Tiger extends Animal {
public void eat() {
System.out.println("老虎吃肉!");
}
}
8) final关键字
a) 在Java中final是修饰符,可以修饰类、方法和属性
b) final修饰的类是终态类,其修饰方法为最终方法,final修饰的变量是常量
c) 终态类不能被继承,最终方法不能被重写(下一讲讲解),常量必须赋初值同时不允许被修改
d) 用final修饰常量必须赋初值,且不可以重新赋值
final class Base {
/*
* 常量必须赋初值,且不可以重新赋值
*/
public final int age;
public void getInfo() {
System.out.println("这是父类");
}
}
/*
* 类型 Student 不能成为终态类 Base 的子类
*/
class Student extends Base {
private String name;
}
public class Demo008 {
public static void main(String[] args) {
}
}
9) super与this关键字
a) 在继承关系中super和this是两个经常使用的关键字
1. this:表示当前对象本身的引用
2. super:表示对父类或者超类的引用
b) 如果子类中定义了与父类中同名的属性和方法,此时要调用子类中的属性和方法需使用this,要调用父类中的属性和方法需使用super
c) 代码示例:
class Person09 {
public String name = "张三";
public int age = 0;
}
public class Child09 extends Person09 {
public String sex;
public int age = 2;
/*
* 用super访问父类对象
* 用this访问本类对象
*/
public void getInfo() {
System.out.println("父类中的年龄是: " + super.age);
System.out.println("本类中的年龄是: " + this.age);
}
public static void main(String args[]) {
Child09 child = new Child09();
child.getInfo();
}
}
d) 输出结果:
e) 在使用 super和this时我们需要注意以下4个方面
1. 每个子类构造方法中首先会隐含地调用super(),然后执行自身构造方法中的代码
2. super()和this()均需放在构造方法内第一行
3. this和super不能同时出现在一个构造函数中
4. this()和super()均不可以在static环境中使用。包括static方法、static语句块
|
|