【从零开始的Java开发】1-2-4 Java方法

2023-11-09

方法

所谓方法,就是用来解决一类问题的代码的有序组合,是一个功能模块。
方法声明
在这里插入图片描述

方法分类

  • 无参无返回值方法
  • 无参有返回值方法
  • 带参无返回值方法
  • 带参有返回值方法

无参无返回值的方法
想要这个:

***************************
Hello World!
***************************

写的方法:

package com.t1.method;

public class myMethod {
	public void printStar() {
		System.out.println("***************************");
	}

	public static void main(String[] args) {
		//创建一个myMethod类的对象myMethod1
		myMethod myMethod1=new myMethod();
		//调用这个myMethod1对象的printStar方法:
		//使用对象名.方法名()去调用这个方法
		myMethod1.printStar();
		System.out.println("Hello World!");
		myMethod1.printStar();

	}

}

无参带返回值的方法

package com.t1.method;

public class Rectangle {

	public int area() {
		int a = 10, b = 20;
		int area = a * b;
		return area;
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Rectangle myRectangle = new Rectangle();
		System.out.println("长方形面积为:" + myRectangle.area());

	}

}

带参无返回值的方法
目的:定义一个求两个float类型数据最大值的方法,在方法中将最大值打印输出。

public void max(float a,float b){}

代码:

package com.t1.method;

public class MaxDemo {

	public void Max(float a, float b) {
		float max;//变量名其实可以和方法名同名
		if (a > b)
			max = a;
		else
			max = b;

		System.out.println("ab两个数的最大值为" + max);
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		MaxDemo max1 = new MaxDemo();
		max1.Max(6.2f, 7.44f);
	}

}

带参有返回值的方法
目的:定义一个求n!的方法,然后再求1!+2!+3!+4!+5!;

public int fac(int n){}

代码:

package com.t1.method;

public class facDemo {

	public int fac(int x) {
		int ans = 1;
		for (int i = 1; i <= x; i++) {
			ans *= i;
		}
		return ans;
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		facDemo facDemo1 = new facDemo();
		int ans = 0;
		for (int i = 1; i <= 5; i++) {
			ans += facDemo1.fac(i);
		}

		System.out.println(ans);
	}

}

数组作为方法参数

要求1:定义方法,打印输出数组元素的值。

public void printArray(int[] arr){}

代码:

package com.t1.method;

public class Arr {

	public void printarr(int[] arr) {
		for (int i = 0; i < arr.length; i++) {
			System.out.print(arr[i] + " ");
		}
		System.out.println();
	}

	public static void main(String[] args) {
		int[] arr = { 10, 20, 30, 40, 50 };
		Arr arr1 = new Arr();
		arr1.printarr(arr);

	}
}

要求2:查找数组元素的值
方法参数:数组、要查找的值
返回值:boolean

代码:

package com.t1.method;

public class findValue {

	public boolean find(int n, int[] a) {
		for (int i = 0; i < a.length; i++) {
			if (a[i] == n)
				return true;
		}
		return false;
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		findValue find1 = new findValue();
		int[] a = { 1, 2, 3, 4, 5, 6 };
		boolean flag = find1.find(1, a);
		if (flag == true)
			System.out.println("找到了");
		else
			System.out.println("没找到");
	}

}

方法重载

方法名相同,方法参数不同。

跟第一个相比,哪个是重载的方法?
在这里插入图片描述
答:
3、4、5都是重载的方法。因为方法名相同,参数列表不同
第2个参数列表相同,第6个方法名不同。所以都不是重载的方法。

代码的练习:
定义三个方法,实现int、double、和数组类型和的问题。

代码:

package com.t1.method;

public class Add {

	public int add(int n, int m) {
		return n + m;
	}

	public double add(double m, double n) {
		return n + m;
	}

	public int add(int[] a) {
		int ans = 0;
		for (int i = 0; i < a.length; i++) {
			ans += a[i];
		}
		return ans;
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Add add1 = new Add();
		System.out.println("int的和" + add1.add(1, 2));
		System.out.println("double的和" + add1.add(2.3, 4.4));
		int a[] = { 1, 2, 3, 4, 5, 6 };
		System.out.println("数组的和" + add1.add(a));
	}

}

基本数据类型的传值

package com.t1.method;

public class swapp {

	public void swap(int a, int b) {
		int temp = a;
		System.out.println("交换前a=" + a + " b=" + b);
		a = b;
		b = temp;
		System.out.println("交换后a=" + a + " b=" + b);
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int n = 1, m = 2;
		System.out.println("交换前n=" + n + " m=" + m);
		swapp swap1 = new swapp();
		swap1.swap(n, m);
		System.out.println("交换后n=" + n + " m=" + m);
	}

}

输出:

交换前n=1 m=2
交换前a=1 b=2
交换后a=2 b=1
交换后n=1 m=2

由此可知,交换的只是a,b,而不是n,m。
且n,m只是传值给了a,b,而不是它们自己的地址。

注意:只有在主方法中调用函数需要写对象名,在其他方法中不用写对象名
如:

package com.t1.method;

public class swapp {

	public void swap(int a, int b) {
		int temp = a;
		System.out.println("交换前a=" + a + " b=" + b);
		a = b;
		b = temp;
		System.out.println("交换后a=" + a + " b=" + b);
	}

	public void test() {
		int n = 1, m = 2;
		System.out.println("交换前n=" + n + " m=" + m);
		//这里没有通过对象调用方法,而是直接调用的
		swap(n, m);
		System.out.println("交换后n=" + n + " m=" + m);
	}

	public static void main(String[] args) {
		swapp swap1 = new swapp();
		//主方法中需要通过对象调用方法
		swap1.test();
	}

}

输出:跟之前是一样的。

交换前n=1 m=2
交换前a=1 b=2
交换后a=2 b=1
交换后n=1 m=2

如果在方法中对参数进行了更改,那么出了方法后,值不变:
在这里插入图片描述

数组的传值(引用数据类型)

package com.t1.method;

public class updateArr {

	public void printArr(int[] a) {
		for (int n : a) {
			System.out.print(n + " ");
		}
		System.out.println();
	}

	public void update(int[] a) {
		a[0] = 1;
		System.out.println("更改中:");
		printArr(a);
	}

	public static void main(String[] args) {
		int[] a = { 6, 6, 6, 6, 6 };
		System.out.println("更改前:");
		updateArr updateArr1 = new updateArr();
		updateArr1.printArr(a);
		updateArr1.update(a);
		System.out.println("更改后:");
		updateArr1.printArr(a);

	}
}

输出:

更改前:
6 6 6 6 6 
更改中:
1 6 6 6 6 
更改后:
1 6 6 6 6 

数组在方法中改变值,在主方法中值也会改变。

原因是:
我们定义了一个数组{6,6,6,6,6},就是在内存中开辟了一个连续的一份空间,里面填了{6,6,6,6,6}。其中a就指向了数组的第一个元素,也就是说,a是一个地址。
我们在调用方法时传的是a(地址),则会直接对内存中的值进行修改了,所以会变化。

可变参数列表

格式如:

public void sum(int... n)//我直接类比C++的vector<int>n

写一个参数为int…的求和代码:

package com.t1.method;

public class ArgsDemo {

	public void sum(int... n) {
		int ans = 0;
		for (int i : n) {
			ans += i;
		}
		System.out.println("sum=" + ans);
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ArgsDemo a1 = new ArgsDemo();
		a1.sum(1, 2, 3);
		a1.sum(1, 2, 3, 4);
		a1.sum(1, 2, 3, 4, 5);
	}

}

输出:

sum=6
sum=10
sum=15

一个参数包含int…n的查找代码:

package com.t1.method;

public class ArgsDemo {

	public boolean find(int a, int... n) {
		for (int i : n) {
			if (i == a)
				return true;
		}
		return false;
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ArgsDemo a1 = new ArgsDemo();
		boolean flag;
		int[] n = { 1, 2, 3, 4, 5 };
		flag = a1.find(0, n);
		if (flag)
			System.out.println("找到了");
		else
			System.out.println("没找到");

		int[] n1 = { 1, 2, 3, 4, 6, 6, 6 };
		flag = a1.find(2, n1);
		if (flag)
			System.out.println("找到了");
		else
			System.out.println("没找到");
	}

}

输出:

没找到
找到了

注意:
可以把数组传给可变参数列表,但不能把可变参数列表传给数组
如:数组传给可变参数列表

public boolean find(int a, int... n);//这是find函数
find(1,arr1);//这样传值,可以——数组传给可变参数列表

可变参数列表传给数组

public boolean find(int a, int[]n);//这是find函数
find(1,2,3,4,5);//这样传值,不可以——可变参数列表传给数组

一个方法中只能由一个可变参数列表,且要放在参数的末尾

可变参数列表作为方法参数的重载

可变参数列表所在的方法是最后被访问的

如代码:

package com.t1.method;

public class Add {

	public int add(int n, int m) {
		System.out.println("不带可变参数列表的方法调用!");
		return n + m;
	}

	public int add(int... n) {
		int ans = 0;
		for (int i : n) {
			ans += i;
		}
		System.out.println("带可变参数列表的方法调用!");
		return ans;
	}

	public static void main(String[] args) {
		Add add1 = new Add();
		int ans = add1.add(1, 2);
		System.out.println(ans);
	}

}

输出:

不带可变参数列表的方法调用!
3

文档注释

可生成的帮助文档文档注释
/**再回车:
在这里插入图片描述
@后会出现很多参数:
在这里插入图片描述
文档注释如何生成帮助文档?通过Java的doc命令从文档注释中提取内容,生成程序的API帮助文档。
命令如下:

javadoc -d doc 文件名.java

我们查看index.html文件即可。

方法的调试

F5可以跳到方法内部执行。
F6可以在调试中看下一步(单步调试)。
F7由方法内部返回调用处。

细节与总结

方法的语法格式

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

访问修饰符:

  • public
  • private
  • protected
  • 啥都不写

也可以写其他修饰符,如static.
方法调用

创建对象:

Demo d=new Demo();
类名 对象名=new 类名();

调用方法:

d.show();
对象名.方法名();

只有在主方法中调用函数需要写对象名,在其他方法中不用写对象名
方法重载
方法名相同,方法参数不同。

可变参数列表
可变参数一定是方法中的最后一个参数
数组可以传递给可变参数的方法,反之不行
在重载中,含有可变参数的方法是最后被调用的

方法的传值问题

  • 基本数据类型传值:方法中对参数的修改不会改变主方法中的变量
  • 引用数据类型传值:会改变,如数组。

参数为数组是引用,因为传的是地址

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【从零开始的Java开发】1-2-4 Java方法 的相关文章

随机推荐

  • 信号量详细解说

    1 信号量概述 进化版的互斥锁 1 gt N 由于互斥锁的粒度比较大 如果我们希望在多个线程间对某一对象的部分数据进行共享 使用互斥锁是没有办法实现的 只能将整个数据对象锁住 这样虽然达到了多线程操作共享数据时保证数据正确性的目的 却无形中
  • webdriver安装

    首先了解自己所需使用的浏览器 这里以谷歌浏览器为例 火狐 Edge安装方式相同 找相应webdriver即可 查看自己浏览器的版本 去官网找对应版本的webdriver 网址 http npm taobao org mirrors chro
  • SD3.0协议解读三

    SD卡功能描述 所有主机和SD卡间的通信都是由主机控制的 这和USB是一致的 例如 U盘并没有主动通知USB控制器的能力 USB鼠标也没有主动通知USB控制器的能力 当然 SD卡也是没有主动通知SD控制器的能力的 主机发送的命令有两种 一种
  • 几个开发模式

    瀑布模型 开发过程顺序进行 过程规范 有质量保证 但是不能够应对需求变化 更改代价较高 灵活性较低 V模型 基于瀑布模型 但是更强调测试过程 有质量保证 显示出不同层次上的测试方法 并且将测试阶段与开发阶段相联系 原型模型 主要解决核心问题
  • @RabbitListener起作用的原理

    一 前言 在spring中 定义rabbitMq的消费者可以相当方便 只需要在消息处理类或者类方法加上 RabbitListener注解 指定队列名称即可 如下代码 Component public class RabbitMqListen
  • STM32长时间工作后串口不能接收

    问题 记录一次STM32长时间工作后 串口不能正常接收数据 其他功能正常 场景简单描述 在某一个产品上STM32作为前面板的控制 有多个中断开启 大部分的中断级别为0 串口的中断级别为1 串口中断接收 普通方式发送 出现长时间工作之后串口不
  • 快速解决node-sass报错问题

    1 引言 由于项目中需要使用到node sass 因此怀疑我的环境出问题了 于是决定配置nvm让环境变得更加灵活 便于切换node的版本 2 直接开始 1 安装nvm 链接 https pan baidu com s 1Li4o34jB6o
  • 五人合伙最佳股份分配_5人合伙,4个人投资源,1人经营,股权应该如何划分?...

    最近一个客户找到股加加进行咨询 说 我们公司是做新媒体运营培训的 主要靠卖课和咨询服务 3个投资源的手上有很多大V 流量较大的平台这方面的资源 可以拉来业务 我负责经营 另一个出资的 打算投40万到公司 应该给他多少股份 其他四人都是兼职人
  • 【前端编辑器分析(markdown,富文本)】

    随着近几年markdown编辑器的流行 富文本编辑器不再是唯一选择 但是主体都是工具栏加编辑区的模式 1 markdown markdown使用格式标记语言编排内容 当你要修改文章某个地方的格式时 在该位置加入对应的格式符号即可 markd
  • Unable to connect to 127.0.0.1:6379 的解决办法

    问题 Unable to connect to 127 0 0 1 6379 解决办法 1 在redis的目录下输入cmd 2 redis server exe redis windows conf 不关闭窗口 3 然后在新开一个cmd窗口
  • 利用MOS管使电路供电电压稳定之后,降低供电电压的方法

    现在有一款产品需要1 005V高电压启动 0 903V低电压运行 这也是从低功耗的角度设计 下面电路就是利用一颗N沟道MOS管来实现上电瞬间输出高电压 核心板启动之后 输出低电压 SAR GPIO1引脚接的MCU 的GPIO口 先上data
  • MySQL之UPDATE与SELECT结合语法详解与实例

    第一种 语法 UPDATE table1 SET column1 SELECT column FROM table2 WHERE condition WHERE table1 column2 value 注 若不加where条件则是更新表中
  • 进度 060706-060724

    新进度从060706 开始 ESOE v0 2 进度记录 9 060724 内存泄漏降低到实用程度 测试例子100次刷新小于500k 不再优化 并加入析构机制 下一步工作整理说明书 8 在框架页面下出现严重的javascript内存泄漏问题
  • java 驼峰和下划线互相转换

    其实是很简单的正则表达式转换 直接上代码 驼峰转下划线 param str 目标字符串 return java lang String public static String humpToUnderline String str Stri
  • LVM动态扩容逻辑卷详解

    LVM逻辑卷管理 简介 LVM是逻辑卷管理 Logical Volume Manager 的简称 它是Linux环境下对磁盘分区进行管理的一种机制 LVM是建立在硬盘和分区之上的一个逻辑层 来提高磁盘分区管理的灵活性 LVM最大的特点就是可
  • Openldap导入数据(一)

    在安装完openldap之后 默认ldap中是没有数据的 需要管理员进行添加 当然添加的方法也不止一种 这里先介绍第一种方法 从本地系统添加用户到ldap中 root ldapsrv01 ldapsearch x b dc contoso
  • ES查询不存在的索引,索引未创建导致查询报错

    ES查询不存在的索引 索引未创建导致查询报错 项目中的一个es索引是根据时间建立的 在对其操作时候 因时间原因此索引为创建 查询时候报如下错误 Elasticsearch exception type index not found exc
  • Swagger配置完成以后,登录账户名和密码的设置

    spring security basic path swagger ui html enabled true user name admin 账号 password 123456 密码
  • ajax长轮询tornado,数据可用时如何完成Tornado长轮询请求

    我有很长的编程背景 但对Python还不熟悉 我正在研究Tornado 以构建一个长轮询服务的原型 在 我想实现的是用户连接说example com get 1234 这是长轮询部分 1234是用户ID 目前 它只是挂起并等待内容 然后用户
  • 【从零开始的Java开发】1-2-4 Java方法

    文章目录 方法 方法分类 数组作为方法参数 方法重载 基本数据类型的传值 数组的传值 引用数据类型 可变参数列表 可变参数列表作为方法参数的重载 文档注释 方法的调试 细节与总结 方法 所谓方法 就是用来解决一类问题的代码的有序组合 是一个