**【简介】:**在Java中使用extends关键字来表示一个类继承另外一个类。
【语法】:
public class Sub extends Base{}
【案例演示】:
public class Base {
public int a;
private int b;
int c;
protected int sum(int a, int b) {
return a + b;
}
}
public class Sub extends Base {
public void sub() {
a = 2;
b = 2;
c = 2;
sum(1, 2);
}
}
【图解错误】:
【注意事项】:
- 当Sub和Base位于同一个包中的时候,Sub类继承Base类中public、protected、和默认访问级别的成员变量和方法。
- 当Sub和Base不位于同一个包中的时候,Sub类继承Base类中public、protected访问级别的成员变量和方法。
- 一个类只能有一个直接父类,不能同时直接继承多个父类,但是可以间接继承多个父类。
- 每一个类都默认继承Object类。
- 父类的构造器不能被子类继承(构造器必须与类名称相同)
【应用场景】: 类的功能有多种实现方式,选用那种方式,取决于调用者给定的参数。
【满足重载的条件】:
- 方法名相同
- 方法中参数类型、个数、顺序至少有一项不相同
- 方法的返回值类型可以不同。
- 方法的修饰符可以不相同
【应用场景】: 当父类中的方法不满足子类使用要求的时候,需要对父类中的方法进行覆盖。
【方法覆盖满足的约束条件】:
- 子类方法的名称、参数签名、和返回值类型必须与父类相同。
【正确代码演示】:
public class Base {
public void method() {
}
}
public class Sub extends Base {
public void method() {
}
}
【错误分析】:
- 子类方法不能缩小父类方法的访问权限。(原因:与多态机制发生冲突。)
【错误代码演示】:
public class Base {
public void method() {
}
}
public class Sub extends Base {
private void method() {//子类缩小了父类的方法的访问权限
}
}
【错误分析】:
- 子类方法不能抛出比父类更多的异常。(会导致程序异常终止)
- 方法覆盖只存在于子类和父类之间,同一个类中的方法只能被重载不能被重写。
- 父类的静态方法不能被子类覆盖为非静态方法。
【错误代码演示】:
public class Base {
public static void method() {
}
}
public class Sub extends Base {
public void method() {//编译出错
}
}
【错误分析】:
- 子类可以定义同父类的静态方法同名的静态方法,以便在子类中隐藏父类的静态方法。
【正确代码演示】:
public class Base {
public static void method() {
}
}
public class Sub extends Base {
public static void method() {
}
}
- 父类的私有方法不能被子类覆盖
- 父类的抽象方法可以被子类通过两种方式进行覆盖(1、实现父类的抽象方法 2、重新声明父类的抽象方法)
【正确代码演示】:
public abstract class Base {
abstract void method1();
abstract void method2();
}
public abstract class Sub extends Base {
//实现并且扩大访问权限
public void method1() {
}
//重新声明父类的抽象方法,并没有实现
public abstract void method2();
}
- 父类的非抽象方法可以被覆盖为抽象方法。
public class Base {
public void method() {
}
}
public abstract class Sub extends Base {
public abstract void method();
}
4、方法覆盖与方法重载的区别
【相同点】:
- 都要求方法同名
- 都可以用于抽象方法和非抽象方法之间
【不同点】:
- 方法覆盖要求参数签名必须一致,而方法重载要求参数签名必须不一致
- 方法覆盖要求返回值类型必须一致,而方法重载对此没有限制
- 方法覆盖发生在子类和父类之间,方法重载用于在同一个类的所有方法
- 方法覆盖对于方法的访问权限和抛出的异常有一定的限制,而方法重载没有限制
- 父类的方法只能被子类覆盖一次,而重载可以重载多次
- super关键字表示当前子类的父类
- super关键字可以用来访问父类的构造器,默认子类会访问父类的无参构造器。
- 访问父类非私有的字段和方法(此处的方法只能是非静态的)
【定义】:
用父类类型或父类接口来接收子类对象。即一个对象在运行时的多种状态。
【使用注意事项】:
- 对于引用类型的变量,Java编译器会按照它声明的类型来进行处理。例如:如果用父类类型接收子类对象,又需要访问子类中特有的属性时,就必须将该对象强制转换为子类类型,否则编译报错。
- 对于引用类型的变量,运行时、Java虚拟机会按照它实际引用的对象来处理。
- 在运行时环境中,通过引用类型变量来访问所引用对象的方法和属性时,Java虚拟机采用以下绑定规则:
- 实例方法与引用变量实际引用的对象的方法绑定,这种绑定属于动态绑定,因为是在运行时由Java虚拟机动态决定的。
- 静态方法与引用变量所声明的类型的方法绑定,这种绑定属于静态绑定,因为实际上在编译阶段就已经做了绑定。
- 成员变量(包括静态变量和实例变量)与引用变量所声明的类型的成员变量



