子类
子类对象“is a”父类对象,在程序设计上还体现着另一大特点,就是使用了继承。
extends关键字
格式如下:
修饰符 class 子类名 extends 父类名{
类体
}
Object类
主要方法:
·public final Class getClass( ):获取当前对象所属的类信息,返回Class对象。
·public String toString( ):按字符串对象返回当前对象本身的有关信息。
·public boolean equals(Object obj):比较两个对象是否是同一个对象,是则返回true。
equals()与==
equals:判断值是否相等
==:判断地址空间是否相等
使用父类的成员
使用规则:
- 父类中使用private定义的属性,子类不能访问
- 子类不可以降低父类的访问权限
对象转型
可以将子类的对象赋给父类的变量。但反过来是错误的,不能把父类的实例赋给子类的引用。
instanceof的使用
instanceof的使用示例
public void method(Employeee){
if(einstanceof Manager){
/*对Manager对象进行处理*/
}
else if(einstanceof Contractor){
/*对Contractor对象进行处理*/
}
else{
/*对Employee对象进行处理*/
}
作用是:判断父类的实例指向哪个子类。
方法覆盖
父类中原有的方法可能不能满足新的要求,因此需要修改父类中已有的方法。这就是方法覆盖(Over ride),也称为方法重写或隐藏。从逻辑上看就是子类中的成员方法将隐藏父类中的同名方法。
子类中定义方法所用的名字、返回类型及参数列表和父类中方法使用的完全一样,也就是具有相同的方法签名。
覆盖使用规则:
·覆盖方法的允许访问范围不能小于原方法。
·覆盖方法所抛出的异常不能比原方法更多。
super
如果子类已经重写了父类的方法,但在子类中还想使用父类中被隐藏的方法,就使用super关键字
如果调用super的话,必须放在第一行。
终极类和抽象类
Java中有一个重要的关键字final,它表示终极,既可以修饰一个类,也可以修饰类中的成员变量或成员方法。
如果—个类被定义为final,则它不能有子类;如果一个方法被定义为final,则不能被覆盖;如果一个变量被定义为final,则它的值不能被改变
抽象类
与之相对应的是关键字abstract,它可以用于类或方法,表示抽象。使用abstract修饰的方法的方法体为空,修饰的类必须被子类继承。有的时候一些类是不能被继承的。Java中预定义的Java.lang.String就是如此。
定义了方法但没有定义具体实现的类称为抽象类。在程序中不能用抽象类作为模板来创建对象,必须生成抽象类的一个非抽象的子类后才能创建实例。反之,不能在非抽象的类中定义抽象方法。也就是说,只有抽象类才能具有抽象方法。如果一个抽象类除了抽象方法外什么都没有,则使用接口更合适。
格式:
public abstract class 抽象类名{
//抽象类
类体
}
public abstract 返回值类型 抽象方法名([参数列表]);
不论是类还是方法都要用关键字abstract进行修饰。抽象类的子类所继承的抽象方法同样还是抽象方法
,包含抽象方法的类一定是抽象类,但抽象类中的方法不一定都是抽象方法。抽象类是不能创建对象的。除非通过间接的方法来创建其子类的对象,但是可以定义一个抽象类的引用变量。
接口
接口是体现抽象类功能的另一种方式,可将其想象为一个“纯”的抽象类。它允许创建者规定一个类的基本形式,包括方法名、参数列表以及返回值类型,但不规定方法体。因此在接口中所有的方法都是抽象方法,都没有方法体。
java特性:单继承,多重实现。具体来说,Java不支持多重继承的概念,一个类只能从唯一的一个类继承而来。但是,这并不意味着Java不能实现多重继承的功能。具体来说,Java允许一个类实现多个接口,从而实现了多重继承的能力,并具有更加清晰的结构。
定义格式:
[接口修饰符] interface 接口名[extends父接口列表]{
……//方法原型或静态常量
}
接口与一般类一样,本身也具有数据成员变量与方法,但数据成员变量一定要赋初值,且此值不能再更改,而方法必须是“抽象方法”。
interface CharStorage{//使用interface说明
void put(char c);//抽象方法,没有{}
char get( );//抽象方法
}
在接口中定义的成员变量都默认为终极静态变量,即系统会将其自动添加final和static这两个关键字,并且对该变量必须设置初值。
终极方法
成员方法也可以被标记为final,从而成为终极方法或终态方法。被标记为final的方法将不能被覆盖。
格式为:
final 返回值类型 终极方法名([参数列表]){
方法体
}
要实现接口,可以在类的声明中用关键字implements来表示。接口中的所有抽象方法必须在类或子类中实现。implements语句的格式如下。
public class 类名 implements 接口名[,接口名[,接口名]]{
/抽象方法及终极静态变量的定义/
}
终极变量
一个变量被标记为final,称为终极变量或终态变量。实际上它会成为一个常量。企图改变终极变量的值将引起编译错误。