面向对象--方法

来源:互联网 发布:linux vps 教程 编辑:程序博客网 时间:2024/05/22 08:34


方法是类或对象的行为特征的抽象,方法是类或对象最重要的组成部分。

从功能上看,方法完全类似于传统结构化程序设计里的函数,值得指出的是,Java里的方法不能独立存在,所有的方法都必须定义来类里

方法在逻辑上要么属于类,要么属于对象。


方法的所属性

方法确实是由传统的函数发展而来的,方法和传统的函数有着显著不同:

1),在结构化编程语言里,函数是一等公民,整个软件由一个个的函数组成

2),在面向对象编程语言里,类才是一等公民,整个系统由一个个的类组成

Java中的方法不能独立存在,它必须属于一个类或一个对象,因此方法不能像函数那样被独立执行。

执行方法时必须使用类或对象来作为调用者,即所有方法都必须使用“类.方法”或“对象.方法”的形式来调用。


Java语言里方法的所属性主要体现在如下几个方面:

1),方法不能独立定义,方法只能在类里面定义

2),从逻辑意义上来看,方法要么属于该类本身,要么属于该类的一个对象

3),永远不要独立执行方法,执行方法必须使用类或对象作为调用者


方法的分类

1),使用static修饰的方法属于这个类本身,使用static修饰的方法既可以使用类作为调用者来调用,也可以使用对象作为调用者来调用

使用static修饰的方法是属于这个类的,因此使用该类的任何对象来调用这个方法时将会得到相同的执行结果,这是由于底层依然是使用这些实例所属的类作为调用者。

2),没有使用static修饰的方法则属于该类的对象,不属于这个类本身。

没有static修饰的方法只能使用对象作为调用者来调用,不能使用类作为调用者来调用。使用不同对象作为调用者来调用同一个普通方法,可能得到不同的结果。


方法的参数传递机制

这里先来科普2个概念:形参和实参。 

1),形参:方法中的局部变量,在函数被调用时创建,并以传入的实参作为起始值,函数调用结束时被释放。

形参不会影响主程序中其他的变量,因为他们是不同作用域的变量,互不干扰。

2),实参:调用函数时,实际传递给方法的数据。

Java里方法的参数传递方式只有一种:值传递

所谓的值传递,就是将实际参数值的副本,也就是一份复制品传入方法内,而参数本身不会受到任何影响。

下面代码演示形参是基本类型的值传递:

/** * java方法的值传递测试 *  * @author LinkinPark * */public class Linkin{public static void swap(int a, int b){int temp = a;a = b;b = temp;System.out.println("方法中:a=" + a + ";b=" + b);}public static void main(String[] args){int a = 1;int b = 2;swap(a, b);System.out.println("方法外:a=" + a + ";b=" + b);// 方法中:a=2;b=1// 方法外:a=1;b=2}}
不管是基本类型的参数传递,还是引用类型的参数传递,统统采用的是值传递方式。引用类型的参数传递,实际上传递的是一个引用

当系统开始执行方法时,系统为形参执行初始化,就是把实参变量的值赋值给方法的形参变量,方法里面操作的并不是实际的实参变量。

下面代码演示形参是引用类型的值传递:

/** * java方法的值传递测试 *  * @author LinkinPark * */public class Linkin{public int a;public int b;public static void swap(Linkin linkin){int temp = linkin.a;linkin.a = linkin.b;linkin.b = temp;System.out.println("方法中:a=" + linkin.a + ";b=" + linkin.b);// 下行代码验证值传递vs引用传递// 要是值传递的话,原来的引用还可以操作对象// 要是引用传递的话,原来的引用就不能操作对象了linkin = null;}public static void main(String[] args){Linkin linkin = new Linkin();linkin.a = 1;linkin.b = 2;swap(linkin);// linkin变量仍然可以操作对象,得出结论Java方法参数传递只有一种:值传递// 2个引用同时操作对象,实际在堆内存中的对象属性发生了改变System.out.println("方法外:a=" + linkin.a + ";b=" + linkin.b);// 方法中:a=2;b=1// 方法外:a=2;b=1}}


形参个数可变的方法

从JDK1.5之后,Java允许定义形参个数可变的参数,从而允许为方法指定数量不确定的形参。

如果在定义方法时,在最后一个形参的类型后增加三点,则表明该形参可以接受多个参数值,多个参数值被当成数组传入。

/** * 可变参数的方法 *  * @author LinkinPark * */public class Linkin{// 以可变参数来定义方法public static void test1(int a, String... books){}// 以数组形参来定义方法public static void test2(int a, String[] books){}}

参数个数可变的参数本质就是一个数组参数。关于上面这2者的区别是:

1),可变形参这种比较简洁,如果采用数组形参的方式,调用时必须传入数组

2),数组形式的形参可以处于形参列表的任意位置,但是个数可变的形参只能处于形参列表的最后

3),一个方法最多只能包含一个长度可变的形参,调用这个方法时,既可以传入多个参数,也可以传入一个数组


方法重载

Java允许同一个类里定义多个同名方法,只要形参列表不同就行。

如果同一个类中包含了两个或者两个以上方法的方法名相同,但形参列表不同,则被称为方法重载。

为什么面向对象中要有方法重载?

方法的重载使同一类方法由于参数造成的差异对于对象的使用者是透明的,对象的使用者只负责把参数交给对象,而具体怎么实现由对象内部决定。


同一个类中方法名相同,但是参数列表不同,至于其他部分,如方法返回值类型,修饰符等等,与方法重载没有任何关系

重载不仅出现在同一个类中,也可以出现在父子类中。重载的方法只是刚好有相同名字的不同方法

Java中唯一重载的运算符是String类型的“+”号,任何类型+String类型结果都为Stirng类型。

Java程序中确定一个方法需要三个要素:

1),调用者,也就是方法的所属者,既可以是类,也可以是对象

2),方法名,方法的标识

3),形参列表,当调用方法时,系统将会根据传入的实参列表匹配

public void test(){}public void test(String name){System.out.println(name);}


1 0