跟着姜少学Java基础编程之十三:面向对象-成员方法
2017-12-05 09:14
851 查看
本篇主要介绍Java语言中的面向对象中的成员方法及方法的重载。
方法重载是类的多态的一种体现,属于编译时的多态。
1)参数个数不同
上述代码中,定义的三个方法(省略了方法的其他要素)的参数列表各不相同,因为其参数的个数是不同的,因此参数列表肯定不相同。
2)参数个数相同时,至少有一个对应位置的参数类型不同
上述代码中,两个方法的参数列表的参数个数相同,但第二个参数的类型是不同的,因此上述两个方法的参数列表也是不相同的。
注意:仅形参的参数名不同,参数列表是相同的。
上述代码中,两个方法的参数列表虽然参数名是不同的,但参数个数和对于位置上的参数类型是相同的,因此上面两个方法的签名是相同的。
但允许存在成员方法的重载。
上述代码中的三个成员方法add都属于重载,因为这三个方法的方法名相同,但参数列表是不同的。方法的重载跟方法的返回值类型是否相同没有关系。
1、如果调用时传入的实参类型与重载中的某个方法的形参类型完全相同,则调用该方法。
2、如果调用时传入的实参类型与重载的方法都不相同,则进行隐式的类型转换,就近转为哪个方法的参数类型则调用哪个方法。
上述代码中重载方法的调用,add(20)和add(2,3)分别有参数类型完全相同的方法,直接调用对应的方法即可。
add(20,num1)由于num1是short类型,short到int和double类型都是可以自动发生隐式转换,但是,short类型与int类型更近,因此调用的是add(int,int)。
add(10,20L)由于20L是属于long类型,可以隐式的转为double类型,不能自动转为int类型,因此调用的是add(int,double)
add(10L,20)由于10L是long类型,不能隐式转为int类型,因此编译出错。
方法调用时,参数的传递,不管是基本数据类型还是引用类型,都是基于值的传递。
上述代码Swap类中的swap方法,将传入的两个参数进行了交换,但实际上并没有生效,因为不管是传入的基本数据类型还是引用类型,都是基于值传入的。(引用类型传入的是引用值即地址)
下一篇将介绍Java中的package和import关键字。
13 成员方法
成员方法,即类内部定义的方法,成员方法是类的动态行为。13.1 方法的签名
一个方法的签名是由方法名和参数列表两部分构成。13.2 方法重载
方法重载(OverLoad)是指方法名相同(包括大小写),但方法签名不相同的方法。通俗的说,重载就是多个方法的方法名相同,但参数列表不同(比如上一章讲到的构造方法的重载)。方法重载是类的多态的一种体现,属于编译时的多态。
13.2.1 何为参数列表不同
由于方法定义时的参数列表中的参数,属于形参。因此涉及到参数列表不同,主要是以下几种情况:1)参数个数不同
func() func(int a) func(int a, int b)
上述代码中,定义的三个方法(省略了方法的其他要素)的参数列表各不相同,因为其参数的个数是不同的,因此参数列表肯定不相同。
2)参数个数相同时,至少有一个对应位置的参数类型不同
func(int a,int b) func(int a,double b)
上述代码中,两个方法的参数列表的参数个数相同,但第二个参数的类型是不同的,因此上述两个方法的参数列表也是不相同的。
注意:仅形参的参数名不同,参数列表是相同的。
func(int a, int b) func(int num1,int num2)
上述代码中,两个方法的参数列表虽然参数名是不同的,但参数个数和对于位置上的参数类型是相同的,因此上面两个方法的签名是相同的。
13.2.2 方法重载
在同一个类内部,不允许存在相同方法签名的成员方法。但允许存在成员方法的重载。
public class Demo{ public int add(int num){ return num; } public int add(int a, int b){ return a+b; } public double add(int a, double b){ return a+b; } }
上述代码中的三个成员方法add都属于重载,因为这三个方法的方法名相同,但参数列表是不同的。方法的重载跟方法的返回值类型是否相同没有关系。
13.3 重载方法的调用
重载方法的调用,遵循就近规则:1、如果调用时传入的实参类型与重载中的某个方法的形参类型完全相同,则调用该方法。
2、如果调用时传入的实参类型与重载的方法都不相同,则进行隐式的类型转换,就近转为哪个方法的参数类型则调用哪个方法。
public class Demo{ public int add(int num){ return num; } public int add(int a, int b){ return a+b; } public double add(int a, double b){ return a+b; } }
public static void main(String[] args) { Demo demo = new Demo(); int res = demo.add(20);//调用add(int) double result = demo.add(2,3);//调用add(int,int) short num1 = 10; result = demo.add(20,num1);//调用add(int,int) result = demo.add(10,20L);//调用add(int,double) result = demo.add(10L,20);//编译出错 }
上述代码中重载方法的调用,add(20)和add(2,3)分别有参数类型完全相同的方法,直接调用对应的方法即可。
add(20,num1)由于num1是short类型,short到int和double类型都是可以自动发生隐式转换,但是,short类型与int类型更近,因此调用的是add(int,int)。
add(10,20L)由于20L是属于long类型,可以隐式的转为double类型,不能自动转为int类型,因此调用的是add(int,double)
add(10L,20)由于10L是long类型,不能隐式转为int类型,因此编译出错。
13.4 方法参数的传递规则
Java中的数据类型大体可以分为两种:基本数据类型和引用类型。方法调用时,参数的传递,不管是基本数据类型还是引用类型,都是基于值的传递。
public class Swap { public void swap(int a, int b){ int tmp = a; a = b; b = tmp; } public void swap(int[] a,int[] b){ int[] tmp = a; a = b; b = tmp; } }
public static void main(String[] args) { int a = 10; int b = 20; int[] arr1 = {1,2,3}; int[] arr2 = {4,5,6}; Swap s = new Swap(); s.swap(a, b);//输出a=10;b=20 System.out.println("a="+a+";b="+b); s.swap(arr1, arr2); System.out.println("arr1=" +Arrays.toString(arr1));//arr1=[1, 2, 3] System.out.println("arr2=" +Arrays.toString(arr2));//arr2=[4, 5, 6] }
上述代码Swap类中的swap方法,将传入的两个参数进行了交换,但实际上并没有生效,因为不管是传入的基本数据类型还是引用类型,都是基于值传入的。(引用类型传入的是引用值即地址)
下一篇将介绍Java中的package和import关键字。
相关文章推荐
- 跟着姜少学Java基础编程之十二:面向对象-构造方法
- 跟着姜少学Java基础编程之十一:面向对象-类与对象
- JAVA基础初探(三)面向对象思想、类与对象、成员变量与局部变量、构造方法、static关键字详解
- java 面向对象基础 类 成员变量和局部变量 成员方法
- JAVA基础再回首(四)——面向对象思想、类与对象、成员/局部变量、匿名对象、封装、private、this、构造方法
- 跟着姜少学Java基础编程之十:方法
- JAVA面向对象基础:成员变量、方法、方法的重载、构造函数
- JAVA基础day05 面向对象思想 成员变量和方法 封装 构造方法和this的使用
- Java面向对象基础--构造方法
- java面向对象基础 -- 重写父类方法的规则
- Java面向对象基础---名词概念的理解:方法的重载、构造函数、封装性
- 理解Java面向对象的程序设计思想-Java基础-Java-编程开发
- java 面向对象基础 UML图 构造方法 对象 参数传值 关联关系 依赖关系
- 黑马程序员_java编程基础09面向对象
- JAVA之旅(四)——面向对象思想,成员/局部变量,匿名对象,封装 , private,构造方法,构造代码块
- [2013-11-28]JAVA笔记_面向对象基础、方法重载
- Java基础教程之对象的方法与数据成员
- Java基础05:面向对象;类与对象;匿名对象;成员变量;局部变量;封装;构造函数
- Java面向对象基础--String类中常用的方法
- 黑马程序员---java基础---面向对象中的构造方法及static关键字,变量的问题