super
1用super操作被隐藏的成员变量和方法
2.用super调用父类的构建方法
final
可以使用final将类声明为final类。final类不能被继承
abstract
对于abstract方法,只允许声明,不允许实现(没有方法体),而且不允许使用final和abstract同时修饰一个方法或者类,也不允许使用static修饰abstract方法,(具体是为什么呢?原因是如果一个非抽象类是某个抽象类的子类,那么它必须重写父类发抽象方法,给出方法体,这就是为什么不允许使用final和abstract同事修饰一个方法或者类的原因)即abstract方法必须是实例方法。
abstract类的特点
1.abstract类中可以游abstract方法。
2.abstract类不能用new运算符创建对象
3.abstract类的对象作上转型对象
我们为什么要使用abstract类呢?
首先,abstract类只关心操作,不必去关心这些操作的具体的实现的细节,可以使得程序的设计者把主要的经历放在程序设计上,而不必拘泥在具体的算法上。比如,在设计地图时,首先会考虑地图最重要的轮廓,不必去考虑诸如城市中的街道牌号等细节,细节应当有抽象类的非抽象子类去实现,这些子类可以给出具体的实例。来完成程序功能的具体实现。
那么,我们在设计一个程序时,可以通过在abstract类中声明若干个abstract方法,表明这些方法在整个系统设计中的重要性,方法的内容细节由它的非abstract子类去完成。
这里要声明的是:
使用多态进行程序设计的核心技术是使用上转型对象,即将abstract类声明的对象作为其子类对象的上转型对象,那么这个上转型对象就可以调用子类重写的方法;
抽象编程
什么是面向抽象编程呢?
抽象编程是指当设计某种重要的类时,不让该类面向具体的类,而是面向抽象类,即所涉及中的重要数据是抽象类声明时的对象,儿不是具体类声明的对象。
下面我们举个例子:
首先我们先创建一个抽象类(Geometry.java):
package Example12;
public abstract class Geometry {
public abstract double getArea();
/**
* 抽象方法,不再考虑算法的细节(即将用户的各种需求抽象为一个标识)
*/
}
根据这个抽象类,我们写几个抽象类的子类,用于实现的具体方法
圆形底的子类
package Example12;
/*
* 圆形
*/
public class Circle extends Geometry {
double r;
Circle(double r) {
this.r = r;
}
public double getArea() {
// TODO Auto-generated method stub
return (3.14*r*r);
}
}
矩形底的子类
package Example12;
/*
* 矩形
*/
public class Rectangle extends Geometry {
double a,b;
public Rectangle(double a,double b) {
this.a = a;
this.b = b;
}
public double getArea() {
return a*b;
}
}
接下来我们再写一个实现求体积的类
package Example12;
public class Pillar {
Geometry bottom;
//buttom是抽象类Geometry声明的对象
double height;
Pillar(Geometry bottom,double height) {
this.bottom = bottom;
this.height = height;
}
public double getVolume(){
return bottom.getArea()*height;
}
}
主函数:
package Example12;
public class Application {
public static void main(String[] args) {
Pillar pillar;
Geometry bottom;
bottom = new Rectangle(12, 55);
pillar = new Pillar(bottom, 12);//矩形为底的柱
System.out.println("矩形底的柱体的体积:" + pillar.getVolume());
bottom = new Circle(10);
pillar = new Pillar(bottom, 58);
System.out.println("圆形底的柱体的体积:" + pillar.getVolume());
}
}
调试结果:
矩形底的柱体的体积:7920.0
圆形底的柱体的体积:18212.0