方法重写和重载

介绍方法重载,方法重写的概念及重载与重写时须注意的事项,最后就是对Object类的toString()方法的重写。

Author: Msuenb

Date: 2023-02-12

方法重载

方法重载(overload)是指在同一个类中,允许存在一个以上的同名方法,只要它们的参数列表不同即可,与修饰符和返回值类型无关

  • 参数列表:参数个数不同、数据类型不同、数据类型顺序不同(不推荐,有歧义)。
  • 重载方法调用:JVM 通过方法的参数列表,调用匹配的方法。
  1. 方法重载示例:

    public void test() {}	
    public void test(int i, int j) {}	// 个数不同
    public void test(int i, String s) {}	// 类型不同
    public void test(String s, int i) {}	// 是重载 但不推荐
    

    重载方法时使用可变参数

    public class Main {
    
        public static void main(String[] args) {
            test(1,2,3,4);  // 调用第一个
    
            // 可变参数的本质就是数组
            test(1, new int[] {2, 3, 4});   // 调用第二个
    
            //test(1, 2, 3);	// 第二个 第三个都匹配
            test(new int[]{1,2,3}); // 调用第三个
        }
    
        public static void test(int a, int b, int c, int d) {}
    
        public static void test(int a, int ...nums) {}
    
        public void test(int ...nums) {}	// 调用时可能会与上一个产生歧义 一般不这样写
    }
    

    注意:

    • 可变参数的本质就是数组。
    public static void test(int ...nums) {}
        
    //public static void test(int[] nums);	// 构不成重载
    
  2. 以下不是重载

    public void test(int i, String s) {}	
    
    public static void test(int i, String s) {}  // 重载与修饰符无关
    void test(int i, String s) {}	// 重载与修饰符无关
    
    int test(int i, String s) {}	// 重载与返回值无关
    

子类可以重载从父类中继承的方法。

方法重写

父类的所有方法子类都会继承,但是当某个方法被继承到子类之后,子类觉得父类原来的实现不适合于子类,就可以进行方法重写 (Override)

public class Main {
    public static void main(String[] args) {
        Student student = new Student();

        student.setName("张三");
        student.setAge(23);
        student.setScore(89);

        System.out.println(student.getInfo());
    }
}

class Person {
    private String name;
    private int age;

    public void setName(String name) {this.name = name;}
    public String getName() {return name;}
    public void setAge(int age) {this.age = age;}
    public int getAge() {return age;}

    public String getInfo(){
        return "姓名:" + name + ",年龄:" + age;
    }
}

class Student extends Person {
    private int score;

    public int getScore() {return score;}
    public void setScore(int score) {this.score = score;}

    //方法的重写
    public String getInfo(){
//        return "姓名:" + name + ",年龄:" + age;
        //在子类中不能直接使用父类私有的name和age
        return "姓名:" + getName() + ",年龄:" + getAge() + ",成绩:" + score;
        
        return super.getInfo();	// 调用父类被重写的方法
    }
}

可以使用super.被重写方法([实参列表])调用父类被重写的方法。

方法重写要求:

1.必须保证父子类之间重写方法的名称相同。

2.必须保证父子类之间重写方法的参数列表也完全相同

2.子类方法的返回值类型必须<=父类方法的返回值类型

注意:如果返回值类型是基本数据类型和void,那么必须是相同

3.子类方法的权限必须>=父类方法的权限修饰符。

注意:public > protected > 缺省 > private 父类私有方法不能重写 跨包的父类缺省的方法也不能重写

Object根父类

java.lang.Object是类层次结构的根类,即所有类的父类。每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。而且很多方法子类都会重写这些方法,通过子类对象调用方法后执行的是重写后的方法。

  • 重写toString()方法

    Object中实现的toString方法,默认返回"对象的类型 @ 对象hashCode值的十六进制形式"的信息表达式,而这个信息表达式对于绝大部分场景来说是没有用的,建议子类重写toString方法,结果应该时一个简明但易于读懂的信息表达式。

    class Person {
        private String name;
        private int age;
    
        public String getName() {return name;}
        public void setName(String name) {this.name = name;}
        public int getAge() {return age;}
        public void setAge(int age) {this.age = age;}
    
        @Override
        public String toString() {
            return "Person{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    '}';
        }
    }
    
    
posted @ 2023-02-12 18:49  msuenb  阅读(11)  评论(0编辑  收藏  举报