黑马程序员技术交流社区
标题:
关于多重继承之接口总结
[打印本页]
作者:
棉/mg花/x糖
时间:
2013-5-22 11:48
标题:
关于多重继承之接口总结
本帖最后由 棉/mg花/x糖 于 2013-5-22 12:56 编辑
关于
多重继承
之
接口
总结
多重继承
是指一个子类可以有多个直接父类。
而Java出于安全性、简化程序结构的考虑
,
只支持单继承。
那么,在Java中怎么实现多重继承机制呢?---->答案是:通过接口来实现!
1、接口的声明(定义)
[修饰符]
interface
接口名
[
extends
父接口名列表
] {
常量数据成员声明;
抽象方法声明;
}
(1)
接口定义用关键字interface,而不是用class
,可以把接口看成一个特殊类,或者“纯”的抽象类。
(2)
修饰符有两种:
和普通类的修饰符一样,只有
public和默认
两种。
①public:表示该接口可以被所有的类和接口使用;
②默认:表示该接口只能被同一包中的类和接口使用。
(3)
父接口列表:
接口也具有继承性。
①
可以用extends声明该接口是某个已经存在的父接口的派生接口。
②
对于类继承,extends后面只能允许有一个父类。
③接口与类继承不同,
一个接口可以有一个以上的父接口
,
即extends后边可以有多个接口,之间用逗号隔开
。
(4)
常量数据成员声明:
常量数据成员前可以有也可以没有修饰符,且默认全是final static,即常量
。
即常量数据成员默认为:public final static或final static。
(5)
抽象方法声明:
接口中默认的都是public abstract修饰的抽象方法。
①public可写可不写,不写也认为是public abstract方法;
②
接口中的方法体
可以由Java语言书写,也可以由其他语言书写。
由其他语言书写时,接口方法由
native
修饰符修
饰。
(6)
接口中没有自身的构造方法,所有的成员方法都是抽象方法,且均默认为是public abstract方法。
2、接口的实现
在Java中,通常对接口功能的“继承”称为“实现”。
(1)在类中,
用implements关键字就可以调用接口
。要调用多个接口时,接口之间用逗号隔开。
(2)如果实现某接口的类
不是abstract类
,则在类的定义部分
必须实现指定接口所有抽象方法
。
(3)如果实现某接口的类
是abstract类
,则它
可以不实现该接口所有抽象方法
。
(4)接口的抽象方法访问限制符均指定为public,所以
类在实现方法时,必须显式地使用public修饰符
,否则将
会被系统警告为
缩小了接口中定义的方法的访问控制范围。
=====================================================================================
补充:多重继承和多层继承的区别。
很多人可能会将多重继承和多层继承混淆,这里我必须强调一下:
多重继承
不是
多层继承!!
(1)
多重继承:
是指extends/implements后面可以有多个接口,是横向结构。
例如:
①接口D同时继承接口A、B、C:
interface D extends A,B,C {}
②类D同时实现接口A、B、C:
class D implements A,B,C {}
这样,D与A、B、C之间就形成一个横向的实现关系,称之为多重继承。
(2)
多层继承:
是指类的层状继承关系,是纵向结构。
例如:
类D继承类C,类C继承类B,类B又继承类A。
这样,A、B、C、D之间就形成一个纵向的继承关系,称之为多层继承。
=====================================================================================
下面是一个关于接口的示例:Test7.java
package com.yb.Test;
import java.applet.Applet;
import java.awt.Graphics;
//import com.yb.DrawPolygon.Circle;
//import com.yb.DrawPolygon.Shapes;
//import com.yb.DrawPolygon.Square;
//import com.yb.DrawPolygon.Triangle;
interface Shapes {
abstract double getArea();
abstract double getPerimeter();
}
class Coordinates {
int x,y;
public Coordinates(int x,int y) {
this.x = x;
this.y = y;
}
}
//Square Coordinates Shapes
class Square extends Coordinates implements Shapes {
public int width,height;
public double getArea() {
return(width*height);
}
public double getPerimeter() {
return(2*width+2*height);
}
public Square(int x,int y,int width,int height) {
super(x,y);
this.width = width;
this.height = height;
}
}
//Triangle Coordinates Shapes
class Triangle extends Coordinates implements Shapes {
public int width,height;
public double c;
public double getArea() {
return(0.5*width*height);
}
public double getPerimeter() {
return(width+height+c);
}
public Triangle(int x,int y,int base,int height) {
super(x,y);
width = base;
this.height = height;
c = Math.sqrt(width*width+height*height);
}
}
//Circle Coordinates Shapes
class Circle extends Coordinates implements Shapes {
public int width,height;
public double r;
public double getArea() {
return(r*r*Math.PI);
}
public double getPerimeter() {
return(2*Math.PI*r);
}
public Circle(int x,int y,int width,int height) {
super(x,y);
this.width = width;
this.height = height;
r = (double)width/2.0;
}
}
@SuppressWarnings("serial")
public class Test7 extends Applet {
Square box = new Square(5,15,25,25);
Triangle tri = new Triangle(5,50,8,4);
Circle oval = new Circle(5,90,25,25);
public void paint(Graphics g) {
//Draw a square, then output of its area and perimeter.
g.drawRect(box.x,box.y,box.width,box.height);
g.drawString("Box Area:"+box.getArea(),50,35);
g.drawString("Box Perimeter:"+box.getPerimeter(),50,55);
//Note: only know the bevel edge, bottom edge and high, we are unable to draw a triangle.
//Here only the output of the triangle area and perimeter.
g.drawString("Tri Area:"+box.getArea(),50,75);
g.drawString("Tri Perimeter:"+box.getPerimeter(),50,95);
//Draw a circle, then output of its area and perimeter.
g.drawOval(oval.x,oval.y,oval.width,oval.height);
g.drawString("Oavl Area:"+oval.getArea(),50,115);
g.drawString("oval Area:"+oval.getPerimeter(),50,135);
}
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2