面向对象编程
方法的其他说明
1 方法的重载
方法是通过调用而被使用的,换句话说,方法由代码转变为程序是通过被调用实现的。
因此,区别不同方法的关键在于,不同方法调用时体现出不同,这实际上也体现了算法
的确定性
。
调用方法的格式为:[对象.]方法名(参数)
:
- 在同一个类中,在该类的某个方法中调用该类中的方法,一般可以直接通过
方法名(参数)
实现。 - 在不同类中,调用某个类的方法,一般需要通过
对象.方法(参数)
实现。
因此,区别不同方法的关键在于:类
,方法名
和该方法所需的参数
。换句话说,满足以下任何一个条件即可区分不同的方法: - 所在
类
不同。 方法名
不同。方法所需
参数
不同,参数
不同存在三种情况参数
个数不同;参数
数据类型不同;参数
顺序不同。因为,在调用一个方法时,都是通过顺序传参的。
虽然构造方法时,还会要求设定权限修饰符
和返回值类型
,但调用方法
时并不会体现出这两点,因此权限修饰符
和返回值类型
的不同无法用来区分不同的方法。
方法重载
是指,对同一个类
中的已存在的方法,用相同的方法名
来构建不同的方法
,换句话说,构造一个与同一个类
中已存在的方法同名
的但参数
不同的方法。
练习:
2 可变个数形参JavaSE 5.0
中提供了Varargs(variable number of arguments)
机制,允许直接定义能和多个相同类型实参相匹配的形参。从而,可以用一种更简单的方式,来传递个数可变的实参。
在没有这个机制之前,通过数组来传入多个相同类型的参数,如下,其中strs
为数组参数名。public void test(String[] strs)
有这个机制后,可以通过可变个数形参来传入多个相同类型的参数,其格式如下,其中strs
为代表传入的可变个数的所有String
类型的参数的参数名。public void test(String ... strs)
实际上,可变个数形参等同于传入数组,只是省略了先创建数组的步骤,而可以直接将多个数据传入。
可变个数形参和数组参数的关系:String ... strs = String[] strs
使用可变个数形参的说明:
- 可变个数形参本质上就是数组形参,它们是等同的,操作可变个数形参就用操作数组形参方式;
- 在一个方法中只能有一个可变个数形参;
- 在一个方法中可变个数形参只能放在最后一个位置。
3 值传递机制
1) 基本数据类型变量 vs 引用数据类型变量
- 基本数据类型的变量,本质上就是一个被变量名标识的内存空间,该变量名标识的内存空间中的内容就是该基本类型数据。
- 引用数据类型的变量,本质上也是一个被变量名标识的内存空间,但该变量名标识的内存空间中的内容是该引用数据类型数据所在空间的地址值或
null
。
2) 基本数据类型变量与引用数据类型变量的赋值
- 对基本数据类型变量赋值,是直接将对应的值放入该变量名标识的内存空间中,此时被赋值的变量和赋值变量各自有一个值。
- 对引用数据类型变量赋值,是将对应的地址值放入该变量名标识的内存空间中,此时被赋值的变量和赋值变量指向同一个数据,相当于共享一个数据。
3) 值传递
值传递,是指对方法中的形参传递实参,对应两种情况:
- 若方法中的形参为基本数据类型,那么该方法对该基本数据类型的形参操作仅对该方法的形参有效,而与给形参传递值得基本数据类型的变量无关。
- 若方法中的形参为引用数据类型,那么该方法对该引用数据类型的形参操作,是对该方法的形参中的地址值对应的数据操作,相当于对给该形参传值的引用数据类型变量操作,但如果形参中地址值变化了,那后续操作就与之前指向的数据无关了。
通过内存解析,也能很好地解释。
虽然引用类型的形参与传值的引用类型实参共同指向同一个数据,但它们是各自有一个空间存储数据地址值,即实参和形参并不是完全等同,只是形参操作的数据是实参指向的数据,当形参指向的数据不再是最初传值的实参数据时,对形参的操作就不再与最初传值的实参数据相关。
4) 练习
4 递归方法
1) 递归方法
递归方法是值,在方法体中调用自身的方法,它包含了一种隐式的循环,它会重复执行某段代码,但这种重复执行无需循环控制。
递归方法,可以看作是对自身方法的循环,类比于循环控制结构。递归方法对自身方法的循环包含三个部分:
- 控制信息:
参数
作为控制信息,能够被包装为控制条件,以控制是否调用自身。 控制条件:将
参数
包装为控制条件,以控制是否调用自身。- 满足控制条件,则会执行调用自身操作。
- 不满足控制条件,则不会执行调用自身的操作。
- 迭代部分:方法体中调用自身时的
参数
是变动的,相当于变动控制信息。这种变动能够随着不断地自身调用变动到满足不再调用自身的时候,即结束调用自身的时候。
2) 练习