当定义一个类时,除了声明类的访问权限之外,有时还需要声明类的继承特性。即声明一个类是否为抽象类或是最终类,使用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;
}
}
最终类可以不包含最终方法,非最终类可以包含最终方法。
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;
}
}
最终类可以不包含最终方法,非最终类可以包含最终方法。