继承是一种由已有的类创建新类的机制。利用继承,我们可以先创建一个共有属性的一般类,根据该一般类再创建具有特殊属性的新类,新类继承一般类的状态和行为,并根据需要增加它自己的新的状态和行为。由继承而得到的类称为子类,被继承的类称为父类(超类)。Java不支持多重继承(子类只能有一个父类)。
1 创建子类
在类的声明中,通过使用关键字extends来创建一个类的子类,格式如下:
class Students extends People
{
… ..
}
把Students 声明为People类的子类,People是Students的父类。
l 子类的继承性
子类自然地继承了其父类中不是private的成员变量作为自己的成员变量,并且也自然地继承了父类中不是private的方法作为自己的方法。
例子6.
import java.applet.*;
import java.awt.*;
class Father
{ private int money;
float weight,height;
String head;
String speak(String s)
{ return s ;
}
}
class Son extends Father
{ String hand ,foot;
}
public class Example4_6 extends Applet
{ Son boy;
public void init()
{ boy=new Son();
boy.weight=1.80f;boy.height=120f;
boy.head="一个头";boy.hand="两只手 ";boy.foot="两只脚";
}
public void paint(Graphics g)
{ g.drawString(boy.speak("我是儿子"),5,20);
g.drawString(boy.hand+boy.foot+boy.head+boy.weight+boy.height,5,40);
}
}
注:如果一个类的声明中没有使用extends关键字,这个类被系统默认为是Object的子类。Object是包java.lang中的类。
l 成员变量的隐藏和方法的重写
当我们在子类中定义的成员变量和父类中的成员变量同名时,则父类中的成员变量不能被继承,此时称子类的成员变量隐藏了父类的成员变量。当子类中定义了一个方法,并且这个方法的名字、返回类型、及参数个数和类型和父类的某个方法完全相同时,父类的这个方法将被隐藏。我们说:我们重写了父类的方法或置换了父类的方法。
子类通过成员变量的隐藏和方法的重写可以把父类的状态和行为改变为自身的状态和行为。
例子7
import java.applet.*;
import java.awt.*;
class Chengji
{
float f(float x,float y)
{ return x*y;
}
}
class Xiangjia extends Chengji
{ float f(float x,float y)
{ return x+y ;
}
}
public class Example4_7 extends Applet
{ Xiangjia sum;
public void init()
{ sum=new Xiangjia();
}
public void paint(Graphics g)
{ g.drawString("sum="+sum.f(4,6),5,20);
}
}
2运行时多态
对于重写或继承的方法,Java运行时系统根据调用该方法的实例的类型来决定选择调用哪个方法。对于子类创建的一个对象,如果子类重写了父类的方法,则运行时系统调用子类的方法,如果子类继承了父类的方法(未重写),则运行时自然相当于调用了父类的方法。
例子8
import java.applet.*;
import java.awt.*;
class Area
{
float f(float r )
{ return 3.14159f*r*r;}
float g(float x,float y)
{return x+y;}
}
class Circle extends Area
{ float f(float r)
{return 3.14159f*2.0f*r;}
}
public class Example4_8 extends Applet
{ Circle yuan;
public void init()
{ yuan=new Circle();
}
public void paint(Graphics g)
{ g.drawString("yuan= "+yuan.f(5.0f),5,20); //调用子类的方法f。
g.drawString(" "+yuan.g(2.0f,8.0f),5,40); //调用父类的方法g。
}
}
3.final类和final方法
final类不能被继承,即不能有子类。如:
final class A
{ …
…
}
A就是一个final类。有时候是出于安全性的考虑,将一些类修饰为final类。例如:Java提供的String类,它对于编译器和解释器的正常运行有很重要的作用,对它不能轻易改变,因此它被修饰为final类。
如果一个方法被修饰为final方法,则这个方法不能被重写。
4.abstract (抽象)类和abstract方法
abstract class A
{ ……
}
abstract类不能创建对象,必须产生其子类,由子类创建对象。
对于abstract方法,只允许声明,而不允许实现。如: abstract void draw()
如果一个类是一个abstract类的子类,它必须具体实现父类的abstract方法。
如果一个类中含有abstract方法,那么这个类必须用abstract来修饰(abstract类可以没有abstract方法)。