实验四 类的继承性和多态性
【开发语言及实现平台或实验环境】
Windows2000 或XP,JDK1.6与Eclipse 【实验目的】
1. 理解和掌握类的继承和多态 2. 理解父类和子类的转化。 【实验要求】
1. 掌握类的继承法和多态 。 2. 掌握父类和子类的转化。
【实验内容】
一 类的继承
面向对象的中最为强大的功能是类的继承,继承允许你在一个已经存在的类之上编写新的程序。比如想建立一个FillRect类,该类可以使用Rectangle类中所有已定义的数据和成员方法,如:width、height等数据和getArea等方法,就可以通过继承来实现。为了继承Rectangle类,你必须引用旧的Rectangle类(使用extends关键字),并且在新类的说明中引用它。如:
class FillRect extends Rectangle{
? }
1. VehicleDemo.java
//类的继承
class Vehicle{//车辆类
int VehicleID; //性质:车辆的ID号 void setID(int ID){ VehicleID=ID; }
void displayID( ) { //方法:显示ID号
System.out.println(\车辆的号码是:\ } }
class Car extends Vehicle{ //轿车类 int mph; //时速 void setMph(int mph){ this.mph=mph; }
void displayMph( ) { //显示轿车的时速
System.out.println(\轿车的时速是:\ } }
public class VehicleDemo{
public static void main(String[] args){ //产生一个车辆对象
15
Car benz = new Car(); benz.setID(9527); benz.setMph(10); benz.displayID(); benz.displayMph(); }
}
2. 成员变量的隐藏和方法的重写
子类通过隐藏父类的成员变量和重写父类的方法,可以把父类的状态和行为改变为自身的状态和行为,例如:
class A{ int x;
void setX(){ x=0; } }
class B extends A{
int x; //隐藏了父类的变量x
void setX(){ //重写了父类的方法 setX()
x=5; } }
3. 关键字super、
Java中通过super来实现对父类成员的访问,super用来引用当前对象的父类。在扩展类的所有非静态方法中均可使用super关键字。在访问字段和调用方法时,super将当前对象作为其超类的一个实例加以引用。
super 的使用有三种情况: 访问父类被隐藏的成员变量,如:super.variable; 调用父类中被重写的方法,如:super.method([paramlist]); 调用父类的构建器,如:super([paramlist]); SuperDemo.java
class Father{ int x; Father(){ x=3;
System.out.println(\ }
void doSomething(){
System.out.println(\ } }
16
class Son extends Father{ int x; Son(){
//调用父类的构造方法
//super() 必须放在方法中的第一句 super(); x=5;
System.out.println(\ }
void doSomething() {
super.doSomething( ); //调用父类的方法
System.out.println(\ System.out.println(\ } }
public class SuperDemo{
public static void main(String args[]) { Son son=new Son(); son.doSomething(); } }
程序运行结果:
Calling Father : x=3 Calling Son : x=5
Calling Father.doSomething() Calling Son.doSomething() Father.x=3 Son.x=5
二 类的多态性
(1) 编译时多态。在编译阶段,编译器会根据参数的不同来静态确定调用相应的方法,即具体调用哪个被重载的方法。
(2) 运行时多态。由于子类继承了父类所有的属性(私有的除外),所以子类对象可以作为父类对象使用。程序中凡是使用父类对象的地方,都可以用子类对象来代替。一个对象可以通过引用子类的实例来调用子类的方法。
√重载方法的调用原则:Java运行时系统根据调用该方法的实例,来决定调用哪个方法。对子类的一个实例,如果子类重写了父类的方法,则运行时系统调用子类的方法;如果子类继承了父类的方法(未重写),则运行时系统调用父类的方法。 1. SuberClass.java
class BaseClass{ public BaseClass(){
System.out.println(\ init(); }
public void init(){
17
System.out.println(\ } }
public class SuberClass extends BaseClass{ public SuberClass() {
System.out.println(\ }
public void init() {
System.out.println(\ }
public static void main(String[] args) { System.out.println(\创建BaseClass对象:\ new BaseClass();
System.out.println(\创建SuberClass对象:\ new SuberClass(); } }
程序运行结果:
创建BaseClass对象: Now in BaseClass() Now in BaseClass.init() 创建SuberClass对象: Now in BaseClass() Now in SuberClass.init() Now in SuberClass()
三.static 有时候,可能需要同类的各对象之间共享某些变量或者方法,这些共享的变量或是方法被称为类变量或者类方法。类变量或者类方法统称为静态对象。
√每个实例对象对类变量的改变都会影响到其他的实例对象。类变量可通过类名直接访问,无需先生成一个实例对象,也可以通过实例对象访问类变量。 √类方法不能访问实例变量,只能访问类变量。类方法可以由类名直接调用,也可由实例对象进行调用。类方法中不能使用this或super关键字。 √静态变量可以有初值,就象实例变量一样。静态变量和方法都是通过类名字来访问的。为方便起见,也可以用具体对象来访问。 例3.3.2 StaticDemo2.java
//静态成员的使用 class StaticDemo2{ //实例变量 int i; //静态变量 static int j;
static int arr[ ] = new int[12]; //静态初始成员,初始化数组
18
static{
for(int i=0;i
//实例方法
void setI(int i){ this.i =i; }
//静态方法
static void setJ(int j) { StaticDemo2.j=j; }
public static void main(String []args ){ StaticDemo2 sd2 = new StaticDemo2(); StaticDemo2.j=2; //正确: 通过类访问静态变量 sd2.j =3; //正确: 通过实例访问静态变量 StaticDemo2.setJ(2); //正确: 通过类访问静态方法 sd2.setJ(3); //正确: 通过实例访问静态方法 sd2.i=4; //正确: 通过实例访问实例变量 sd2.setI(7); //正确: 通过实例访问实例方法 StaticDemo2.i=5; //错误: 通过类访问实例变量 StaticDemo2.setI(5); //错误: 通过类访问实例方法 } }
【完成实验项目】
1.三角形、梯形和圆形的类封装
? 实验要求:
编写一个Java应用程序,该程序中有3个类:Trangle、Leder和Circle,分别用来刻画“三角形”、“梯形”和“圆形”。具体要求如下:
a) Trangle类具有类型为double的三个边,以及周长、面积属性,Trangle类具有返回周长、面积以及修改三个边的功能。另外,Trangle类还具有一个boolean型的属性,该属性用来判断三个属能否构成一个三角形。
b) Lader类具有类型double的上底、下底、高、面积属性,具有返回面积的功能。
c) Circle类具有类型为double的半径、周长和面积属性,具有返回周长、面积的功能。
2. 假如我们在开发一个系统时需要对员工进行建模,员工包含3个属性:姓名、工号
以及工资。经理也是员工,除了含有员工的属性外,另外还有一个奖金属性。请使用继承的思想设计出员工类和经理类。要求类中提供必要的方法进行属性访问。 3.
19
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说教育文库java实验指导书(4)在线全文阅读。
相关推荐: