抽象类
一、为什么使用抽象类
人类的认知的过程实际就是从具体到抽象的过程。人们为了方便的批处理对象而从众多的对象中抽象出类这一概念,为了更好的管理类,所以需要在类的概念上再次抽象。例如:学生类,医生类,教师类,律师类之间仍有许多共同的属性(如:名字,身份证号,性别等)和共同的方法(如:吃饭,睡觉,移动等),所以便可用将这些属性抽象出来使用一个总的抽象的类(人类)来表示。
二、什么时候使用抽象类
当描述一个类的时候,如果不能确定功能函数如何定义,那么该类就可以定义为抽象类,功能函数应该描述为抽象函数。
三、抽象类的实现方式
1.使用abstract对类进行修饰;
2.定义的无法确定方法体的方法,不写方法体;
3.使用abstract对无方法体的方法进行修饰;
四、抽象类的特点
1:有抽象函数的类,该类一定是抽象类。
2:抽象类中不一定要有抽象函数。
3:抽象类不能使用new创建对象
4:抽象类主要为了提高代码的复用性,让子类继承来使用。
5:编译器强制子类实现抽象类父类的未实现的方法。(若不实现,则子类的也要声明为抽象的。)
五、抽象的优点
1:提高代码复用性(强制子类实现父类中没有实现的功能)
2:提高代码的扩展性,便于后期的代码维护
六、注意
1.抽象类不能直接使用类名创建实例,但是有构造方法,构造方法是让子类进行初始化。
2.final和abstract一定不能同时修饰一个类。
3.抽象类可以没有抽象方法(java.awt.*的类就是这样子操作的)。
4.抽象类可以继承普通类与抽象类。
七、abstract与其他修饰符的关系:
1.final与abstract不能共存:
final:它的作用 修饰类代表不可以继承 修饰方法不可重写,
abstract修饰类就是用来被继承的,修饰方法就是用来被重写的。
2.static与abstract不能共存:
static修饰的方法可以用类名调用,
abstract修饰的方法没有具体的方法实现,所有不能直接调用,
所以abstract不可以与static共存。
2.private与abstract不能共存:
private修饰的只能在本类中使用,
abstract方法是用来被子类进行重写的,有矛盾,
所以不能共存。
/*练习: 描述一个图形、圆形、 矩形三个类。不管哪种图形都会具备计算面积
与周长的行为,但是每种图形计算的方式不一致。*/
abstract class MyShape{
String name;
public MyShape(String name){
this.name = name;
}
public abstract void getArea();
public abstract void getLength();
}
class Circle extends MyShape{
double r;
public static final double pi =3.14;
public Circle(String name,double r){
super(name);
this.r = r;
}
@Override
public void getArea() {
System.out.println(name+"的面积是:"+r*r*pi);
}
@Override
public void getLength() {
System.out.println(name+"的周长是:"+2*r*pi);
}
}
class Rect extends MyShape{
int width;
int height;
public Rect(String name,int width, int height){
super(name);
this.width = width;
this.height = height;
}
public void getArea(){
System.out.println(name+"的面积是:"+width*height);
}
public void getLength(){
System.out.println(name+"的周长是:"+2*(width+height));
}
}
class Main
{
public static void main(String[] args)
{
Circle c = new Circle("圆形",4.0);
c.getArea();
c.getLength();
//矩形
Rect r = new Rect("矩形",3,4);
r.getArea();
r.getLength();
}
}