第3章面向对象编程Chapter 10抽象类与接口

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

10-1-2 抽象类的实现
假设想设计一个形状的父类CShape,由此类 可派生出圆形(circle),长方形(rectangle),三 角形(triangle)等几何形状的类。则父类与子 类的派生关系如下10-1所示。
CShape类
CRectangle类
CCircle 类
CTriangle 类
图10-1 父类于子类的派生关系图
利用数组变量shape[0]创建 对象并访问子类的成员
利用数组变量shape[1]创建 对象并访问子类的成员
10-1-4 使用抽象类的注意事项
“抽象类不能用来直接产生对象”。其原因在于它 的抽象方法只有声明,而没有明确地定义,因此如果 用它来创建对象,则对象根本不知要如何使用这个抽 象方法。
public abstract void main(String args[]) { ……….. CShape shape; shape=new CShape(); //错误,不能用抽象类直接产生对象 }
10-2 接wk.baidu.com的使用
接口(interface)是Java所提供的另一种重要功能, 它的结构和抽象类非常相似。接口本身也具有数据成 员与抽象方法,但它与抽象类有下列两点不同 1.接口的数据成员必须初始化,且不能再更改。 2.接口里的方法必须全部都声明成abstract,也就是 说,接口不能像抽象类一样有一般的方法,而必须 全部是“抽象方法
class CCircle implements iShape2D,iColor //实现iShape2D,iColor接口 { double radius; String color; public CCircle(double r) { radius=r; } public void setColor(String str) { color=str; System.out.println(“color=“+color); } public void area() { System.out.println(“area=“+pi*radius*radius); //定iShape2D接口的area() } }
第3章
面向对象编程
Chapter 10
抽象类与接口
10-1
10-1-1
抽象类
定义抽象类
抽象类是以abstract关键字为开头的类。 抽象类的定义格式
abstract class 类名称 //定义抽象类 { 声明数据成员; 返回值数据类型 方法名(参数…) { 定义一般方法 ………… } 定义抽象方法 abstract 返回数据类型 方法名(参数…); 没定义处理的方式 }
//定义有抽象类而派生出来的子类 class CRectangle extends CShape { int width,height; public CRectangle (int w,int h) { width=w; height=h; } public void show() { System.out.print(“color=“+color+”, “); System.out.print(“area=“+width*height); } }
1. 假设这些几何形状均具有“颜色”(color)这个属 性,因此可以把color这个数据成员,以及赋值 color的方法均设计在父类里,让它继承给各个形 状的子类较为方便,如此就不用在每一个几何形 状的子类里,设计相同的程序代码来处理“颜色” 这个属性的问题。 2. 另外,如果想为每一个几何形状的类设计一个 area() 方法,用来显示几何形状的面积,因每种 几何形状的面积计算方式并不相同,所以把area() 方法的处理方式设计在父类里并不恰当,但每一 个由CShape父类所派生出的子类又都需要用到这 一个方法,因此可以在父类里只声明area() 方法, 而把area() 处理的方法留在子类里来定义,也就 是说,把area() 声明成抽象方法即可解决这个问 题。根据上述的概念,可编写出如下的父类程序 代码:
//app10_6实现两个以上的接口
interface iShape2D { final double pi=3.14; abstract void area(); //定义iShape2D接口
}
interface iColor //定义iColor接口 { abstract void setColor(String str); }
//app10_3,利用父类的变量数组来访问子类的内容 public class app10_3 { public static void main(String args[ ]) { CShape=shape[ ]; //声明CShape类型的数组变量 shape=new CShape[2]; //产生两个CShape抽象类型的变量 shape[0]=new CRectangle(5,10); shape[0].setColor(“Yellow”); shape[0].show(); shape[1]=new CCircle[2.0]; shape[1].setColor(“Green”); shape[1].show(); } } 输出结果: color=Yellow,area=50 color=Green,area=12.56
10-3 多重继承
希望一个子类可以同时继承两个以上的父类,但java并 不容许有多个父类的继承。那么,有没有一种机制来 实现这种多重继承?答案是将类和两个以上的接口实 现在一起。
多重继承的语法格式
class 类名称 implements 接口1,接口2,…. { ……… }
app10_6是以两个接口iShape2D和iColor来实现CCirlce类 的范例。其中iShape2D具有数据成员pi与area() 方法,用来计 算面积,而iColor则具有setColor(),可用来赋值颜色。通过 CCirlce类与iShape2D和iColor接口的实现,CCirlce类得以同 时拥有这两个接口的成员,也因此达到多重继承的目的,如图 10-4所示
为什么要使用接口? 类继承对于重用父类中的代码很有用,而Java 只支持单重继承,在遇到需要多重继承的情况,可 以通过接口来帮助实现。
接口的定义格式
interface 接口名 //定义抽象类 { final 数据类型 成员名称=常量;//数据成员必须赋初值 abstract 返回数据类型 方法名(参数…); }
抽象类的变量创建 shape1,并访问子 类的成员
CShape shape2=new CCircle(2.0); shape2.setColor(“Green”); shape2.show(); }
}
抽象类的变量创建 shape2,并访问子 类的成员
输出结果: color=Yellow,area=50 color=Green,area=12.56 可以看出app10_1与app10_2的输出结果完全相同 app10_2分别创建shape1与shape2的对象,再用它 们来访问子类的成员。当所创建的对象变多时,这个 方法并不恰当。较好的做法是: 1.先创建父类的变量数组。 2.再利用数组元素创建子类的对象,并利用它来访问 子类的内容
运行结果: color=Yello, area=50 color=Green, area=12.56 CCircle与CRectangle是扩展自CShape抽象类的子类, 除了拥有自己的数据成员与方法外,同时也明确定义了 CShape抽象类中的抽象方法show()。
CShape类 show() 方法定义为abstract 只有声明,没有明确定义
//定义基类app10-1 public class app10-1 { public static void main (String args[]) { CRetangle rect=new CRectangle(5,10); rect.setColor(“Yellow”); //调用父类里的setColor()方法 rect.show(); //调用CRectangle类里的show()方法 CCircle cir=new CCircle(2.0) cir.setColor(“Green”); //调用父类里的setColor()方法 cir.show(); //调用CCircle 类里的 show()方法 } }
public class app10_6 { public static void main(String args[ ]) { CCircle cir; cir=new CCircle(2.0); cir.setColor(“Blue”); //调用CCircle类里的setColor() 方法 cir.area(); //调用CCircle类里的show() 方法 } } 输出结果: color=Blue area=12.56
//定义抽象类CShape而派生出来的子类CCricle class CCircle extends CShape { double radius; //数据成员 public CCircle(double r) //构造函数 { radius=r; } 在此处明确定义Show()的处理方法 public void show() { System.out.print(“Color=“+color+”,”); System.out.print(“area=“+3.14*radius*radius); } }
抽象方法. 没有定义处理的方式
接口与一般类一样,本身也具有数据成员与方法,但数据成 员一定要有初值的赋值,且此值将不能再更改,而方法必须 是“抽象方法”。
接口的实现
//定义iShape2D接口 interface iShape2D { final double pi=3.14; //数据成员初始化 abstract area(); //抽象方法 } class CCircle implements iShape2D //实现接口类 { double radius; public CCircle (double r) //构造函数 { radius=r; } public void area() //定义area()的处理方法 { System.out.print(“area=“+pi*radius*radius); } }
public class app10_4 { public static void main(String args[ ]) { CCircle cir=new CCircle(2.0); cir.area(); } }
接口的运作方式和抽象类很类似。不同的是,接口里 的数据成员必须设为常量,且所有的方法必须声明成 abstract。而在抽象类中则限制较少,其数据成员不必 设初值,且可以包含一般的方法和抽象方法。
iShape2D 接口 CCircle类 iColor 接口
//定义抽象类 CShape abstract class CShape //定义抽象类 { protected String color; //数据成员 public void setColor(String str) { color=str; //一般的方法,用来赋值几何形状的颜色 } abstract void show(); //抽象类内的抽象方法 }
定义show() 方法内容
CRectangle 类
CCircle 类
定义show() 方法内容
图 10-2抽象方法的实现
用父类的变量访问子类的内容
//app10_2,用抽象类类型的变量来创建对象 public class app10_2 { public static void main(String args[ ]) { CShape shppe1=new CRectangle(5,10); shape1.setColor(“Yellow”); shape1.show();
相关文档
最新文档