Java方法重写小笔记

一、重写原则:两同两小一大

两同:方法名相同,参数类型相同;

两小:
子类返回类型小于等于父类方法返回类型;//注意:java5 及更早版本返回类型要一样,java7 及更高版本可以不同

子类抛出异常小于等于父类方法抛出的异常;

一大:
子类访问权限大于等于父类方法访问权限。

重写是子类对父类的允许访问的方法的实现过程进行重新编写,方法名和形参都不能改变。即外壳不变,核心重写!

重写方法不能抛出新的检查异常或者比被重写方法申明更加宽泛的异常。例如: 父类的一个方法申明了一个检查异常 IOException,但是在重写这个方法的时候不能抛出 Exception 异常,因为 Exception 是 IOException 的父类,抛出 IOException 异常或者 IOException 的子类异常。

class Person {
    String name = "No name";
    public Person(String nm) {
        name = nm;
    }
    public void testException() throws Exception {
        throw new Exception();
    }
}
class Employee extends Person {
    String empID = "0000";

    public Employee(String id) {
        super(id);
        empID = id;
    }
    @Override
    public void testException() throws IOException {
        throw new IOException();
    }
}

访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为 public,那么在子类中重写该方法就不能声明为 protected。

class Person {
    String name = "No name";
    public Person(String nm) {
        name = nm;
    }
    protected void testPermission() {
        System.out.println("i'm a paraent testPermission()");
    }
}
class Employee extends Person {
    String empID = "0000";

    public Employee(String id) {
        super(id);
        empID = id;
    }
    @Override
    public void testPermission() {
        System.out.println("i'm a child testPermission()");
    }
}

二、方法的重写详细规则

  • 参数列表与被重写方法的参数列表必须完全相同。

  • 返回类型与被重写方法的返回类型可以不相同,但是必须是父类返回值的派生类(java5 及更早版本返回类型要一样,java7 及更高版本可以不同)。

    class Person {
        String name = "No name";
        public Person(String nm) {
            name = nm;
        }
        public Object testReturnType() {
            return 2;
        }
    }
    class Employee extends Person {
        String empID = "0000";
    
        public Employee(String id) {
            super(id);
            empID = id;
        }
        @Override
        public String testReturnType() {
            return "josua317";
        }
    }
    
  • 访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为 public,那么在子类中重写该方法就不能声明为 protected。

  • 父类的成员方法只能被它的子类重写。

  • 声明为 final 的方法不能被重写。

    package com.joshua317;
    
    public class Main {
        private static final String MESSAGE="taobao";
        public static void main(String [] args) {
            new Employee("joshua317", "0002");
        }
    }
    
    class Person {
        String name = "No name";
        public Person(String nm) {
            name = nm;
        }
        final public void testFinal() {
            System.out.println("i'm a paraent testFinal()");
        }
    }
    class Employee extends Person {
        String empID = "0000";
    
        public Employee(String name, String id) {
            super(name);
            empID = id;
        }
        @Override
        public void testFinal() {
            System.out.println("i'm a child testFinal()");
        }
    }
    

 

 

 

  • 声明为 static 的方法不能被重写,但是能够被再次声明。
  • 子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为 private 和 final 的方法。
  • 子类和父类不在同一个包中,那么子类只能够重写父类的声明为 public 和 protected 的非 final 方法。
  • 重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。
  • 构造方法不能被重写。
  • 如果不能继承一个类,则不能重写该类的方法。

 

posted @ 2022-02-15 22:13  joshua317  阅读(88)  评论(0编辑  收藏  举报