面向对象11:方法重写
面向对象11:方法重写
在Java中,方法重写是实现多态性的关键机制之一。它允许子类重新定义父类中已有的方法,从而使子类对象能够表现出不同的行为。
方法重写的基本概念
1.定义
子类提供一个与父类同名、同参数列表、同返回类型的方法实现,以覆盖父类的原始行为
2.示例:
//重写都是方法的重写,和属性无关
public class B {
    public void test(){
        System.out.println("B=>test()");
    }
}
public class A extends B{
    //Override 重写
    //Alt+Insert 选中 Overside Methods
    @Override //注解:有功能的注释
    public void test() {
        System.out.println("A=>test()");
    }
}
import com.oop.demo05.A;
import com.oop.demo05.B;
public class Application {
    public static void main(String[] args) {
        A a = new A();
        a.test();//A类
        B b = new A();//实际对象是new A()
        b.test();//A类
    }
}
3.规则
- 必须要有继承关系,子类重写父类的方法。
 - 方法名、参数列表(数量、类型、顺序)必须与父类完全一致。
 - 修饰符:范围可以扩大但不能缩小  
public>protected>default>private。 - 子类方法不能抛出比父类方法更多或更宽泛的受检异常。
 - 子类的方法和父类必须要一致,方法体不同。
 
4.重写的原因
父类的功能,子类不一定需要,或者不一定满足
5.@Override注解的作用
- 显式声明重写:告诉编译器检查该方法是否真的重写了父类方法。
 - 避免错误:如果方法签名不匹配(如拼写错误),编译器会报错。
 
静态方法不能被重写
静态方法vs实例方法
1.静态方法(static)
- 属于类,直接通过类名调用(如 
A.test())。 - 无法使用
this或super,因为它们不关联具体对象。 - 调用规则:根据引用变量的类型决定调用哪个类的静态方法。
 
public class B {
    public static void test(){
        System.out.println("B=>test()");
    }
}
public class A extends B{
    public static void test(){
        System.out.println("A=>test()");
    }
}
```java
import com.oop.demo05.A;
import com.oop.demo05.B;
public class Application {
    public static void main(String[] args) {
        //方法的调用只和左边:定义的数据类型有关
        A a = new A();
        a.test();//A类
        //父类的引用指向了子类
        B b = new A();//b的引用类型是B
        b.test();//B类
    }
}
2.实例方法(非static)
- 属于对象,必须通过对象实例调用(如
a.test())。 - 可以使用
this引用当前对象 - 调用规则:根据实际对象的类型决定调用哪个类的方法
 - 代码如重写方法
 
                    
                
                
            
        
浙公网安备 33010602011771号