/*
当多个类中出现相同功能,但是功能主体不同,
这是可以进行向上抽取。这时,只抽取功能定义,而不抽取功能主体。
抽象:看不懂。
抽象类的特点:
1,抽象方法一定在抽象类中。
2,抽象方法和抽象类都必须被abstract关键字修饰。
3,抽象类不可以用new创建对象。因为调用抽象方法没意义。
4,抽象类中的抽象方法要被使用,必须由子类复写起所有的抽象方法后,建立子类对象调用。
如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类。
Java抽象类的定:java抽象类体现数据抽象的思想,是实现程序多态性的一种手段。也提到抽象类与抽象方法的限制,下面我们会通过一下java抽象类小示例来给你介绍抽象类的用法。希望对你有所帮助。
假设我们要编写一个计算矩形、三角形和圆的面积与周长的程序,若按前面所学的方式编程,我们必须定义四个类:圆类、三角形类、矩形类和使用前三个类的公共类,它们之间没有继承关系.
程序写好后虽然能执行,但从程序的整体结构上看,三个类之间的许多共同属性和操作在程序中没有很好地被利用,需要重复编写代码,降低了程序的开发效率,且使出现错误的机会增加。
仔细分析上面例子中的三个类,可以看到这三个类都要计算面积与周长,虽然公式不同但目标相同。因此,我们可以为这三个类抽象出一个父类,在父类里定义圆、三角形和矩形三个类共同的数据成员及成员方法。把计算面积与周长的成员方法名放在父类给予说明,再将具体的计算公式在子类中实现.
这样,我们通过父类就大概知道子类所要完成的任务,而且,这些方法还可以应用于求解平行四边形、梯形等图形的周长与面积。这种结构就是抽象类的概念。
Java程序用抽象类(abstract class)来实现自然界的抽象概念。抽象类的作用在于将许多有关的类组织在一起,提供一个公共的类,即抽象类,而那些被它组织在一起的具体的类将作为它的子类由它派生出来。抽象类刻画了公有行为的特征,并通过继承机制传送给它的派生类。
在各子类继承了父类的抽象方法之后,再分别用不同的语句和方法体来重新定义它,形成若干个名字相同,返回值相同,参数列表也相同,目的一致但是具体实现有一定差别的方法。抽象类中定义抽象方法的目的是实现一个接口,即所有的子类对外都呈现一个相同名字的方法。抽象类是它的所有子类的公共属性的集合,是包含一个或多个抽象方法的类。使用抽象类的一大优点就是可以充分利用这些公共属性来提高开发和维护程序的效率。对于抽象类与抽象方法的限制如下:
(1)凡是用abstract 修饰符修饰的类被称为抽象类。凡是用abstract修饰符修饰的成员方法被称为抽象方法。
(2)抽象类中可以有零个或多个抽象方法,也可以包含非抽象的方法。
(3)抽象类中可以没有抽象方法,但是,有抽象方法的类必须是抽象类。
(4)对于抽象方法来说,在抽象类中只指定其方法名及其类型,而不书写其实现代码。
(5)抽象类可以派生子类,在抽象类派生的子类中必须实现抽象类中定义的所有抽象方法。
(6)抽象类不能创建对象,创建对象的工作由抽象类派生的子类来实现。
(7)如果父类中已有同名的abstract方法,则子类中就不能再有同名的抽象方法。
(8)abstract不能与final并列修饰同一个类。
(9)abstract 不能与private、static、final或native并列修饰同一个方法。
Java抽象类应用示例程序Test.java 如下:
public abstract class Shapes {
public int x, y;
public int width, height;
public Shapes(int x, int y, int width, int height) {
this.x = x;
this.y = y;
this.width = width;
this.height = height;
}
abstract double getArea();
abstract double getPerimeter();
}
public class Circle extends Shapes {
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 heigh) {
super(x, y, width, heigh);
r = (double) width / 2.0;
}
}
public class Square extends Shapes {
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, width, height);
}
}
public class Triangle extends Shapes {
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, base, height);
c = Math.sqrt(width * width + height * height);
}
}
import java.applet.Applet;
import java.awt.Graphics;
public class Test 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) {
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);
g.drawString("tri Area:" + tri.getArea(), 50, 75);
g.drawString("tri Perimeter:" + tri.getPerimeter(), 50, 95);
g.drawOval(Oval.x, Oval.y, Oval.width, Oval.height);
g.drawString("oval Area:" + Oval.getArea(), 50, 115);
}
}
可以看出,类Square、类Circle及类Triangle都由抽象类Shape派生而来,它们都实现了getArea 和getPerimeter抽象方法。