// 重写我理解的全名是重写父类的方法(父类的静态方法也是可以被继承的) 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就规避了 } }