码迷,mamicode.com
首页 > 其他好文 > 详细

抽象类

时间:2016-11-01 13:47:11      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:运算   主程   概念   成员   代码   ble   abs   double   extend   

类定义前面如果加上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方法不能为抽像方法。

 

抽象类

标签:运算   主程   概念   成员   代码   ble   abs   double   extend   

原文地址:http://www.cnblogs.com/Angella/p/6019053.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!