抽象类
2016-11-01 12:56 backyyan 阅读(360) 评论(0) 编辑 收藏 举报类定义前面如果加上abstract,则表示该类为抽象类,没有具体对对象。
例如:我们定义猫类Cat,含有成员变量体重weight;定义狗类Dog,含有成员变量weight;定义猪类Pig,含有成员变量weight。程序如下:
class Cat{
int weight;
}
class Dog{
int weight;
}
class Pig{
int weight;
}
由于这三个类都有体重weight这个成员变量,我们可以考虑把这三个类中的共同属性抽出来,单独放到同一个类中,这个类就叫抽象类。
抽象类相当于一个概念或者一个框架,已经不能作为具体事例对象的类,也就是说没有具体的对象。
动物类就是猪类,狗类,猫类的抽象类,动物类不属于任何一种具体物种的动物,他代表了所有动物的共同属性,而任何一种具体的动物都代表了特殊化的动物。
猫类,狗类,猪类都是从动物类继承而来的,所以这三种动物不需要再定义成员变量weight体重了。
例如:abstract class Animal{
int weight;
}
class Cat extends Animal{
}
class Dog extends Animal{
}
class Pig extends Animal{
}
从上述代码中可以看出,抽象类只能做父类来派生子类,不能用new运算符创建抽象类的实例。java中定义了一些专用的抽象类,如java.lang.Number类就是抽象类,不能创建具体的实例,它只是代表了数字的抽象概念。
定义抽象类的作用是将一类对象的共同特点抽像出来,成为该类共同特征的抽像概念。其后在处理具体的某个对象时,只需要添加与其他子类不同之处即可,不需要再重复抽像类的共同特征。
如果在方法名之前加上abstract就表示为抽像方法。抽像方法包含在抽象类中,只有方法头(包含修饰符,返回类型,方法名,参数列表)没有方法体和功能实现,类似于c语言中的函数声明。抽像方法的具体功能实现由子类完成。
由于抽像方法在抽象类中,具体的实现在各种抽象类的子类中,各种子类就形成了方法声明完全相同,只有实现的语句不一样。类外看起来名字相同,是一个统一的接口,这个统一的接口的多种实现方法就是多态的体现。
抽象类的用法:
//定义一个抽象类图形,派生出三个类,三角形类,矩形类,圆形类
public class chouxianglei {
public static void main(String []args){
//TShape shape=new TShape();错误,抽象类没有具体实例
Rectx rect=new Rectx(4,5);
rect.area();
Angle angle=new Angle(4,5);
angle.area();
Circle cir=new Circle(4);
cir.area();
}
}
abstract class TShape{
int a;
int b;
TShape(int a,int b){
this.a=a;
this.b=b;
}
abstract void area();//抽象类
}
class Rectx extends TShape{
Rectx(int a,int b){
super(a,b);
}
void area(){
double s;
s=a*b;
System.out.println("矩形面积为:"+s);
}
}
class Angle extends TShape{
Angle(int a,int b){
super(a,b);
}
void area(){
double s;
s=0.5*a*b;
System.out.println("三角形面积为:"+s);
}
}
class Circle extends TShape{
final double PI=3.1415;
Circle (int r){
super(r,r);
}
void area(){
double s;
s=PI*a*a;
System.out.println("圆的面积为:"+s);
}
}
ps:在该程序中,图形类TShape类为抽像类,里面含有一个抽像方法area(),定义了该抽像类的三个子类:圆形类,矩形类,三角形类。在三个子类中,分别定义了抽像方法area()的具体实现,这是area方法不能加abstract。在主程序中,分别定义三个子类的对象,调用area()方法输出各个图形面积的值。TShape shape=new TShape();这个语句是错误的,这个因为抽像类没有具体实例,不能用new来创建对象。但是可以引用对象,我们可以仅仅创建抽象类TSHape的对象,然后把他的子类的对象赋值给她抽像类的对象,这时候抽象类的对象可以认为是子类的具体对象,通过抽象类的对象调用方法就相当于通过了子类的对象调用方法。
主类可以改为一下格式:
public class chouxianglei {
public static void main(String []args){
TShape shape;
Rectx rect=new Rects(4,5);
shape=rect;
shape.area();
Angle angle=new Angle(4,5);
shape.angle;
shape.area();
Circle cir=new Circle(4);
shape=cir;
shape.area();
}
}
ps:需要注意的是抽像类必须在抽像方法中,抽象类不仅包括抽像方法,还包括其他成员方法和成员变量,但是抽像类中的非抽像方法必须实现。
还有构造方法不能为抽像方法,静态方法不能为抽像方法,private方法不能为抽像方法。