在Java程序中,如果同一个类(或者父类子类之间)中如果有两个相同的方法(方法名相同、返回值相同、参数列表相同)是不行的,因为这样编译器无法将方法调用和特定的方法联系起来。但是,在一个类中,如果有多个方法具有相同的名称,而有不同的参数,这种情况是允许的,我们就称这种行为为方法的重载(overload)。
我们经常使用println来向控制台输出各种类型的数据,这些println方法就是实现了方法的重载。
在进行方法的重载时,方法的参数列表必须不同(参数个数或者参数数据类型,或者两者皆不同)。而方法的返回值可以相同,也可以不同。
我们来看一个例子。还是以上面的“Person”类,我们需要取得“Person”对象的“name(姓名)”属性,可能会有两种情况:一种是直接得到对象的“name”属性,还有一种情况是在获取的对象属性“name”的方法上输入一个参数,将这个参数当作头衔和“name”结合起来,比如:输入的头衔是“先生”,则通过方法返回的是:“XXX先生”。
我们可以为这两个需求定义两个方法,但是,为了显示这两个方法的相似点,我们更倾向于使用方法重载来完成:
public class Person{
… …
public String getName() {
return name;
}
public String getName(String title) {
return name+title;
}
… …
}
这样,如果只需要得到“Person”对象的“name”属性,调用不带参数的getName()方法就可以了;如果需要得到“Person”对象的“name”属性并且需要指明它的头衔,则可以调用带一个参数的getName()方法。
在进行方法的重载时,有四条基本原则需要遵守:
方法名相同;
参数列表必须不同;
返回值可以不同;
可以相互调用。
注意:方法的返回值不是方法的签名(signature)的一部分,所以,进行方法的重载的时候,不能将返回值类型的不同当成两个方法的区别。也就是说,在同一个类中,不能有这样的两个方法,它们的方法名相同、参数相同,只是方法的返回值类型不同。
构造器重载
在前面我们说过,构造器在某种程度上可以看成是一个特殊的方法:它没有返回值,它的方法名称必需和类的名称一致。因此,构造器也常常被称为“构造方法”。
作为Java类的组成成分之一,构造器也可以进行重载,下例中的类Person就定义了4个重载的构造器以满足不同的需要。
public class Person {
private String name;
private int age;
private String sex;
public Person() {
System.out.println("构造器Person()被调用");
name = "";
}
public Person(String theName) {
System.out.println("构造器Person(String theName)被调用");
name = theName;
}
public Person(String theName, int theAge) {
System.out.println("构造器Person(String theName,int theAge)被调用");
name = theName;
age = theAge;
}
public Person(String theName, int theAge, String theSex) {
System.out.println("构造器Person(String theName,"
+ "int theAge,String theSex)被调用");
name = theName;
age = theAge;
sex = theSex;
}
// 其他代码
// …. …
}
在这个类中,定义了四个构造器,这四个构造器中,各自的参数个数都不一样。在创建对象的时候,编译器会根据参数类型和参数个数来确定到底调用哪一个构造器。
我们来看下面这个创建“Person”对象的例子:
public class NewPerson {
public static void main(String[] args) {
Person person = new Person("Tom", 18, "male");
}
}
编译并运行上面这个程序,它将会向控制台打印出如下信息:
构造器Person(String theName,int theAge,String theSex)被调用
这说明,它的带三个参数的构造器被调用来创建Person对象了。
分享到:
相关推荐
1.6.6.5 方法重载 ...................................................................................................................................... 19 1.6.7 其他函数成员 .............................
3.4 签名和重载..........................62 3.5 范围......................................63 3.5.1 名称隐藏.......................65 3.6 名称空间或类型名称..........67 3.6.1 合格的名称....................
目录 第一章 Perl概述............................................................................................................................10 1.1 从头开始............................................
5.4 运算符重载...... 132 5.4.1 运算符的工作方式..... 133 5.4.2 运算符重载的示例: Vector结构..... 134 5.5 用户定义的数据类型转换...... 141 5.5.1 执行用户定义的类型转换..... 142 5.5.2 多重数据类型转换....
目录 MVC系列——MVC源码学习:打造自己的MVC框架(一:核心原理) ............................................................................... 3 一、MVC原理解析 ..........................................
第1章 绪论............................................................................................................13 1.1 Programmable Graphics Processing Unit发展历程................................
3.6.3 方法三. . . . . . . . . . . . . . . . . . . . . . . . . . . 55 目录5 第4章子程序57 4.1 间接寻址. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 4.2 子程序的简单例子. . . . . . . . . ...
64. 方法重载(Overloading)是指一个类中可以有多个方法具有相同的名字但参数列表不同。 65. Java允许方法名重载。 66. 构造函数是一个特殊方法,其名称与类名相同,不返回任何数据类型。 67. Java中的方法分为实例...
本文针对这一实际设计案例,提出了对于重载卡车下的桥梁结构设计与计算的方法和思路。 首先,对于设计桥梁时所遵循的车辆荷载标准,通常是指在公路桥梁设计时所采用的荷载,其中规定了车辆的质量为55吨。桥梁工程师...
6.9. 方法的重载 6-15 7. 六•高级语言特性 7-15 7.1. 封装 (encapsulation) 7-15 7.2. 继承 (inherit) 7-16 7.2.1. JAVA继承特点 7-16 7.2.2. 父类(SuperClass)和 子类(SubClass)的关系 7-17 7.2.3. 系统构造一...
3. **热重载**:React Native提供了一个强大的开发工具,支持实时热重载。这使得开发者可以在不重启应用的情况下看到代码更改的效果,极大地提高了开发效率。 4. **原生API集成**:虽然React Native使用JavaScript...
解释:多态可以通过方法重写和方法重载实现。 问题11:下列语句中访问类的方法正确的是:( ) A)book.name B)book.name( ) C)book->name D)book_name 解释:访问类的方法正确的语句是book.name( )。 问题12...
2.4 C++新增的标准输入输出方法(cin和cout) 22 2.5 C++规定的变量定义位置 24 2.6 C++新增的布尔类型(bool) 24 2.7 C++ 新增的new和delete运算符 25 2.8 C++函数的默认参数(缺省参数) 26 2.9 C++函数重载详解 28 ...
**重载与重写**:重载发生在同一个类中,方法名相同但参数列表不同;重写发生在子类中,方法名、返回类型和参数列表都相同。 23. **构造器不可被重写**:构造器不能被子类覆盖,但可以被重载。 24-25. **抽象类与...
50. **Overloaded method**:重载方法,同一类中具有相同名字但参数列表不同的方法。 51. **Overridden method**:重写方法,子类重新定义父类的方法。 52. **Package**:组织Java类的命名空间,有助于管理类和避免...