继承
被继承的类一般被称为“超类”或“父类”,继承的类被称为“子类”,子类默认拥有父类的类体,在此基础上,子类还可以添加新的成员或修改继承了的方法,以满足新的需求。 Java中,实际上所有的类均直接或间接地继承自java.lang.Object类,也可以说Object类是Java中的总根类。当需要某个类继承自指定类时,将使用extends关键字,具体语法如下:
class 子类名 extends 父类名
{子类类体}
例如:
<span style="font-size:18px;">//交通工具类
class Vehicle{}
//汽车类,继承自交通工具类
class Car extends Vehicle{}
//卡车类,继承自汽车
class Truck extends Car{}</span>
当两个类有了继承与被继承的关系后,就会涉及成员变量的继承问题,父类成员变量能否被继承,完全取决于成员变量的访问限制,成员的访问限制级由访问修饰符确定,访问级别共有四种,分别是:公有(public)、私有(private)、默认(不写)和保护(protected)。
对于子类,如果其父类的成员声明为public类型,那么无论这两个类是否在同一个包中,子类均能继承父类的该成员;当成员变量声明为private类型时,任何子类均不能继承该成员;protected类型和默认类型只有在谈论继承时才有区别,该区别为:当成员变量被protected修饰时,若访问该变量的类位于包外,则只有通过继承才能访问该变量。总结如下:
访问权限
当前类 | 当前包 | 包外子类 | 包外 | |
public | 可以访问 | 可以访问 | 可以访问 | 可以访问 |
protected | 可以访问 | 可以访问 | 可以访问 | |
默认 | 可以访问 | 可以访问 | ||
private | 可以访问 |
super
对于成员变量来说,当子类具有名称与其父类的成员变量名称相同的成员变量时,在子类调用此名称的成员变量时,调用的将会是子类中本身具有的,而不是从父类继承的,
<span style="font-size:18px;">//父类
class Father
{
String s="父类的成员变量";
}
//子类
class Son extends Father
{
String s="子类的成员变量";
public void show()
{
System.out.print("这里调用的是"+s);
System.out.println("这里调用的是"+super.s);
}
}
public class Sample1
{
public static void main(String[] args)
{
//创建对象调用方法
Son s=new Son();
s.show();
}
}</span>
第一次输出的是子类中的字符串s,而第二次输出的是父类中的字符串s。父类中的成员对子类来说是可继承的,只是由于名称相同,所以父类中的成员被隐藏起来了。在子类中使用super关键字,便可访问父类的该变量。super和this一样,是一个预定义对象引用,它只能在子类中使用,用来访问父类成员。
final
当一个类被final修饰时,就表示该类不能再被继承,即使该类的访问限制为public类型的,也不能被访问。因此,只有当需要确保类中的方法都不要被重写改进时才应该用final修饰,。String类就是一个被final修饰的最终类,所以它不能被自由继承。final还可以用来修饰类中的方法。当一个类中的方法被final修饰时,就表示这个方法不能被子类重写,只能继承。