- 重写都是方法的重写,和属性没有关系。
//父类写一个静态方法======================
public class A {
public static void test() {
System.out.println("A=>test()");
}
}
//子类也写一个静态方法====================
public class B extends A {
public static void test() {
System.out.println("B=>test()");
}
}
//测试类================================
import OOP.demo.A;
import OOP.demo.B;
public class Application {
public static void main(String[] args) {
B b = new B();
b.test();
A a = new B(); //父类的引用指向了子类
a.test();
}
}
====运行结果====
B=>test()
A=>test() //方法的调用只和定义的数据类型(`=`左边)有关
- 然后我们将父类中的修饰词
static
删除,将子类的方法删除,在子类中使用IDEA快捷键Alt
+Insert
,选择Override Methods
“重写方法”,选择默认的test():void
。 - 这时会生成如下代码:
public class B extends A {
@Override
public void test() {
super.test();
}
}
- 这里
@Override
是注解,是一种有功能的注释。 - 这里默认
super.test();
是在调用父类方法,将之改为System.out.println("B=>test()");
。现在所有代码如下:
//父类==================================
public class A {
public void test() {
System.out.println("A=>test()");
}
}
//子类==================================
public class B extends A {
@Override
public void test() {
System.out.println("B=>test()");
}
}
//测试类================================
import OOP.demo.A;
import OOP.demo.B;
public class Application {
public static void main(String[] args) {
B b = new B();
b.test();
A a = new B();
a.test();
}
}
====运行结果====
B=>test()
B=>test()
-
区别在于之前都是
static
的静态方法,现在不是了。这时,子类重写了父类的方法。 -
重写小结:
- 前提是需要有继承关系,子类重写父类的方法。(跟属性无关)
- 方法名必须相同
- 参数列表必须相同(区别于“重载”,重载是当前方法中,同方法名,不同参数)
- 修饰符:范围可以扩大,但是不能缩小。public>protected>default>private
- 抛出的异常:范围可以被缩小,但不能扩大。比如小范围异常ClassNotFoundException,不能扩大为Exception异常。
-
重写:子类的方法头和父类一致,方法体不同。
-
为什么需要重写?
- 父类的功能,子类不一定需要,或者不一定满足。
-
先记着,之后会有更详细讲解。