重写的理解

// 重写我理解的全名是重写父类的方法(父类的静态方法也是可以被继承的)
public class OOP {
    public static void main(String[] args) {
        Student3 stu = new Student3();
        // 父类指向子类对象(其实就是子类的new类型是父类)
        Personer stu2 = new Student3();
        // 静态方法
        stu.read(); // 我要重写父类 ====> 子类重写的静态方法 (当子类没有重写父类的静态方法时,就会去调用父类的静态方法)
        stu2.read(); // 我在读  =====> 父类的静态方法
        // 非静态方法时继承
        stu.fn();  // 我是子类的普通方法 =====> 子类重写的方法
        stu2.fn();  // 我是子类的普通方法 =====> 子类重写的方法
    
// 父名--父名 说明当子类没有与父类同名的属性时用父类的,子类有和父类同名的属性需要看类类型是父类就用父类的属性,子类就用子类的属性
System.out.println(stu.name + "--" + stu2.name);
    }
}
// Personer的子类Student3 
class Student3 extends Personer{ 
    // 如果父类待重写的方法是静态的,那么子类同名必须为静态的
    public static void read(){
        System.out.println("我要重写父类");
    }
    public void fn(){
        System.out.println("我是子类的普通方法");
    }
}
// Personer类
class Personer{
    String name = “父名”;

    public Personer() {
        System.out.println("我调用了父类的构造函数吗");
    }
    public static void read(){
        System.out.println("我在读");
    }
    public void fn(){
        System.out.println("我是父类的普通方法");
    }
}

 总结: 静态方法根据对象的类类型决定调用父的还是子的;非静态:重写了都调用子类的,没重写都调用父类的

重写的一些注意点 ☆

重写是针对继承来说的,所以重写要保证返回值、参数、方法名相同缺一不可,不然就不叫重写
重写的方法要比基类被重写的方法访问权限要高,这是里氏代换原则规定的(LSP);
  public class Computer {
    // 权限是default
    int fn(int a){
        this.call();
        System.out.println("我是普通方法");
        return 6;
    }
}
public class Lenovo extends Computer {
    private int fn(int a){
        this.call();
        System.out.println("我是联想中的普通方法");
        return 6;
    }
}



public class MyClass {
    public static void main(String[] args) {
        Computer c = new Hongqi();
        c.fn(4); // 这里就有问题了,因为私有方法不能被外部类调用,为了防止以前能调用重写后就不能调用的这种错误,直接从设计上java就规避了
    }
}

 

posted @ 2021-02-15 11:26  火鸡的呐喊  阅读(60)  评论(0编辑  收藏  举报