static void f3(short x) { prt("f3(short)"); }
static void f3(int x) { prt("f3(int)"); }
static void f3(long x) { prt("f3(long)"); }
static void f3(float x) { prt("f3(float)"); }
static void f3(double x) { prt("f3(double)");}
static void prt(String s) {
System.out.println(s);
}
方法的重载(有的翻译成过载)就是方法名相同,方法的参数序列不相同(这里不是指继承关系中的重写):
1)仅仅是返回类型不同,不能重载;这在一般编程语言中都是这样规定的,原因非常简单,根据返回类型确定要调用那个方法,
需要根据返回值的接受者类型来确定,这在很多时候都是非常困难的(例如接受类型是Object,或者不需要接收返回值的情况)。
2)参数序列的不同主要是指参数类型序列的不同,而不是参数名字的不同;
3)在确定参数类型不同时,不会考虑继承关系,虽然ClassA是ClassB的父类,下面:
public String DoSomething(ClassA A)和public String DoSomething(ClassB B)是符合重载的.
对于重载需要注意以下:
1)对于主类型(基本类型)重载,如果调用时实参是变量或者指定了类型的常数(2.0d),或者常数的类型唯一确定(字符,字符串,布尔),
则根据变量类型来选择要调用的方法,但对于实参是常数,不易确定的数字类型,在没有明确类型标记的情况下,一般整数会转换成int型,
一般小数会被转换成double,测试如下:
//调用测试:
char a='A';
f3(a);
f3(1);
//f3(10000000000);出错
f3(10000000000l);
f3(2.0);
f3(2.0f);
f3(2.0d);
测试结果:
f3(int)
f3(int)
f3(long)
f3(double)
f3(float)
f3(double)
2)对于有继承关系的类型形成的重载,调用的时候也是根据变量类型来确定调用方法的,只不过,如果当前变量类型没有,则寻着父类型方向
向上寻找,直到找到为止(肯定会找到,如果找不到编译的时候就会报错):
下面的MyClassA->D依次为父子关系,下面是重载方法:
public class OverloadClass {
public void DoSomething(MyClassA a)
{
System.out.println("MyClassA a:"+a.getClass().getName());
}
public void DoSomething(MyClassB b)
{
System.out.println("MyClassB b:"+b.getClass().getName());
}
public void DoSomething2(MyClassA a)
{
System.out.println("MyClassA a:"+a.getClass().getName());
}
public void DoSomething2(MyClassC c)
{
System.out.println("MyClassC c:"+c.getClass().getName());
}
public void DoSomething3(MyClassC c)
{
System.out.println("MyClassC c:"+c.getClass().getName());
}
}
重载测试代码:
OverloadClass theOC = new OverloadClass();
MyClassA theA = new MyClassA();
MyClassB theB = new MyClassB();
MyClassA theC = new MyClassC();
MyClassB theD = new MyClassC();
MyClassC theE = new MyClassD();
MyClassD theF = new MyClassD();
//theOC.DoSomething(theA);
//theOC.DoSomething(theB);
//theOC.DoSomething(theC);
theOC.DoSomething2(theA);
theOC.DoSomething2(theB);
theOC.DoSomething2(theC);
theOC.DoSomething2(theD);
theOC.DoSomething2(theE);
theOC.DoSomething2(theF);
//theOC.DoSomething3(theA);//编译错误.
这种重载判断规则,同样也适用于C#.之所以重载是根据变量类型而不是实际类型来判断,其实原因非常简单,因为重载是在编译期就
会确定的,这个时候变量类型也是确定的,因此比较好判断,而实际类型往往是在运行期间才知道,编译期的重载当然不可能根据运行期
的事情来确定(这也是强类型语言的一个优势和劣势)。
PS:构造函数也可以重载。注意如果在构造函数中调用另外一个构造函数一定要放在构造函数的第1行,且只能调用一次。这个规定在C#中
也是一样,只是书写语法不一样。
分享到:
相关推荐
Java编程语言的学习涉及众多核心概念,本篇笔记主要探讨了几个关键知识点:继承、重载和覆盖。首先,我们从Java环境配置开始,确保能够正确地运行Java程序。在Windows系统中,需要设置环境变量PATH,指向JDK安装目录...
本知识点的标题为“Java学习笔记(必看经典)”,意味着所整理的内容是针对Java初学者的一系列核心概念和原理的总结。 首先,面向对象编程是Java语言的核心,它与传统的面向过程编程有显著的不同。面向对象编程强调的...
Java 学习笔记 本资源摘要信息涵盖了 Java 编程语言的基础知识,着重于面向对象编程(OOP)的概念和实现。下面是该资源的详细知识点: 1. 面向对象编程(OOP)的基本概念: * 对象: everything is an object...
### 瑜琅Java学习笔记概览 瑜琅的Java学习笔记涵盖了Java的基础概念与核心特性,从起源到高级特性均有涉及。以下是对该学习笔记各部分的深入解析: #### 1. Java起源 ##### 1.1 发展背景 - Java的诞生源于Sun ...
### Java学习笔记经典知识点解析 #### 一、面向对象编程基础 **面向对象**是一种重要的编程范式,它改变了传统的面向过程的编程思路,强调通过对象来组织代码,提高代码的复用性和维护性。 **面向对象的核心概念*...
Java中的方法重载(Overloading)是指在同一个类中可以有多个同名方法,但这些方法的参数列表必须不同(参数数量、类型或顺序)。而方法覆盖(Overriding)发生在子类中,子类可以重新定义父类中已有的非私有方法,...
Java学习笔记是由知名IT教育专家林信良编著的一本深受好评的编程教材,特别适合初学者入门。这本书深入浅出地介绍了Java编程语言的基础知识和核心概念,旨在帮助读者快速掌握这一强大的开发工具。 首先,书中从Java...
### Java学习笔记知识点总结 #### 第一章:Java语言入门 - **1.1 Java的诞生** Java由Sun Microsystems公司于1995年推出的一种可移植、面向对象的编程语言。最初的设计目标是为消费电子产品提供一种通用编程语言...
### Java学习笔记+程序员生涯 #### 一、面向对象编程基础 **面向对象与面向过程对比** 面向对象编程(Object-Oriented Programming, OOP)是现代软件开发中的一种核心编程范式,它强调以对象作为基本单位进行设计...
JAVA学习笔记涵盖了Java编程语言中多个核心概念和特性。通过讲解this关键字、继承、static关键字和代码块、final关键字、多态、方法重写、抽象类与接口、封装与隐藏、垃圾回收、类组合、包装类、对象处理、类成员、...
Java学习笔记涵盖了许多核心概念,包括面向对象编程的各个方面。以下是对这些知识点的详细解析: 1. **继承中方法的重写**: 当子类重写父类的方法时,子类方法的访问权限必须至少等于或大于父类中对应方法的访问...
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. 系统构造一...
### Java学习笔记:深入理解继承、多态与抽象 #### 一、面向对象的三大特性:封装、继承、多态 面向对象编程的核心在于其三大特性:封装、继承和多态。这三种特性使得面向对象编程更加灵活和高效。 1. **封装**:...