java重写

最近重新温习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.最好不要在父类构造函数中调用要被重写的方法;因为当类加载的时候,总是先加载父类,如果运行时类型是子类对象,在父类构造函数中调用了被重写的方法,则该方法其实运行的是子类重写后的方法,这个方法可能会用到子类的成员变量,而这时子类的成员变量还没有初始化,可能会 引起空指针;

原文地址:https://www.cnblogs.com/happy-rabbit/p/4938931.html