类的继承
概念:
- 根据已有类来定义新类,新类拥有已有类的所有功能
- Java只支持类的单继承,每个子类只能有一个直接超类
- 超类是所有子类的公共属性及方法的集合,子类则是超类的特殊化
继承语法:
[修饰符] class ClassName extends SuperClassName {
//类体
}
子类不能直接访问从超类中继承的私有属性及方法,但可使用公有(及保护)方法进行访问
public class B {
public int a = 10;
private int b = 20;
protected int c = 30;
public int getB() {
return b;
}
}
public class A extends B {
public int d;
public void tryVariables() {
System.out.println(a); //允许
System.out.println(getB()); //允许
System.out.println(c); //允许
}
}
隐藏和覆盖
属性隐藏:
子类中声明了与超类中相同的成员变量名
从超类继承的变量将被隐藏
访问被隐藏的超类属性
(1)调用从超类继承的方法,则操作的是从超类继承的属性
(2)本类中声明的方法使用“super.属性”访问从超类继承的属性
方法覆盖
如果子类不需使用从超类继承来的方法的功能,则可以声明自己的同名方法, 称为方法覆盖
• 覆盖方法的返回类型,方法名称,参数的个数及类型必须和被覆盖的方法一摸 一样
• 只需在方法名前面使用不同的类名或不同类的对象名即可区分覆盖方法和被覆盖方法
• 覆盖方法的访问权限可以比被覆盖的宽松,但是不能更为严格(private可以扩大成public)
使用方法覆盖的注意事项
① 由于覆盖之后的方法与原方法一模一样,建议在开发的时候采用复制粘贴的方式,
不建议手写,因为手写的时候非常容易出错,比如在 Object 类当中有 toString()方法,该方法中的 S 是大写的,在手写的时候很容易写成小写 tostring(),这个时候你会认为 toString()方法已经被覆盖了,但由于方法名不一致,导致最终没有覆盖;
② 私有的方法不能被继承,所以不能被覆盖;
③ 构造方法不能被继承,所以也不能被覆盖;
④ 覆盖之后的方法不能比原方法拥有更低的访问权限,可以更高;
⑤ 覆盖之后的方法不能比原方法抛出更多的异常,可以相同或更少;
⑥ 方法覆盖只是和方法有关,和属性无关;
⑦ 静态方法不存在覆盖(不是静态方法不能覆盖,是静态方法覆盖意义不大)
【注】
• 必须覆盖的方法 派生类必须覆盖基类中的抽象的方法,否则派生类自身也成为抽象类.
• 不能覆盖的方法
基类中声明为final的终结方法
基类中声明为static 的静态方法
• 调用被覆盖的方法 super.overriddenMethodName();