继承与多态
学习目标
1.理解继承的概念
2.掌握子类的创建
3.理解各种访问修饰符的作用,熟悉访问修饰符队子类继承性的影响
4.熟悉is-a和has-a关系的区别
5.熟悉成员变量的隐藏和方法重写
6.掌握使用super访问被隐藏的父类以及父类的构造方法
7.理解继承的层次结构,熟悉构造方法的执行顺序
8.掌握final关键字的三种功能
9.理解多态性子类对象及其向上转型对象的关系。并掌握向上转型对象的创建和使用
继承的概念
继承是面向对象编程设计的一个主要特征,有一种有已有的类创建新类的机制。我们可以把继承理解为一棵树的关系,子节点拥有父节点的基本要素,又拥有自身的特性。Java中只支持单一继承,即一个子类拥有一个超类,且不允许多重继承。
子类的创建
与前面类的创建几乎是一样的,同样包含了类的声明和类体两个部分,不同的是需要在声明子类时来体现子类的继承性。子类继承性是通过在子类的声明语句中加入extend。
[访问修饰符][类型修饰符]{
[子类成员变量声明]
[子类方法定义]
class Manager extends Emploee{
.....
}
}
访问修饰符与继承性
类访问修饰符
在类的定义中我们知道访问修饰符有不同的种类如类访问修饰符:public、缺省,他们的区别是public可以被包内、包外的任意类访问,而缺省只能被包内类访问。
成员访问修饰符
同样的成员变量和方法的访问修饰符有四种:private、public、proteced 、缺省
1.private 定义的变量与方法只能在定义的类中使用
2.public与缺省二者类似,唯一的区别就是public可以被不同包的类识别而缺省只能拿被同一包内类识别
3.proteced可以被继承使用,但不能被超类对象访问
修饰符 | 使用范围 | 同一类 | 同一包 | 不同包 |
---|---|---|---|---|
private | 方法、变量 | Y | ||
缺省 | 类、接口、方法、变量 | Y | Y | |
proteced | 方法、变量 | Y | Y | 子类Y |
public | 类、接口、方法、变量 | Y | Y | Y |
子类的继承性
在同一包内子类能够继承超类的所有非private成员;
不同包内子类只能继承超类的public和protected成员
is-a和 has-a区别
类与类之间的关系简单可以分为is-a、has-a 两种,从字面上十分容易理解,is-a是一般到具体的关系,而has-a是整体与部件的关系。
比如鸟是一种动物就是前者,而鸟有翅膀属于后者。
成员变量的隐藏和方法重写
子类继承超类后,可以自动继承超类的非私有成员变量和成员方法,但如果在子类中定义与超类同名的成员变量或方法,那超类中的方法就会被覆盖。(类似与全局变量与局部变量的差别),重写方法超类时,可以保存或提升访问级别,但是不允许降低方法的访问级别。
class A
{
int number=30;
int add(int x,int y)
{
return x+y;
}
int sub(int x,int y){
return x-y;
}
}
class B extends A{
int number=20;
int add(int x,int y)
{
return x+y+1;
}
}
super关键字
super关键字使用时有两种形式:一时调用超类的构造方法,二是访问已被子类成员隐藏的超类成员。
在子类继承超类时,超类的构造方法也不能被子类继承。如果想在子类中继承需要使用super关键字。在子类中使用super调用超类的构造方法时:super语句需要放在子类的构造方法中,并且作为子类构造方法的第一条语句。调用超类构造方法的格式时:super(参数列表)
public class People
{
String name;
double salary;
public Employee(String name,double salary){
this.name=name;
this.salary=salary;
}
}
class Employeee extend People{
String position;
Employee(String name,int age,String position)
{
super(name,salary);
this.postion=postion;
}
}
同理访问被子类隐藏的超类成员变量和重写的超类方法
子类中使用super 访问被隐藏的成员变量和重写的超类方法格式如下:
访问被隐藏的成员变量:super.成员变量
访问被隐藏的方法: super.方法名
继承的层次性
在Java种,不允许多重继承,即一个子类同时拥有多个父类,但是允许多层继承,一个子类可以作为另外一个类的超类。
构造方法的执行顺序
构造方法的主要功能是在创建对象时,给对象成员变量赋值。我们知道,子类可以继承超类除private 外其他几个关键词的成员变量和成员方法。但是不能继承超类的构造方法,除非使用关键字super,所以子类在创建对象时需要同时执行子类的构造方法和超类的构造方法。那么这两种构造方法的执行顺序是怎么样的呢?在多层继承种,子类构造方法的执行顺序是按照创建时的顺序,自上向下来执行的,这也是super语句必须时子类构造方法的第一条语句的原因。
final 关键字
final关键字可以用于声明类、成员变量、方法中。在不同的位置final语句也有不同的作用
1.阻止类的继承
2.阻止方法的重写
3.创建常量
总而言之,final就是类、成员变量、方法的最终版本具有不可改变的性质。
多态性
多态性是指类的属性或功能在各个子类中可以具有彼此不同的具体形态。下面我们来讨论一下向上转型对象。
所谓创建向上转型对象,是指引用子类对象的超类类型变量,假设A:动物 为B:狗 的超类,则当我们创建一个类B对象,并把对这个对象的应用放到类A的变量中。
A a=new B();
这时称a为b的向上转型对象,就好比是说狗是动物。
那么向上转型对象与原对象有什么区别呢?
- 向上转型对象不能操作子类新增的成员变量(失去了一些属性),不能使用子类新增的方法(失掉一些功能);
- 向上转型对象可以操作子类继承或重定义的成员变量,因此如果子类重写了超类的某个方法后,向上转型对象调用这个方法时,一定是调用了这个重写方法。