面向对象11:方法重写(子类父类必须为非静态方法,
无 static)
!重点:先看笔记!
重写:需要有继承关系,是子类重写父类的方法!//重写只针对方法 不针对属性或其它的
1.方法名必须相同
2.参数列表列表必须相同
3.修饰符:范围可以扩大: public>Protected>Default>private
4.抛出的异常:范围,可以被缩小,但不能扩大:ClassNotFoundException --> Exception(大)
重写:子类的方法(方法名、参数列表)和父类必须要一致;方法体(方法里面的各自内容)不同!
为什么需要重写:
1.父类的功能,子类不一定需要,或者不一定满足!
Alt + Insert 快捷键: override;
重写只跟非静态方法有关 且只能是子类重写父类的方法
重写的关键词也只能是public
!子类重写父类的方法过程
下面详细看下代码的过程:
1.A类和B类都是静态方法(有static时)
new的都是A 结果却不同
父类B 子类A
a.test();调用的是A的方法
b.test();调用的是B的方法 父类的引用指向了子类 B b = new A();
2.A类和B类都同时去掉static 变成非静态方法
把A类的原先方法删除
Alt + Insert 快捷键 选择Override Methods 方法重写
自动跳出下图的方法
自动填充的方法中
super.test(); --------------------> 默认调用的是父类的test
把这行代码删掉 自行修改替换成 System.out.println("A=>test()");
再运行程序,看下图:
发现结果跟有static关键词的静态方法的结果 大不相同
**由于子类(A类)重写了父类(B类)的方法 **
导致b.test();调用的是A类的方法
!注意点:
重写只跟非静态方法有关 B b = new A(); 子类重写了父类的方法
重写的关键词也只能是public
所以静态方法 和非静态方法的区别很大
B(父类)
package com.oop.demo06;
//重写都是方法的重写,和属性无关
public class B {
public void test(){ //把关键词static去掉
System.out.println("B=>test()");
}
}
A(子类)
package com.oop.demo06;
//A类继承B类
public class A extends B{
//Alt + Insert快捷键
//Override 重写
@Override//注解:有功能的注释!
public void test() {
System.out.println("A=>test()");
}
}
Application
package com.oop.demo06;
public class Application {
//静态方法(有static)和非静态的方法区别很大!
//静态方法: //方法的调用只和左边,定义的数据类型有关
//非静态方法:重写
public static void main(String[] args) {
A a = new A();
a.test();//A
//父类的引用指向了子类
B b = new A();//子类重写了父类的方法
b.test();//A
}
}
Application的结果:
A=>test()
A=>test()
标签:11,静态方法,Day54,方法,面向对象,子类,test,父类,重写
From: https://www.cnblogs.com/baixiaofan/p/17976513