![Java语言程序设计](https://wfqqreader-1252317822.image.myqcloud.com/cover/492/31729492/b_31729492.jpg)
4.2 “用户登录设计”实例
【实例目的】
(1)掌握方法的定义与调用。
(2)掌握构造方法的概念。
(3)掌握构造方法的定义。
【实例内容】
采用Java语言编写一个用户类,设计两个构造方法,一个判断是否为管理员的方法,利用主方法main()测试用户类的功能,如果是管理员,则显示欢迎信息,如果不是管理员,则给出提示信息。
【技术要点】
(1)设计用户类,第一步需要设计用户类的成员变量,第二步设计该类的构造方法,第三步设计该类的成员方法,完成程序的业务功能。在本实例中,用户类包含两个成员变量,用户名、用户密码。
(2)打开Eclipse软件,创建一个名为funApp的Java工程。然后在该工程src目录中新建一个名为UserLogin的类文件,输入源代码,如图4.4所示。
![](https://epubservercos.yuewen.com/1F18BF/17180250604495606/epubprivate/OEBPS/Images/img00086001.jpg?sign=1740160834-DR0jEFcNNfYyxhu6JzRdIZZ4Ff0uQMtg-0-eaae1be266925f9da1ab0e6705d50524)
图4.4 UserLogin类的源代码
(3)编写main()主方法,完成功能测试,具体的源代码如图4.5所示。
![](https://epubservercos.yuewen.com/1F18BF/17180250604495606/epubprivate/OEBPS/Images/img00086002.jpg?sign=1740160834-gNzg1zUDzF7y01f3JSUFKd6yJdTnst3J-0-b49b838004d4fe35aebcf0928f01636f)
图4.5 main主方法的源代码
(4)运行UserLogin类,按照提示输入用户名和密码之后,在控制台显示程序结果,如图4.6所示。
![](https://epubservercos.yuewen.com/1F18BF/17180250604495606/epubprivate/OEBPS/Images/img00087001.jpg?sign=1740160834-OIykbZLYZSKTa2igZSuw9eGzPEZphBmq-0-29ad6323455e60e99062ac0e0a99bb0b)
图4.6 Console控制台的输出结果
【相关知识及注意事项】
4.2.1 方法
方法(Method)是Java程序设计的重要概念之一。如果一个程序中有两个或者多个地方需要完成同一组动作的时候,为了提高程序的可复用性,避免程序的重复编写,可以把这一组动作单独出来,写成一个可以为其他程序所调用的“程序段”。这个程序段就是方法。本节主要介绍方法的定义、参数传递机制和方法的调用与递归。
1.方法的定义
方法的定义形式如下:
![](https://epubservercos.yuewen.com/1F18BF/17180250604495606/epubprivate/OEBPS/Images/img00087002.jpg?sign=1740160834-Pat08yU6SWxsKDEEAgO25l8O2ffYqKwX-0-2b206755dc9c5628b6b1a6d7a7124cb8)
其中修饰符包含访问控制修饰符和其他修饰符,返回类型是指出该方法要直接返回给调用者什么类型的结果,它可以是Java中的任何数据类型,还可以是自定义的类;
方法名是Java中合法的标识符,遵循java中标识符的命名规则。参数列表根据需要设定,多个参数用逗号进行区分,每一个参数都包含参数类型和参数标识符,参数列表中的参数都是局部变量,只在方法体中发挥作用。
方法体是一个方法的核心部分,它完成了数据的处理与返回,从某种意义上说方法体决定了该方法的功能和性质。
方法的返回值是给调用者返回数据的一种机制,它可以在方法调用返回的时候被赋值给任何具有相同或者相容类型的变量。
【例4-3】 本节中判断用户是否是管理员的方法代码如下:
![](https://epubservercos.yuewen.com/1F18BF/17180250604495606/epubprivate/OEBPS/Images/img00087003.jpg?sign=1740160834-BDg4ewXawtcFi3DthL2QyRI57bASfxT0-0-fe40c2125019dd617159df79406d828f)
2.方法的调用
方法的调用实质上把实际参数传递给形式参数的过程,一般来说,参数传递有两种方式:按值传递和按引用传递。
(1)参数的值传递
当Java方法的参数是基本数据类型的时候,是按值传递的。
【例4-4】 编写一个简单的程序,测试参数的值传递。
![](https://epubservercos.yuewen.com/1F18BF/17180250604495606/epubprivate/OEBPS/Images/img00088001.jpg?sign=1740160834-1gKtiMSte9Vg7lZx74Ku9Hr6VWBMVHUc-0-01ffe83695f3cde91070eb51af59d3a0)
该程序的运行结果如图4.7所示。
![](https://epubservercos.yuewen.com/1F18BF/17180250604495606/epubprivate/OEBPS/Images/img00088002.jpg?sign=1740160834-S5YuirdcQZZYV25Wf8xJ9ic0Gcm3sWKV-0-1bb5622cc280dc2b56399a968fa1636d)
图4.7 例4-4的输出结果
从例4-4中可以看出,test方法改变了变量i的值,但是main()方法中的i的值在调用test方法的前后没有发生变化,这说明,当参数为基本数据类型的时候,是按照值传递的方式进行赋值的,是将参数的一份副本传进test方法的,如果在方法里改变其值,其结果都是只改变了副本的值,而不会改变传入前的原值。
(2)方法的引用传递
什么是引用?简单地说,引用就像是一个对象的名字或者别名,引用传递也称为地址传递。方法调用时,实际参数的引用被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。
【例4-5】 编写一个程序,测试参数的引用传递。
![](https://epubservercos.yuewen.com/1F18BF/17180250604495606/epubprivate/OEBPS/Images/img00089001.jpg?sign=1740160834-0QGm1AM15uNjG2xkqbna5Q91ddJFB5tj-0-e439618b01c460b02ca0a80a3fc7f9b1)
在上述实例4-5中,test方法的参数是引用数据类型数组,在main()方法中调用了test(arr)方法,将数组的首地址(数组名)传递给test方法,在test方法中修改了arr[1]的值,main()方法中输出arr[1]的值,发现arr[1]的值变为test方法中的arr[1]的值。
该程序的运行结果如图4.8所示。
![](https://epubservercos.yuewen.com/1F18BF/17180250604495606/epubprivate/OEBPS/Images/img00089002.jpg?sign=1740160834-JOezidgkh6gJfKiIlDfeTTYeoVs3d1eR-0-466d3c77ce9072484dac2a74cf2affcd)
图4.8 例4-5的输出结果
3.方法的嵌套和递归调用
(1)方法的嵌套调用
在一个方法内调用另一个方法称为方法的嵌套调用,这种方式允许用户对已经分出的模块(方法)再次细化,是符合“逐步求精”思想的。
【例4-6】 我们定义了两个方法sum和mul,其中mul方法计算两个数的乘法,sum方法用来计算a+b*c。代码如下:
![](https://epubservercos.yuewen.com/1F18BF/17180250604495606/epubprivate/OEBPS/Images/img00089003.jpg?sign=1740160834-UMix7MDzx6BBKraszHSDNZHETZCtwFFu-0-8c4856f0c511393a16bbc6c327de68a6)
![](https://epubservercos.yuewen.com/1F18BF/17180250604495606/epubprivate/OEBPS/Images/img00090001.jpg?sign=1740160834-On1YfgXfXFa7uVV94KWCe5kFwdrdrAbE-0-669b6932df75522f67b88aef0aee7e5a)
在sum()方法中,嵌套调用了mul()方法,用来计算b*c,并返回计算结果给sum()方法。程序运行之后,输出的结果为:
12+6*8=60
(2)方法的递归调用
Java支持递归。递归就是依照自身定义事物的过程,递归是允许方法调用自身的过程。调用自身的方法称为是递归。因此递归可以看作嵌套的一种特殊形式。
【例4-7】 利用递归求5的阶乘。
![](https://epubservercos.yuewen.com/1F18BF/17180250604495606/epubprivate/OEBPS/Images/img00090002.jpg?sign=1740160834-TLL575qGxJqBY9QglSZcpSkdOzaYtDS0-0-8259a50cc715bbf88e69f9db51cff41c)
递归的执行过程:当fac(1)带着参数1被调用时,该方法返回1,否则它返回fac(n-1)与n的乘积。为了对这个表达式求值,fac(n-1)带着参数n-1被调用。重复这个过程直到n等于1,对该方法的调用开始返回。
4.2.2 构造方法
Java中提供了一种特殊的成员方法—构造方法,构造方法是类的必要组成部分,负责完成类的实例对象的初始化工作。
构造方法的定义形式如下:
![](https://epubservercos.yuewen.com/1F18BF/17180250604495606/epubprivate/OEBPS/Images/img00090003.jpg?sign=1740160834-RJrggyNo9juTs77Dnm02okLIJpfOt7wh-0-3a3fe9583b5c402d6c56f0d92124e5dc)
修饰符只能是访问控制修饰符,构造方法是每个类所必需的,如果在类的定义中没有显式给出构造方法,则Java默认生成一个默认的构造方法,这个默认的构造方法无参数并且方法体为空。
【例4-8】 构造方法的示例。
![](https://epubservercos.yuewen.com/1F18BF/17180250604495606/epubprivate/OEBPS/Images/img00091001.jpg?sign=1740160834-hV7Qb0oreBZY9tHJGkPe56J363qpTrOa-0-bf326fa513e6df2be8b11903650d5fa8)
在上面的程序中,定义了两个构造方法,但是这两个构造方法的参数表不同,并且用这两个构造方法分别创建了obj1和obj2对象。构造方法的特性反映在如下几个方面:
(1)构造方法的名字必须与定义他的类名完全相同,没有返回类型,甚至连void也没有。
(2)构造方法的调用是在创建一个对象时使用new操作进行的。构造方法的作用是初始化对象。
(3)每个类可以有零个或多个构造方法,如果没有构造方法,则系统会默认的添加一个构造方法,这个默认的构造方法无参数并且方法体为空。
(4)不能被static、final、synchronized、abstract和native修饰。构造方法不能被子类继承。
(5)构造方法在初始化对象时自动执行,一般不能显式地直接调用。当同一个类存在多个构造方法时,java编译系统会自动按照初始化时后面括号的参数个数、参数类型和参数的顺序来自动一一对应,完成构造函数的调用。