A类:
public class A extends B{
public static void test(){
System.out.println("A=>test");
}
}
B类:
public class B {
public static void test(){
System.out.println("B=>test");
}
}
主函数:
public class Application {
public static void main(String[] args) {
//静态方法:方法的调用只和左边(定义的数据类型)有关
A a = new A();
a.test();
//父类的引用指向了子类
B b = new A();
b.test();
}
运行结果:
用B类新建了A类的对象,把A赋值给了B,这时b是A,A又继承了B类,向上转型,所以调用B类方法的时候,就是B=>test
方法的调用只和左边(定义的数据类型)有关
将A类改为
public class A extends B{
@Override//重写
public void test(){
System.out.println("A=>test");
}
}
B类:
public class B {
public void test(){
System.out.println("B=>test");
}
}
主函数:
public class Application {
public static void main(String[] args) {
//静态方法:方法的调用只和左边(定义的数据类型)有关
A a = new A();
a.test();
//父类的引用指向了子类
B b = new A();
b.test();
}
}
运行结果:
静态方法是类的方法,而非静态方法是对象的方法,即b是A new出来的对象,因此调用了A的方法。
重写:需要有继承关系,子类重写父类的方法!
1.方法必须相同
2.列表参数必须相同
3.修饰符:范围可以扩大,但是不能缩小(public>Protected>Default>private)
4.抛出的异常:范围可以被缩小,但不能扩大(ClassNotFoundException->Exception)
重写,子类的方法和父类要一致,方法体不同!
为什么需要重写:
1.父类的功能,子类不一定需要,或者不一定满足!
如果子类和父类都有,只要子类没有重写则调用父类,如果子类重写则调用子类