最近重新温习Java基础知识,查漏补缺;Java重写:Java重写只是存在在父子类之间的概念,子类只能重写父类的 非private和非final方法;对于不想让子类重写的发放可以将方法用private或者final来修饰;如果父类想让子类重写的方法可以用 protected方法来修饰;
1.发生方法重写的两个方法返回值、方法名、参数列表必须完全一致(子类重写父类的方法)
2.子类抛出的异常下不能超过父类相应方法抛出的异常(子类异常不能大于父类异常)
3.子类方法的访问级别不能低于父类相应方法的访问级别(子类访问级别不能低于父类访问级别)
4.子类方法的返回值必须是父类方法返回值的子类或者和父类一样。
注意: 1.方法重写 ,子类的方法必须和父类要重写的方法 方法名,参数列表,返回值一样;否则就不是重写;如果子类的一个方法和父类的用private修饰的方法一样,则也不是重写,而是属于子类自己的全新的方法,和重写没有关系;如下代码中的wolf的getAge()是全新方法相对于屏蔽的父类中的private getAge()方法;
public class ClassExtends { public static void main(String[] args) { Animal w = new Wolf(); try { w.getAge(); } catch (IOException e) { e.printStackTrace(); } } } class Animal{ private String name; private int age; public Animal(String name){ System.out.print("Animal 带一个参数的构造函数:动物名字叫:"+name+","); } public Animal(String name,int age){ this(name); System.out.println("今年:"+age+"岁了!"); } // private void getAge(){ // System.out.println("My age is 6!"); // } public Object getAge() throws IOException{ getAge(); return null; } } class Wolf extends Animal{ public Wolf() { super("灰太狼",6); System.out.println("Wolf 的无参构造函数!"); } @Override public String getAge()throws Exception{ System.out.println("My age is "+2); return null; } }
2.子类方法的访问级别不能低于父类相应方法的访问级别:如果Wolf中的 getAge()为private, Animal中的getAge()为public,ClassExtends 类这个类编译的时候不会有什么问题,但是运行时,根据多态运行机制 w.getAge()调用的是 Wolf的getAge()方法,但是这个方法为private ,虚拟机访问不到,所以会报错(编译时Wolf类的getAge()方法会报错)
3.子类方法的返回值必须是父类方法返回值的子类或者和父类一样:如 Wolf的 getAge() 返回String类型,Animal的getAge()返回Object类型,这个也是子类重写父类方法
4.最好不要在父类构造函数中调用要被重写的方法;因为当类加载的时候,总是先加载父类,如果运行时类型是子类对象,在父类构造函数中调用了被重写的方法,则该方法其实运行的是子类重写后的方法,这个方法可能会用到子类的成员变量,而这时子类的成员变量还没有初始化,可能会 引起空指针;