Java 中构造器重载,方法重载和方法重写区别

本文介绍了Java中构造器重载、方法重载和方法重写的概念及区别。构造器重载要求名字相同但参数列表不同,方法重载则是同一类中方法名相同但参数列表不同的多个方法,而方法重写发生在子类中,名字、参数列表和返回类型必须与父类方法一致。同时,文中提供了实例来展示重载和重写的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开发工具与关键技术:Java
作者:吴永旗
撰写时间:2019年4月25日

  1. 什么构造器重载?
    构造器重载名字相同,而形参列表一定不同或者形参列表次序不同,构造器名和类名相同,并且没有返回值
    例子如下:
    public class Dog {
    public Dog(){//类名 Dog作为构造器名
    System.out.println(“无参构造方法”);
    }
    public Dog(String name,int age){//类名 Dog作为构造器名,带有参数
    System.out.println(“参构造方法1”);
    }
    public Dog(int age,String name){//类名 Dog作为构造器名,带有参数,次序不同
    System.out.println(“参构造方法2”);
    }
    }

  2. 认识什么是方法重载和方法重写
    方法重载:一个类中定义了多个方法名相同,而他们的参数的数量不同或数量相同 而类型和次序不同,则称为方法的重载(Overloading)。
    方法重写:在子类存在方法与父类的方法的名字相同,而且参数的个数与类型一 样,返回值也一样的方法,就称为方法重写(Overriding)。

  3. 方法重载的规则有哪些?

  4. 必须形参列表不一样(参数个数或类型不一样);

  5. 可以改变返回类型

  6. 可以改变访问修饰符

  7. 可以声明新的或更广的检查异常

  8. 法能够在同一个类中或者在一个子类中被重载。

  9. 返回值类型不能作为重载函数的区分标准。

  10. 方法重写的规则有哪些?

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

  12. 返回类型必须完全与被重写方法的返回类型相同

  13. 访问权限不能比父类中被重写的方法的访问权限更低,例如,父类方法被声明public修饰,则子类重谢该方法是不能声明为protected

  14. 父类的成员方法只能被它的子类重写

  15. 声明为final的方法不能被重写

  16. 声明为static的方法不能被重写,但是能够被再次声明

  17. 子类和父类在同一个包中,那么子类可以重写父类所有除了声明为private和final 的方法

  18. 子类和父类不在同一个包中,那么子类只能够重写父类的声明为public和 protected的非final方法

  19. 重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常

  20. 构造方法不能被重写

  21. 如果不能继承一个方法,则不能重写这个方法

  22. 重写与重载之间的区别
    区别点 重载方法 重写方法
    参数列表 必须修改 一定不能修改
    返回类型 可以修改 一定不能修改
    异常 可以修改 可以减少或删除,一定不能抛出新的或者更广的异常
    访问 可以修改 一定不能做更严格的限制(可以降低限制)

  23. 方法的重载示例如下:
    public class Dog{
    public void dog(){
    System.out.println(“这是重载的方法1”);
    }
    public String dog(){
    System.out.println(“这不是一个重载的方法”);
    }
    public void dog(String name){
    System.out.println(“这是一个重载的方法2”);
    }
    public void dog(String name){
    System.out.println(“这不是一个重载的方法”);
    }
    public void dog(String name,int age){
    System.out.println(“这是一个重载的方法3”);
    }
    public void dog(int age ,String name){
    System.out.println(“这是一个重载的方法4”);
    }

  24. 方法的重写示例如下:
    在这里插入图片描述在这里插入图片描述

<think>嗯,用户问的是方法重载构造器重载区别。首先,我得先回忆一下这两个概念的定义。方法重载应该是在同一个类里面有多个同名方法,参数不同;构造器重载应该也是类似的,不过构造器的名字必须类名相同,所以只能通过参数列表的不同来重载。 接下来,我需要比较它们的相同点不同点。相同点肯定是都用了重载的机制,都是根据参数类型或数量来决定调用哪个方法构造器。不同点的话,方法重载可以有不同的返回类型,但构造器重载的返回类型其实是固定的,都是类的实例,所以构造器的返回类型不能改。另外,构造器重载可能会在内部调用其他的构造器,比如用this(),而普通方法重载可能不会有这种情况。 然后,应用场景方面,构造器重载主要是为了不同的初始化方式,比如一个类可以有无参构造器,也可以有带不同参数的构造器。而方法重载则是为了提供处理不同类型数据的同名方法,比如System.out.println()可以处理各种类型的数据。 可能需要举例子说明。比如,构造器重载的例子,一个Person类可以有Person()Person(String name)这样的构造器方法重载的例子,比如一个计算类中的add方法,可以add(int, int)add(double, double)。 还要注意语法上的区别,比如构造器没有返回类型,而方法必须有返回类型(void也算)。另外,构造器在创建对象时自动调用,而方法需要显式调用。 有没有可能用户混淆了重载重写?虽然用户的问题明确是重载,但可能需要确认一下。不过用户的问题明确,所以不用涉及重写。 检查是否有遗漏的地方。比如,构造器重载必须通过this调用其他构造器时,必须是构造器中的第一条语句。而方法重载则没有这样的限制。这也是一个不同点。 总结的时候,应该分点列出区别,可能用表格或者条目式,让用户更清晰。需要确保用中文,并且例子中的代码符合格式要求,比如用反引号包裹,或者用代码块,但根据系统指令,可能要用LaTeX的格式?不过用户问题里没有涉及代码,可能不需要具体代码例子,或者用中文描述例子。 最后,确保回答结构清晰,分点说明相同点不同点,可能先讲各自定义,再比较区别,再举例说明应用场景。</think>方法重载构造器重载区别如下,按功能特性对比分析: **一、本质特性** 1. 方法重载:同一类中多个同名**普通方法**,通过参数列表(类型/数量/顺序)区分 2.构造器重载:同一类中多个同名**构造方法**(即构造函数),必须通过参数列表区分 **二、返回类型** 1. 方法重载:允许不同返回类型(但仅改变返回类型不算有效重载) ```java // 有效重载 public int add(int a, int b) { return a + b; } public double add(double a, double b) { return a + b; } // 无效重载(仅返回类型不同) public void process(String s) {} public String process(String s) {} // 编译错误 ``` 2.构造器重载:无返回类型声明(隐含返回当前类实例) **三、调用机制** 1.方法重载:通过对象显式调用 ```java Calculator calc = new Calculator(); calc.add(2, 3); calc.add(2.5, 3.7); ``` 2.构造器重载:通过`new`关键字隐式调用 ```java // Person.java public class Person { private String name; private int age; // 无参构造器 public Person() { this("Unknown", 18); // 调用两参构造器 } // 单参构造器 public Person(String name) { this(name, 18); } // 两参构造器 public Person(String name, int age) { this.name = name; this.age = age; } } // 使用示例 Person p1 = new Person(); Person p2 = new Person("张三"); Person p3 = new Person("李四", 25); ``` **四、设计目的** 1.方法重载:增强方法通用性,提供多种参数处理方式 ```java // 日期格式化示例 LocalDate date = LocalDate.now(); date.format(DateTimeFormatter.BASIC_ISO_DATE); // yyyyMMdd date.format(DateTimeFormatter.ISO_LOCAL_DATE); // yyyy-MM-dd ``` 2.构造器重载:提供灵活的对象初始化方式 ```java // ArrayList初始化示例 List<String> list1 = new ArrayList<>(); // 初始容量10 List<String> list2 = new ArrayList<>(100); // 指定初始容量 List<String> list3 = new ArrayList<>(list2); // 通过集合初始化 ``` **五、特殊语法** 构造器重载支持链式调用(必须作为构造器第一条语句): ```java public class Rectangle { private int width; private int height; public Rectangle() { this(10, 10); // 调用两参构造器 } public Rectangle(int size) { this(size, size); } public Rectangle(int width, int height) { this.width = width; this.height = height; } } ``` **总结对比表**: | 特性 | 方法重载 | 构造器重载 | |--------------------|----------------------------|---------------------------| | 命名规则 | 任意合法方法名 | 必须与类名相同 | | 返回类型 | 可不同(需参数不同) | 隐含当前类实例 | | 访问修饰符 | 可任意设置 | 通常为public | | this调用 | 普通方法调用 | 必须首行通过this()调用 | | 继承中的表现 | 子类可重载父类方法 | 子类构造器必须调用父类构造器 | 实际开发中的应用场景: - 方法重载常见于工具类(如`Math`类的多个`max()`方法) - 构造器重载普遍用于实体类(如`String`类的9个构造器重载) - Spring框架中的Bean初始化常利用构造器重载实现依赖注入的灵活性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值