抽象类,最终类的介绍(初学者很有帮助)

来源:互联网 发布:前端编辑软件2017 编辑:程序博客网 时间:2024/04/30 03:27
当定义一个类时,除了声明类的访问权限之外,有时还需要声明类的继承特性。即声明一个类是否为抽象类或是最终类,使用abstract修饰符声明抽象类,使用final修饰符声明最终类。

1。抽象类:

    1〉声明抽象类与抽象方法:

   eg.        publicabstractclass PlaneGraphcs1

                 {

                                 publicabstractdouble area(); //分号必不可少

               }

         抽象方法是只有方法声明而没有方法体的成员方法。抽象类中可以不包含抽象方法,但是包含抽象方法的类必须声明为抽象类。构造方法,类成员方法不能被声明为抽象方法。

     2〉抽象类不能被实例化。

抽象类不能被实例化,即使抽象类中没有包含抽象类方法,也不能创建抽象类的实例。下列语句产生语法错误:

    PlaneGraphics1 g1 =new PlaneGraphics1();  //语法错误,抽象类不能实例化

     3〉抽象类与抽象方法的作用:

         抽象类用于描述抽象的概念,抽象方法用于声明方法的参数和返回值,抽象方法的具体实现由抽象子类完成。子类必须覆盖父类的抽象方法。

        抽象类声明的抽象方法约定了多个子类共用的方法声明,每个子类可以根据自身的实际情况,给出抽象方法具体的实现。显然不同的子类可以有不同的方法实现。因此,一个抽象方法在多个子类中表现出多态性。抽象类提供了方法声明与方法实现分离的机制。使得多个不同的子类能够表现出共同的行为能力。

  4〉抽象方法必须被子类覆盖:

       由于抽象方法在抽象类中没有具体的方法实现,所以抽象方法必须被子类覆盖。反之,如果一个子类不能覆盖父类的抽象方法,则该类自己也必须声明为抽象类。

    5〉抽象方法的必要性:

如果一个方法需要被子类覆盖,则必须声明为抽象方法。 例如PlaneGraphics1类也可以声明area()方法不是抽象方法。则PlaneGraphics1类也不必声明为抽象类。声明如下:

             public class PlaneGraphics1   //平面图形类,非抽象类

            {

                       public double area()          / /非抽象方法,必须有方法体

                       {

                                return 0;

                        }

             }

eg .

/*
 * 本例演示抽象类与抽象方法的作用。声明抽象类PlaneGraphics1及两个子类,子类分别覆盖area()抽象方法,
 * 实现不同图形的面积计算。
 */
public abstract class PlaneGraphics1 {         //平面图形类,抽象类
 private String shape;      //形状
 public PlaneGraphics1(String shape)
 {
  this.shape=shape;
 }
 public PlaneGraphics1()
 {
  this("未知");
 }
 public abstract double area();       //计算面积,抽象方法,分号";"必不可少
 public void print()                  //显示面积,非抽象方法
 {
  System.out.println(this.shape+"面积为 "+this.area());
 }
}
//===========================================================================

//设计长方形类Rectangle1,继承平面图形类
public class Rectangle1 extends PlaneGraphics1{
 protected double length;     //长度
 protected double width;      //宽度
 public Rectangle1(double length,double width)     //构造方法
 {
  super("长方形");
  this.length=length;
  this.width=width;
 }
 public Rectangle1(double width)       // 正方形是长方形的特例
 {
  super("正方形");
  this.length=width;
  this.width=width;
 }
 public Rectangle1()
 {
  this(0,0);
 }
 public double area()      //计算长方形面积,实现父类的抽象方法
 {
  return this.width*this.length;
 }
}
//======================================================================

public class Elipse1 extends PlaneGraphics1 {        //椭圆类
 protected double radius_a;      //a轴半径
 protected double radius_b;      //b轴半径
 public Elipse1(double radius_a,double radius_b)  //构造方法
 {
  super("椭圆");
  this.radius_a=radius_a;
  this.radius_b=radius_b;
 }
 public Elipse1(double radius_a)       //圆是椭圆的特例
 {
  super("圆");
  this.radius_a=radius_a;
  this.radius_b=radius_a;
 }
 public Elipse1()
 {
  this(0,0);
 }
 public double area()                  //计算椭圆的面积,实现父类的抽象方法
 {
  return Math.PI*this.radius_a*this.radius_b;
 }
}

//=========================================================================
class PlaneGraphics1_ex {

 /**
  * 使用平面图形类及子类
  */
 public static void main(String[] args) {
  PlaneGraphics1 g1=new Rectangle1(10,20);  //获得子类长方形实例
  g1.print();       //print()不时运行时多态性,其中调用的area()表现运行时多态性
  g1=new Rectangle1(10);      //正方形
  g1.print();
  g1=new Elipse1(10,20);     //椭圆
  g1.print();
  g1=new Elipse1(10);        //圆
  g1.print();
 }
}

运行结果如下:

长方形面积为 200.0
正方形面积为 100.0
椭圆面积为 628.3185307179587
圆面积为 314.1592653589793

2.最终类:

1〉声明最终类:

    使用关键字fianl声明的类称为最终类,最终类不能被继承,即不能声明最终类的子类。  public final class Math extends Object     //数学类,最终类

如果不希望一个类被继承,则声明该类为最终类。

抽象类不能被声明为最终类。

2〉声明最终方法:

    使用final声明成员方法称为最终方法,最终方法不能被子类覆盖。

  public class Circle1 extends Graphics1

{

         public final double area()     //最终方法,不能被子类覆盖

        {

                      return Math.PI*this.radius*this.radius;

          }

}

最终类可以不包含最终方法,非最终类可以包含最终方法。