强哥说Java--Java 方法

什么是方法如何自定义方法,并按照分类介绍每种方法的特点,对于有参数的方法传值,会讲到基本数据类型作为方法参数和引用数据类型作为方法参数的区别。也会学习可变参数方法的定义语法和使用场景,方法重载的使用和意义也是本节的重点学习内容。

1. 什么是方法


在前面我们已经了解过方法的概念,Java 程序的入口main()就是一个方法。System.out.println();语句中println()也是一个方法。

IntelliJ IDEA查看代码,可以使用Ctrl + 鼠标左键单击代码中的 println()方法,查看 JDK 源码中对于这个方法的定义:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0SsCpKnb-1629443164258)(E:\Typora\Image\image-20210817164430921.png)]

上面的截图就是我们经常调用的老朋友println()方法的代码实现,我们可以将方法理解为一个命名语句块,通过其名称 + 括号运算符()可以调用。我们可以将需要重复编写的代码,封装到一个方法中。提高代码的复用性。

2. 如何定义方法


在 Java 中,定义一个方法的语法为:

访问修饰符 返回类型 方法名(参数列表) {

若干语句;

return 方法返回值;

}

代码块1234

  • 访问修饰符有 4 种情况publicprivateprotected,也可以省略(default)。

  • 返回类型:可以是任何的数据类型或 void,如果方法没有返回值,返回类型设置为void

  • 方法名:方法名的命名规范和变量相同;

  • 参数列表:参数是变量的一种类型,参数变量的作用域在方法内部;

  • 方法体:方法内部的一些语句。当方法返回值为 void时,可以省略return语句。

3. 分类


根据方法是否带有参数、是否有返回值,可以分为 4 类:

  • 无参无返回值方法

  • 无参带返回值方法

  • 带参数无返回值方法

  • 带参数带返回值方法

3.1 无参无返回值方法

无参无返回值方法,即参数列表为空,返回值为void的方法。例如,我们经常需要输出一段内容。可以将输出语句封装到方法中:

class MethodDemo1 {

// 定义无参无返回值方法

public void printText() {

// 三条输出语句

System.out.println(“C”);

System.out.println(“Java”);

System.out.println(“Python”);

}

}

上面代码,在类MethodDemo1中定义了一个方法printText,其中有一些打印语句。那么如何调用这个方法,让其执行呢?

对于非静态方法(即非static关键字修饰的方法),首先要使用new关键字实例化类,生成一个对象,再通过对象名.方法名()的方式去调动方法。

如下是 MethodDemo1 类方法调用的实例:

实例演示

class MethodDemo1 {

// 定义无参无返回值方法

public void printText() {

// 三条输出语句

System.out.println(“C”);

System.out.println(“Java”);

System.out.println(“Python”);

}

public static void main(String[] args) {

// 实例化MethodDemo1类

MethodDemo1 testDemo = new MethodDemo1();

// 调用printText方法

methodDemo1.printText();

}

}

Tips:由于我们还没有学习面向对象,此处对于对象的实例化,先记住这种固定写法即可。

3.2 无参带返回值方法

无参带返回值方法,即参数列表为空,返回值不为void的方法,方法体内部要使用return语句返回其声明的返回类型。

我们来自定义一个返回Hello World!字符串的方法:

实例演示

class MethodDemo2 {

// 定义无参带返回值方法

public String getHelloStr() {

// 初始化变量str

String str = “Hello World”;

// 返回str

return str;

}

public static void main(String[] args) {

// 实例化MethodDemo2

MethodDemo2 methodDemo2 = new MethodDemo2();

// 调用getStr方法,并且使用result变量接收返回值

String result = methodDemo2.getHelloStr();

// 打印返回值

System.out.println(result);

}

}

运行结果:

Hello World

3.3 带参数无返回值方法

带参数无返回值方法,即带有参数列表,返回值为void的方法。

参数列表可能有一个或多个参数,多个参数使用逗号(,)隔开。定义方式为:DataType 参数名1, DataType 参数名2,DateType 为参数的类型。

下面是一个根据长和宽求长方形面积的方法实例:

实例演示

package com.caq.method;

public class TestDemo {

public static void main(String[] args) {

TestDemo test = new TestDemo();

test.pristr(1.22f,3.8f);

}

public void pristr(float width, float height){

float cube = width * height;

System.out.println(cube);

}

}

运行结果:

长方形面积为:246.0

长方形面积为:25.5

3.3.1 传参方式

在调用带参数方法时,有两种传参方式:

  1. 先初始化变量,再将变量传递给方法:

float a = 12.3f;

float b = 20f;

methodDemo3.printArea(a, b);

  1. 直接传入对应类型字面量:

methodDemo3.printArea(10.2f, 2.5f);

当调用方把参数传递给方法时,调用时传递的值会按参数位置一一绑定,这也比较符合我们正常的思维逻辑。因此,对于有多个参数的方法,一定要注意每个参数的位置。

3.4 带参数带返回值方法

package com.caq.method;public class TestDemo { public static void main(String[] args) { TestDemo test = new TestDemo(); int a = test.pristr(5); System.out.println(a); } public int pristr(int n){ int sum = 0; for (int i = 0; i < n; i++) { sum += i*i; } return sum; }}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0Pyl12oT-1629443164261)(E:\Typora\Image\image-20210817173421155.png)]

上面有参方法的例子,参数都是简单的基本数据类型,当参数为数组时,我们再来看一个实例:

package com.caq.method;import com.caq.exception.Test;public class TestDemo { public boolean meetArray(int[] a,int element) { boolean b = false; for (int v : a) { if (v == element) { b = true; break; } } return b; } public static void main(String[] args) { TestDemo testDemo = new TestDemo(); int[] intArray = {1,2,3,7,5}; int element = 5; boolean meetArray = testDemo.meetArray(intArray,element); System.out.println(meetArray); }}

代码解析:

上述代码定义了一个查找数组中是否包含指定元素的方法,它将数组指定元素作为方法参数,并且返回了一个布尔型的结果,方法体内部首先声明了一个待返回的布尔变量,默认为false,然后对数组参数进行迭代,只要找到与元素参数相同的元素,即更新返回变量为true,跳出循环;如果数组迭代完成后依旧未找到指定的元素,那么待返回变量依然是false,最后返回这个变量。在方法调用时,以一个布尔变量来接收结果,后续代码根据这个布尔变量做了逻辑判断,以执行不同的语句块。

4. 方法传值


调用方和方法之间有参数的传递时,要注意方法传值问题。

4.1 基本类型的传值

基本数据类型指的是简单的数据段,引用数据类型指的是有多个值构成的对象。

基本类型参数的传递,是调用方值的复制。双方各自的后续修改,互不影响。简单来讲,方法内部对参数变量的任何操作,都不会影响到方法外部的变量。

我们看一个实例:

实例演示

class Car { public void speedUp(int speed) { System.out.println(“小汽车加速前,速度为:” + speed); speed ++; System.out.println(“小汽车加速后,速度为:” + speed); } public static void main(String[] args) { // 定义小汽车初始速度变量 int speed = 10; // 实例化Car类,创建一个car对象 Car car = new Car(); // 调用car对象下的speed方法 car.speedUp(speed); // 打印调用方法后速度参数的值 System.out.println(“调用speedUp方法后,调用方的speed参数为:” + speed); }}

运行结果:

小汽车加速前,速度为:10小汽车加速后,速度为:11调用speedUp方法后,调用方的speed参数为:10代码块123

我们根据输出的结果验证了以上给出的结论。整型参数speed是一个基本数据类型,在speedUp方法内部进行了自增,但主方法中的speed变量的值并不会受到其影响。

4.2 引用类型的传值

引用类型参数的传递,调用方的变量,和接收方的参数变量,地址指向的是同一个对象。双方任意一方对这个对象的修改,都会影响对方。

我们来看一个实例:

实例演示

package com.caq.method;//引用类型的传值public class TestDemo { //定义一个代替球员的方法,并传入字符串类的数组和字符串Playname public void replacePlays(String[] temas, String Playame) { temas[0] = Playame; } public static void main(String[] args) { System.out.println(“引用前:”); String[] teams = {“康熙”, “雍正”, “乾隆”}; for (String test : teams) { System.out.println(test); } TestDemo plays = new TestDemo(); plays.replacePlays(teams, “张三”); System.out.println(“引用后:”); for (String test2 : teams) { System.out.println(test2); } }}

运行结果:

引用前:康熙雍正乾隆引用后:张三雍正乾隆

由运行结果可见:方法replaceFirstPlayer的参数players是数组类型,也就是引用类型。当我们在方法内部对players进行操作,其方法外部(即主方法中)的players变量也受到了影响。不只是数组,对象也是引用类型,其参数传递同样遵循以上结论。我们在日常的编码中,请注意区分基本类型和引用类型的方法传值区别。

5. 可变参数


我们可以使用可变参数列表声明方法的参数。可变参数列表的语法:

参数类型… 参数名

我们可以结合可变参数来实现一个求和方法sum,请阅读下面实例:

实例演示

package com.caq.method;//可变参数public class TestDemo { public void TestDemo(int… n) { int sum = 0; for (int i : n) { sum += i; } System.out.println(sum); } public static void main(String[] args) { TestDemo test = new TestDemo(); test.TestDemo(1); test.TestDemo(22,33); test.TestDemo(1,2,3,4,5); }}

运行结果:

15515
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

读者福利

秋招我借这份PDF的复习思路,收获美团,小米,京东等Java岗offer

更多笔记分享

秋招我借这份PDF的复习思路,收获美团,小米,京东等Java岗offer

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
98)]

[外链图片转存中…(img-DmkdaxhJ-1713678716598)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

读者福利

[外链图片转存中…(img-gvUMLHso-1713678716598)]

更多笔记分享

[外链图片转存中…(img-5chw75qj-1713678716599)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 11
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值