Java方法详解
文章目录
- 生活中的方法
- Java中的方法……实现某种功能(如main方法
1、什么是方法?
-
Java中的方法是语句的集合,在一块可以执行某个功能。
- 1 方法是解决一类问题的步骤的有序组合
- 2 包含于类和对象中
- 3 在程序中被创建,在其他的地方被引用
public class Demo01 { public static void main(String[] args) { traingle(10);//引用方法traingle,并且输入行高 } public static void traingle(int h) { //测试 引用之前的例题 生成h行的正三角形图案 for (int i = 1; i <= h; i++) { //行高多少就有几行,每行循环1次 for (int k = h; k > i; k--) { //先输出空格 System.out.print(" "); } for (int pic = 1; pic <= ((2 * i) - 1); pic++) { System.out.print("%");//输出图案 } System.out.println(); } } }
设计方法的原则:
- 设计方法的原则:
- 方法的本意是功能块,就是实现某个功能的语句块的集合;
- 设计方法时要保持原子性:
- 即:一个方法只做一个功能
- 有利于后期的拓展
方法的命名规则
- 首字母小写+驼峰原则
2、方法的定义和调用
- Java的方法 类似于 其他语言的函数功能,都是一段用来完成特定功能的代码片段。
2.1、定义方法需要包含的语法:
修饰符 返回值类型 方法名(参数类型 参数名){
...
方法体
...
return 返回值;
}
-
修饰符:可选的,高速编译器如何调用该方法。并且定义了访问的类型。(public、private、protected和static等
-
返回值类型:定义方法可能返回值的数据类型。
- 当没有返回值时,使用关键字void
-
方法名:是方法的实际名称。和参数表共同构成方法签名
-
参数类型:参数像是一个占位符。参数是可选的。当方法被调用时,传递值给参数。
-
分为形式参数和实参:
-
形式参数:在方法被调用时,用于接收外界输入的数据。
-
实参:调用方法时,实际传给方法的数据。
-
//设计一个两数相加的方法 public class Demo02 { public static void main(String[] args) { int sum=add(10,20); //实参10和20 System.out.println(sum); } public static int add(int a,int b){ //形式参数a和b //注意,定义多个形式参数之间要用逗号“,”隔开 return a+b; } }
-
-
-
方法体:就是包含的语句,定义了方法的功能。
##练习:设定一个比大小的方法。
//设计一个比大小的方法
public class Demo03 {
public static void main(String[] args) {
compare_01(3,5);
System.out.println(compare_02(3,5));
System.out.println("测试大小相同的情况:");
compare_01(5,5);
System.out.println(compare_02(5,5));
//测试通过
}
//方法一、直接输出语句显示结果。
public static void compare_01(int a,int b){
if(a==b){
System.out.println(a+"=="+b);
}else if(a > b){
System.out.println(a+">"+b);
}else{
System.out.println(a+"<"+b);
}
}
//方法二、返回大的值作为结果
public static int compare_02(int a,int b) {
int num = 0;//方法内的变量 也需要初始化
if (a == b) {
System.out.println(a + "==" + b);
return 0;//输出的结果里会多一个0? 这个解决。。。
} else if (a > b) {
num = a;
} else {
num = b;
}
return num;
}
}
2.2、方法调用
-
前面已经有大量应用了
-
语法:
对象名.方法名
?? -
当方法有返回值时,**方法调用通常被当做一个值。**如
int max=compare_02(3,5);
-
当方法返回值是void时,**方法调用一定是一条语句。**如
System.out.println("Hello!") ;
- (其中println就是一个方法)
-
对象名.方法名
??:需要用到 new
2.3 拓展:值传递 和引用传递(面试会考
简单理解Java都是值传递。
- 可以拓展在网上理解。
3、方法的重载
简单来说,两个相同的类拥有一样的名字,但是参数(数据类型、参数的数量!)不同,两者可以同时存在,并且根据参数选择进行调用。
3.1方法重载的规则
- 方法的名称必须相同;
- 参数列表必须不同;(个数、类型、排列顺序不同等)
- 返回值则不做要求;
3.2实现理论:
方法名称相同时,编译器会根据参数列表逐个匹配,以选择对应的方法,如果匹配失败,则编译器会报错。
基础阶段先掌握概念,后期可以通过分析源码来加深认识
#练习:设计一个可以2个、3个、4个数相加的方法
public class Demo04 {
public static void main(String[] args) {
System.out.println(add(5,3));
System.out.println(add(5,3,1.5));
System.out.println(add(5,3,1.5,2.3));
//结果正确
}
public static int add(int a,int b){ //形式参数a和b
//注意,定义多个形式参数之间要用逗号“,”隔开
return a+b;
}
public static double add(double a,double b){
return a+b;
}
public static double add(double a,double b, double c){
return a+b+c;
}
public static double add(double a,double b, double c,double d){
return a+b+c+d;
}
}
结果测试正确。
4、命令行传递参数
当希望运行一个程序时再传递给它信息,就要靠传递命令行参数给main()函数实现。
举例,并通过cmd执行
//通过main方法传递东西
public class Demo {
public static void main(String[] args) {
//args.length数组长度
for (int i = 0; i < args.length; i++) {
System.out.println("args["+i+"]:"+args[i]);
//args[i]表示数组对应的元素
}
}
}
方法1:尝试使用IDEA自带的Terminal(终端,在下面)功能调用cmd功能,进行测试。
方法2:可以直接在文件夹目录前加入cmd+空格,调出CMD窗口进行测试。
- 直接输入“javac com.zhc.method.Demo”尝试直接运行程序。/错误
PS I:\JavaProject\JavaSE> javac com.zhc.method.Demo
错误: 仅当显式请求注释处理时才接受类名称 'com.zhc.method.Demo'
1 个错误
- 进入文件夹目录后,输入“javac Demo.java”. /成功!
- 注意 语句涉及中文需要加入参数“ -encoding UTF-8”才能成功.
I:\JavaProject\JavaSE\基础语法\src\com\zhc\method>javac Demo.java -encoding UTF-8
//成功则没有提示;并且文件夹会生成 Demo.class
###如何运行?
-
方法一:直接输入“java Demo” //错误
I:\JavaProject\JavaSE\基础语法\src\com\zhc\method>java Demo 错误: 找不到或无法加载主类 Demo
-
方法二:使用“cd…”指令返回上级,到src文件夹。再输入“java ” +目录“com.zhc.method.Demo ”
- 成功,但是我们需要传递一个数组进入args内
- 故在cmd 后再加入几个数or字符串即可输出如下:
I:\JavaProject\JavaSE\基础语法\src>java com.zhc.method.Demo
I:\JavaProject\JavaSE\基础语法\src>java com.zhc.method.Demo 10 20 30
args[0]:10
args[1]:20
args[2]:30
I:\JavaProject\JavaSE\基础语法\src>java com.zhc.method.Demo I am fine !
args[0]:I
args[1]:am
args[2]:fine
args[3]:!
5、可变参数
-
简单理解:精简多个重载数组
-
用法:在方法声明中,在制定参数类型后加一个省略号“…”
-
注意:一个方法中只能制定一个可变参数,他必须是方法的最后一个参数(也就是说,任何普通参数必须在他之前声明)。
-
例如
public static void printMax( duoble... numbers){ //这里的double...就是可变参数 }
-
-
其实可变参数的思想就是数组,后续会讲到。
- 标记一下例题讲解 后续回看:例题
6、!!递归
- 如果想要直接自己调用自己的方法 ,会爆内存,报错:StackOverflowError (堆栈溢出错误)
java用栈比较多
什么是递归?
递归就是:A方法调用A方法,自己调用自己。
需要注意的是
-
递归必须包含两个部分:
- 递归头:什么时候不调用自身的方法(类似判断语句
- 递归体:什么时候,调用自身的方法(类似循环体
-
缺点:占用内存,能不用就不用!!
例题:用递归的方法实现“阶乘”的计算。
public class Demo {
public static void main(String[] args) {
System.out.println(d(5));//调用方法d
}
public static int d(int a){
int sum=1;
//先设定递归头
if(a==1){
return sum;
}
if(a > 1){
sum = a*d(a-1); //再设定递归体
}
return sum;
}
}
7、作业:编写计算器
2022年4月9日
题目:写一个计算器,要求实现加减乘除功能,并且能够循环接受新的数据,通过用户交互实现。
思路的推荐:
- 写4个方法:加减乘除;
- 利用循环+switch进行用户交互
- 传递需要操作的两个数
- 输出结果
package com.zhc.method;
/*
题目:
写一个计算器,要求实现加减乘除功能,
并且能够循环接受新的数据,通过用户交互实现。
要求:
- 写4个方法:加减乘除;
- 利用循环+switch进行用户交互
- 传递需要操作的两个数
- 输出结果
*/
/*
分析:首先要有什么部分?
1、用户交互:需要输入 两个数 以及 运算符号,最终经过计算 再输出 结果即可。 (success
2、内部运算:按题目要求,分别编写四个方法 (sucess 但是可以优化?
3、检查:用户输入错误的内容,需要反馈错误? (怎么实现?最简单的 if语句判断,但是很冗长
4、实现循环使用,(用循环结构?)判断能否结束程序。 (想着很简单,其实很难
*/
import java.util.Scanner;
public class Demo04 {
//我们先实现1和2
public static void main(String[] args) {
System.out.println("计算器已启动,请输入一个数:");
Scanner scanner = new Scanner(System.in); //启动scanner
double num1 = scanner.nextDouble();
System.out.println("您成功输入了:"+num1);
System.out.println("请输入运算符号(+ - * /)");
String test = scanner.next(); //获取运算符号
System.out.println("您成功输入了"+num1+test);
System.out.println("请输入下一个数:");
double num2 = scanner.nextDouble();
System.out.println("您成功输入了:"+num1+test+num2);
//---------------------------------------------------
//实现计算功能并返回结果
double re=0;
switch (test){
case "+":
re=add(num1,num2);
System.out.println("输出的结果为:"+re);
break;
case "-":
re=sub(num1,num2);
System.out.println("输出的结果为:"+re);
break;
case "*":
re=mul(num1,num2);
System.out.println("输出的结果为:"+re);
break;
case "/":
re=div(num1,num2);
System.out.println("输出的结果为:"+re);
break;
default:
System.out.println("您输入的运算符有误");
break;
}
scanner.close();
}
static public double add(double a,double b){
return a+b;
}
static public double sub(double a,double b){
return a-b;
}
static public double mul(double a,double b){
return a*b;
}
static public double div(double a,double b){
return a/b;
}
}
。。。未完待续。。检查和循环的功能还没设计好