Java的重载与重写的区别

简介: Java的重载与重写的区别

在Java编程中,重载(Overloading)和重写(Overriding)是两个非常重要的概念,它们都与方法的定义和使用有关。然而,尽管它们听起来相似,但在实际应用中却有着截然不同的含义和用途。本文将深入探讨Java中的重载和重写的区别,以帮助读者更好地理解这两个概念。


1. 重载(Overloading)

1.1 定义

重载是指在同一个类中,可以有多个名称相同但参数列表不同的方法。编译器根据传递的参数类型、参数个数以及参数的顺序来区分这些同名方法。


1.2 特点

方法名相同:重载的方法必须具有相同的名称。

参数列表不同:重载的方法必须有不同的参数列表,这包括参数的类型、个数和顺序。

返回类型可以相同也可以不同:虽然返回类型不是重载的决定因素,但重载的方法可以有不同的返回类型。

发生在同一个类中:重载的方法必须定义在同一个类中。


1.3 示例

java复制代码

public class OverloadExample {  
  void print(int i) {  
  System.out.println("Printing int: " + i);  
  }  
 
  void print(double d) {  
  System.out.println("Printing double: " + d);  
  }  
 
  void print(String s) {  
  System.out.println("Printing String: " + s);  
  }  
 
  public static void main(String[] args) {  
  OverloadExample example = new OverloadExample();  
  example.print(10); // 调用print(int)  
  example.print(10.5); // 调用print(double)  
  example.print("Hello"); // 调用print(String)  
  }  
  }


2. 重写(Overriding)

2.1 定义

重写是子类对父类中已有方法进行重新定义的过程。子类可以通过重写父类中的方法来提供自己的实现。


2.2 特点

方法名、参数列表相同:重写的方法必须与父类中被重写的方法具有相同的名称和参数列表。

返回类型相同或子类型:重写的方法的返回类型必须与父类中被重写的方法的返回类型相同或是其子类型。

访问权限不能更低:重写的方法的访问权限不能低于父类中被重写的方法的访问权限。

发生在子类中:重写的方法必须定义在子类中。


2.3 示例

java复制代码

class Animal {  
  void makeSound() {  
  System.out.println("The animal makes a sound");  
  }  
  }  
 
  class Dog extends Animal {  
  // 重写父类的makeSound方法  
  @Override // 可选,但建议使用以明确表示该方法是一个重写方法  
  void makeSound() {  
  System.out.println("The dog barks");  
  }  
  }  
 
  public class OverrideExample {  
  public static void main(String[] args) {  
  Animal animal = new Animal();  
  animal.makeSound(); // 输出: The animal makes a sound  
 
  Dog dog = new Dog();  
  dog.makeSound(); // 输出: The dog barks  
 
  // 多态示例:使用父类引用指向子类对象  
  Animal myPet = new Dog();  
  myPet.makeSound(); // 输出: The dog barks,因为实际调用的是Dog类的makeSound方法  
  }  
  }

2.4 重写与多态

重写通常与多态(Polymorphism)一起使用。多态是面向对象编程的三大特性之一,它允许使用父类类型的引用指向子类对象,并调用子类重写后的方法。在上面的示例中,我们创建了一个Dog对象,但使用Animal类型的引用来引用它,并调用了makeSound方法。由于Dog类重写了Animal类的makeSound方法,因此实际上调用的是Dog类的makeSound方法,这就是多态的体现。


3. 重载与重写的区别

发生位置:重载发生在同一个类中,而重写发生在子类中。

方法名与参数:重载要求方法名相同但参数列表不同,而重写要求方法名和参数列表都相同。

返回类型:重载对返回类型没有特殊要求,而重写要求返回类型相同或子类型。

访问权限:重写要求子类方法的访问权限不能低于父类方法,而重载对此没有要求。

多态性:重写与多态紧密相关,而重载与

相关文章
|
17天前
|
Java
Java代码解释++i和i++的五个主要区别
本文介绍了前缀递增(++i)和后缀递增(i++)的区别。两者在独立语句中无差异,但在赋值表达式中,i++ 返回原值,++i 返回新值;在复杂表达式中计算顺序不同;在循环中虽结果相同但使用方式有别。最后通过 `Counter` 类模拟了两者的内部实现原理。
Java代码解释++i和i++的五个主要区别
|
26天前
|
Java
通过Java代码解释成员变量(实例变量)和局部变量的区别
本文通过一个Java示例,详细解释了成员变量(实例变量)和局部变量的区别。成员变量属于类的一部分,每个对象有独立的副本;局部变量则在方法或代码块内部声明,作用范围仅限于此。示例代码展示了如何在类中声明和使用这两种变量。
|
1月前
|
Java 编译器
在Java中,关于final、static关键字与方法的重写和继承【易错点】
在Java中,关于final、static关键字与方法的重写和继承【易错点】
22 5
|
1月前
|
Java
Java基础之 JDK8 HashMap 源码分析(中间写出与JDK7的区别)
这篇文章详细分析了Java中HashMap的源码,包括JDK8与JDK7的区别、构造函数、put和get方法的实现,以及位运算法的应用,并讨论了JDK8中的优化,如链表转红黑树的阈值和扩容机制。
25 1
|
1月前
|
Java 编译器 C语言
【一步一步了解Java系列】:探索Java基本类型与C语言的区别
【一步一步了解Java系列】:探索Java基本类型与C语言的区别
42 2
|
1月前
|
存储 缓存 Java
【用Java学习数据结构系列】HashMap与TreeMap的区别,以及Map与Set的关系
【用Java学习数据结构系列】HashMap与TreeMap的区别,以及Map与Set的关系
36 1
|
1月前
|
自然语言处理 Java 数据处理
Java IO流全解析:字节流和字符流的区别与联系!
Java IO流全解析:字节流和字符流的区别与联系!
77 1
|
1月前
|
缓存 安全 Java
Java中 final、finally、finalize 有什么区别?
本文详细阐述了Java中`final`、`finally`和`finalize`的区别:`final`用于修饰类、方法和变量以表示不可变性;`finally`是用于确保在`try-catch`结构中无论是否发生异常都能执行的代码块;而`finalize`是`Object`类的方法,用于在对象被垃圾回收前执行清理工作,但在JDK 9中已被标记为弃用。
31 0
Java中 final、finally、finalize 有什么区别?
|
29天前
|
Java
Java代码解释静态代理和动态代理的区别
### 静态代理与动态代理简介 **静态代理**:代理类在编译时已确定,目标对象和代理对象都实现同一接口。代理类包含对目标对象的引用,并在调用方法时添加额外操作。 **动态代理**:利用Java反射机制在运行时生成代理类,更加灵活。通过`Proxy`类和`InvocationHandler`接口实现,无需提前知道接口的具体实现细节。 示例代码展示了两种代理方式的实现,静态代理需要手动创建代理对象,而动态代理通过反射机制自动创建。
|
1月前
|
缓存 算法 Java
Java 中线程和纤程Fiber的区别是什么?
【10月更文挑战第14天】
68 0