super、final、abstract关键字、以及面向抽象编程的一些注意点

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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值