《类的继承与多态》由会员分享,可在线阅读,更多相关《类的继承与多态(17页珍藏版)》请在金锄头文库上搜索。
1、继承与多态继承与多态继承是面向对象程序设计不可缺少的部分,它是面向对象三个特征之一。没有使用继 承的程序设计就不能称之为面向对象的程序设计。继承实际上是存在于面向对象程序中的 两个类之间的一种关系。 当一个类拥有另一个类的部分或所有数据和操作时,就称两个类之间具有继承关系。 被继承的类称为父类或超类,继承了父类或超类的部分或所有数据和操作的类称为子类。 一个父类可以拥有多个子类,这时这个父类实际上是所有子类的公共域和公共方法的 集合,而每一个子类则是父类的特殊化,是对公共域和方法的功能在功能、内涵方面的扩 展和延伸。 在 Java 中,一个子类最多有一个父类! 注意,这一点与 C+是不同的。即
2、 Java 只支只支 持单重继承持单重继承,不支持多重继承! 一继承的概念: 子类拥有父类的部分或全部成员。例如: class Person int age; int height; void eat(); void sleep() public Person(int age,int height) this.age=age; this.height=height; class Student int age; int height; int score; void eat(); void sleep() void study() public Student (int age,int hei
3、ght) this.age=age; this.height=height; 学生也是人,所以它应当具有人所具有的属性和行为。进而,Student 类编拥有人类 所有成员和共同行为,这种关系称为继承。即 学生类继承了人类。在 java 中用关键字 extends 表示”继承”. 记为: class Student extends Person. 所以,对于上面的 Student 类重新定义为:class Student extends Person int score;void study() public Student (int age,int height) super(age,heig
4、ht); 此时 “学生”拥有了”人”类所有的特征,并且具有他自己独有的特征。所以,在 Student 类中 现有成员为: 继承祖先类的成员: int age; int height; void eat(); void sleep() 本类特有的成员: int score; void study() 二子类对象的创建 创建子类的对象同创建一般类的对象,只是创建子类对象时,会首先执行父类的构造 函数,然后才调用子类本身的构造函数。 Student ob=new Student();三this 与 super 关键字 this 用来引用对象(除父类构造函数之外)的所用成员,如上例, this 可以引
5、用下列成员。score,study(),Student(),age,height,eat(),sleep() super 则用来引用那些继承自父类的成员。即:age,height,eat(),sleep(),Person() 对于普通的成员可以使用 this.成员 访问 或 super.成员 的形式引用,然而对于构造函 数,则要使用 this()与 super()进行调用。 构造函数 是创建对象时被调用执行的函数,它仅被调用一次,执行完毕后,对象便被 创建起来了。构造函数没有任何返回值,在构造函数中也可以使用 this()调用其它构造函 数。class Inher3_1 int a; Inhe
6、r3_1() a=1; Inher3_1(int a) this.a=a; public class Inher3 extends Inher3_1 int b; Inher3(int a,int b) super(a); /调用父类构造函数,必须位于第一行 this.b=b; /初始化本类成员 public static void main(String args) Inher3 ob=new Inher3(10,20); System.out.println(ob.a+” “+ob.b); 在子类构造函数中调用父类构造函数时,必须将 super()放在第一条语句位置。 记住:记住:Java
7、 只支持单重继承只支持单重继承,不支持多重继承!虽然,Java 类最多只有一个父类,但一个 Java 类可以实现多个接口。四继承中的访问控制符继承自父类的成员的访问控制符会影响到子类。根据父类成员的访问控制符的不同, 子类中有的父类成员可以被访问,有的则无法访问。概括如下: private 只允许在类的内部访问 public 可以被所有的类访问 defualt(friendly) 只允许在同一包中访问 protected 允许同一个包中的类或其子类访问(子类与父类可以不在同一包)。class Inher3_1 private int a; public void setA(int a) thi
8、s.a=a; int getA() return a; / public class Inher3 extends Inher3_1 void test() a=10; /错误,因为父类的这个成员用 priavte 修饰 setA(20); System.out.println(getA(); public static void main(String args) Inher3 ob=new Inher3(); ob.test(); / package abc; /包 class Parent protected int a; protected void f() void g() pack
9、age mypackage; /与父类不同包! import abc; class Child extends Parent void h() a=10;f(); g(); /与父类不同包,故不能访问,因为父类的方法 g() 为缺省访问控制符 五覆盖 所谓覆盖是指子类拥有父类相同成员的情况(override). 子类覆盖父类的目的在于通过在子类中重新定义(扩展)父类功能。 成员变量的覆盖: 变量名称相同,类型相同,较少使用 成员方法的覆盖: 返回值类型,方法名,形式参数都相同,使用较多 访问控制符可以使用与父类相同或比父类权限更大的控制符。即: private-public, default-
10、public,protected public 对子类与父类具有相同域成员的情况说明: 当子类执行继承自父类的操作时,处理的是继承自父类的变量,而当子类执行它 自己定义的方法时,所操作的就是它自己定义的变量,而把继承自父类的变量“隐藏 起来” 。class Parent int a; /父类域成员 void f(int a) /私有方法 private int g(int a,int b) void h() class Child extends Parent int a; /子类域成员,注意与父类完全相同!(隐藏) int b; void f(int a) /成员方法的覆盖 public i
11、nt g(int a,int b)/覆盖父类私有方法,增大访问权限的覆盖! void kk() /调用 class Inher5_1 int a=10;/本类自身的域成员 public class Inher5 extends InHer5_1 int a=20; /覆盖(隐藏父类同名成员) void f() System.out.println(super.a); /调用继承自父类的成员,输出 10 System.out.println(this.a); /调用继承自父类的成员,输出 20 puyblic static void main(String args) Inher5 obj=ne
12、w Inher5();ob.f(); 运行结果输出如下: 10 20class Inher6_1 void hello() System.out.println(“Hi”); public class Inher6 extends Inher6_1 void hello() /覆盖 super.hello();/调用继承而来的 hello(0 方法 System.out.println(“海!”); /扩展功能 public static void main(String args) Inher6 obj=new Inher6(); obj.hello(); /运行结果 Hi 海! 注意区分
13、重载(overload)和覆盖(override)! 阅读下列代码,写出输出结果:/父类 abstract class PhoneCard double balance; /余额abstract boolean performDial();/拨号 double getBalance()return this.balance;/子类 class D200_Card extends PhoneCarddouble balance; /余额final double additoryFee=1.0;/附加费用 Overrideboolean performDial() / TODO Auto-gene
14、rated method stubif(balance(0.5+additoryFee)balance-=(0.5+additoryFee);return true;elsereturn false;/测试类 public class TestHerit public static void main(String args) / TODO Auto-generated method stubD200_Card my200=new D200_Card();my200.balance=50.0; /为子类的域变量System.out.println(“父类被隐藏的金额为:“+my200.getB
15、alance(); if(my200.performDial()System.out.println(“子类剩余的金额为:“+my200.balance); /运行测试后的输出结果:父类被隐藏的金额为:0.0子类剩余的金额为:48.5六六多态多态要深入理解面向对象的技术,关键是要领悟面向对象的三个特征:封装,继承,多态。1 封装 封装就是指利用抽象数据类型将数据和基于数据的操作封装在一起,数据被保护 在抽象数据类型的内部,系统的其他部分只有通过包裹在数据外面的被授权的操 作,才能够与这个抽象数据类型进行交互。在面向对象的程序设计中,抽象数据 类型是用“类”来表示的,每个类都封装了相关的数据和操作,在实际的软件开 发过程中,系统的所有功能模块都被构建成一个个的相互通信的类。 2 继承是面向对象技术最有特色、最重要,也是与传统方法最不相同的一个。继承 是存在于面向对象程序的两个类之间的一种关系。当一个类拥有另一个类的所有 数据和操作时,就称这两个类之间具有继承关系,被继承的类称为父类或超类, 继承了父类或超类的类称为子类。一个父类可以同时拥有多个子类,这时,父类 实际上是所有子类的公共属性的集合,而子类则是父类的特殊化,是在公共属性 的基础上的功能、内涵的扩充和延展。 3。多态指拥有相同的形式,但根据不同的情形拥有不同的机能的特性。例如: