父类
package com.encapsulation.demo02;
// 重写都是方法的重写和属性无关
public class B {
public void test() {
System.out.println("B=>test()");
}
}
子类
package com.encapsulation.demo02;
public class A extends B {
// Override重写 要重新父类的方法必须那个类没有static修饰
@Override // 注解:有功能的注释
public void test() {
System.out.println("A=>test()");
}
}
调用
package com.encapsulation;
import com.encapsulation.demo02.A;
import com.encapsulation.demo02.B;
public class App {
// 静态的方法和非静态的方法区别很大
// 静态方法: 方法的调用只和左边,定义的数据类型有关
//非静态:重写
public static void main(String[] args) {
// 方法的调用只和左边,定义的数据类型有关
A a = new A();
a.test(); // A
// 父类的引用指向了子类 在有static修饰符的时候还是调用父类本身的test(), 反之就是子类重写了父类的test方法
B b = new A(); // 子类重写了父类的方法
b.test(); // B
}
}
知识点
- static修饰的变量我们称之为静态变量,没有用static修饰的变量称之为实例变量
- 静态变量是随着类加载时被完成初始化的,它在内存中仅有一个,且JVM也只会为它分配一次内存,同时类所有的实例都共享静态变量,可以直接通过类名来访问它。
- 但是实例变量则不同,它是伴随着实例的,每创建一个实例就会产生一个实例变量,它与该实例同生共死。
- 所以我们一般在这两种情况下使用静态变量:对象之间共享数据、访问方便。
- static方法
- static修饰的方法我们称之为静态方法,我们通过类名对其进行直接调用。由于他在类加载的时候就存在了,它不依赖于任何实例,所以static方法必须实现,也就是说他不能是抽象方法abstract。
- Static方法是类中的一种特殊方法,我们只有在真正需要他们的时候才会将方法声明为static。如Math类的所有方法都是静态static的。
- static代码块
- 被static修饰的代码块,我们称之为静态代码块,静态代码块会随着类的加载一块执行,而且他可以随意放,可以存在于该了的任何地方。
- static局限性
- 它只能调用static变量。
- 它只能调用static方法。
- 不能以任何形式引用this、super。
- static变量在定义时必须要进行初始化,且初始化时间要早于非静态变量。
总结
- 需要有继承关系,子类重写父类的方法!
- 方法名必须相同
- 参数列表必须相同
- 修饰符:范围可以扩大 pubilc>Protected>Default>private
- 抛出的异常:范围可以被缩小,但不能扩大; calssNotFoundException --> Exception(大)
- 重写,子类的方法和父类必须要一致;方法体不同
- 为什么需要重写:
- 父类的功能子类不一定需要,或者不一定满足
- 快捷键 alt+insert : override;