重写的基本概念
在子类定义一个方法和父类的一个方法的定义形式一样(名称和参数)(返回类型等会单独说)
但内部可能有所不同
就说子类重写了父类的某某方法
重写的条件
1.非静态方法(无static)
2.子类方法修饰符相对于父类可以扩大(或者相同),不可以缩小(public>Protected>Default>private)
3.需要有继承关系,子类重写父类的方法
4.方法名和参数列表必须相同(返回类型相同或者返回类型是对应父类方法返回类型的子类)
5.抛出的异常,范围可以缩小,不能扩大。
细节
重写只与非静态方法有关。
B是A的父类;
一般是
A a=new A();
但如果B为A的父类
可以这样
B b=new A();//父类的引用指向了子类
此时主程序调用a.test();
和b.test();
分别输出A模板的test和B模板的test
此时A和B中的方法但是静态的
调用只和左边有关
那么把方法改成非静态呢?
此时还是父子类有同名方法
我把子类的方法该成输出I hate
此时观察输出可以看出,输出的两个结果全变味了 I hate
此时就叫子类重写了父类的方法
用一下弹幕大佬的解释
因为静态方法是类的方法,而非静态是对象的方法
有static时b调用了b类的方法,以为,b是B类定义的
没有static时,b调用的是对象的方法,而b是用A类new的
重写和重载比较