1、方法是什么?
方法:是一种语法结构,它可以把一段代码封装成一个功能,以方便重复调用。
目标:能够说出使用方法的优点:
1、提高了代码的复用性。
2、让程序的逻辑更清晰。
代码示例:定义一个求和方法sum
public static void main(String[] args) {
// 张工
int c1 = sum (10,30);
System.out.println(c1);
// 徐工
int c2 = sum(10,50);
System.out.println(c2);
}
public static int sum(int a , int b ){
int c = a + b ;
return c ;
}
2、方法定义的完整格式:
方法的声明 注意:方法必须先声明在调用
方法声明的(必要)要素:方法调用栈
调用方法
1、有返回值的方法
2、无返回值的方法
3、调用方法时出现异常(出错)
一个完整的方法签名(声明)
六部分组成
1、访问修饰符:设置方法访问权限
public:公共的(大家都可以访问的)
private:私有的(只有自己能访问)
protected:受保护的(子类和同包能访问)
不写(default):默认的(同包的可以访问)
2、可选修饰符(可有可无)
static静态的(全局的)
final最终的:表示该方法不能被重写
abstract(抽象):表示该方法是一个抽象的方法
静态方法不能调用非静态方法。
静态方法中使用非static方法,必须创建类的实例对象的
3、返回的数据类型:
方法的返回值(),没有返回使用void表示
4、方法名
方便调用。方法名必须在返回类型的后面。见名知意
5、形式参数列表。
在方法名的后面必须是用一对括号括起来的形式参数列表
6、抛出的异常列表
当调用该方法时,可能会发生一个异常(错误)给方法的调用者。
比如,定义一个除法时,如果分母为0,调用该除法时就会出现异常。(ArithmeticException)
栈
- 暂时存放货物的地方或者旅客暂时休息的地方
- 计算机引入栈:表示临时存放数据的地方,它是一种单向的数据存储结构。
- 把数据存入栈中,叫入栈(压栈)
- 从栈中删除数据,叫出栈(弹栈)
- 栈特点:先进后出,后进先出
- 英文简写FILO(first in last out)先进后出
修饰符 返回值类型 方法名 (形参列表){
需要执行的功能代码)
return
}
示例:使用方法对两个整数求和并返回
public static void main(String[] args) {
int rs = add(100,200);
System.out.println("和是:" + rs);
System.out.println("--------------------");
int rs1 = add(400,800);
System.out.println("和是:" + rs1);
}
public static int add(int a , int b){
int c = a + b;
return c;
}
方法格式的注意点:
- 方法的修饰符,暂时都使用public static修饰。
- 方法神明了具体的返回值类型,内部必须使用return返回对应类型的数据。
- 形参列表可以有多个,甚至可以没有;如果有多个形参必须用" , "隔开,且不能给初始化值。
3、方法的其他写法 (无参数无返回值的方法)
方法定义时:返回值类型、形参列表可以按照需求进行填写
修饰符 返回值类型 方法名 (形参列表){
需要执行的功能代码)
return
}
无返回值类型,即返回值类型为void
示例:打印三遍HelloWord
public static void main(String[] args) {
//目标:学会方法定义的其他形式,并理解其流程
print();
System.out.println("------------------" );
print();
}
/**
无参数无返回值的方法
*/
public static void print(){
for (int i = 0 ; i < 3 ; i ++) {
System.out.println("Hello World");
}
}
注意:
- 如果方法不需要返回结果,返回值类型必须申明成void(无返回值),此时方法内部不可以使用return返回数据。
- 方法如果没有参数,或者返回值类型申明为void可以称为无参数、无返回值的方法,依次类推。
4、方法的常见问题
- 方法的编写顺序无所谓。
- 方法与方法之间是平级关系,不能嵌套定义。
- 方法的返回值类型为void(无返回值),方法内则不能使用return返回数据,如果方法的返回值类型。
- 写了具体类型,方法内部则必须使用return返回对应类型的数据。
- return语句下面,不能编写代码,因为永远执行不到,属于无效的代码。
- 方法不调用就不执行,调用时必须严格匹配方法的参数情况。
- 有返回值的方法调用时可以选择定义变量接收结果,或者直接输出调用,甚至直接调用;无返回值方法的调用只能直接调用一下。
5、方法的案例
1、需求:定义一个方法,方法中计算出1-n的和并返回。
public static void main(String[] args) { // 需求:定义一个方法,方法中计算出1-n的和并返回。 System.out.println("1-5的和是:" + sum(5)); System.out.println("-----------------------------"); System.out.println("1-100的和是:" + sum(100)); } public static int sum(int n ){ int sum = 0 ; for (int i = 1; i <= n ; i++) { sum += i; } return sum; }
2、需求:判断一个整数是奇数还是偶数,并进行结果的输出,使用方法完成。 拿一个整数,然后调用方法,把整数交给方法,在方法中输出该数是奇数还是偶数。
public static void main(String[] args) { //需求:判断一个整数是奇数还是偶数,并进行结果的输出,使用方法完成。 // 拿一个整数,然后调用方法,把整数交给方法,在方法中输出该数是奇数还是偶数 check(11); System.out.println("-----------------"); check(200); } public static void check(int number){ if (number % 2 == 0){ System.out.println(number + "是偶数"); }else{ System.out.println(number + "是奇数"); } }
3、需求:把找出数组的最大值案例,改造成方法,可以支持返回任意整型数组的最大值数据。
public static void main(String[] args) { //需求:把找出数组的最大值案例,改造成方法,可以支持返回任意整型数组的最大值数据。 int [] ages = {23 , 19 , 25 , 78 , 34}; int max = getArrayMaxData(ages); System.out.println("最大值数据是:" + max); } public static int getArrayMaxData(int [] arr){ // 找出数组的最大值返回 int max = arr [0]; //遍历数组的每个元素与最大值数据进行比较,若较大,则替换 for (int i = 1; i < arr.length; i++) { if (arr[i] > max ){ max = arr [i] ; } } return max ; }
4、写一个函数,接受一个整数,返回这个整数是几位数
public static void main(String[] args) { int number = 50000; System.out.println(number + ":这是一个" + place(number) + "位数"); } //3、写一个函数,接受一个整数,返回这个整数是几位数 public static int place (int num){ int place = 0; while (true){ num /= 10; place += 1; if (num == 0){ break; } } return place; }
5、写一个函数,判断一个整数是否是质数
public static void main(String[] args) { //4、 judgeNum(50);//判断50是否是质数 judgeNum(3);//判断3是否是质数 } //4、写一个函数,判断一个整数是否是质数 public static void judgeNum (int num){ //定义一个临时变量 int temp = 0; for (int i = 2; i <= num / 2; i++) { //判断这个数能否整除i的值 if (num%i ==0){ //能整除,则说明是质数,临时变量加1. temp ++; break; } } if (temp == 0 && num>1){ System.out.println(num + "这个数是质数"); }else{ System.out.println(num + "这个数不是质数"); } }
6、方法的调用流程
- 方法没有被调用的时候,在方法区中的字节码文件里存放
- 方法被调用的时候,需要进入到栈内存里运行
7、方法的参数
参数的类型:
形式参数:
方法声明(定义)的时候,就是形式参数
实际参数:
在调用的时候,实际传入的值,就是实际参数
Java中只能进行值传递。
即使传入的是引用类型数据,其实也传入的该引用的数据的内存地址,也称为值传递。
方法的参数传递机制:
- 基本类型的参数传递
理解java的基本类型的参数传递:值传递:在传输实参给方法的形参的时候,并不是传输实参变量本身,而是传输实参变量中存储的值。实参:如在方法内部定义的变量; 形参:如在定义方法时,“()”中所声明的参数。
- 引用类型的参数传递
理解引用类型的参数传递机制: 值传递,区分其不同点
- 基本类型和引用类型的参数在传递时候有什么不同?
1、都是值传递。
2、基本类型的参数传输存储的数据值。
3、引用类型的参数传输存储的地址值。
8、方法的参数传递机制(引用类型)案例:
1、打印任意整型数组的内容
public static void main(String[] args) {
// 需求:打印任意整型数组的内容
int[] ages = {10, 20, 30, 40};
printArray(ages);
System.out.println("-----------------");
int[] number = {1, 2, 3, 9, 10};
printArray(number);
System.out.println("-----------------");
int[] number1 = null;
printArray(number1);
}
public static void printArray(int [] arr){
System.out.print("[");
if (arr != null && arr.length >0){
for (int i = 0; i < arr.length; i++) {
// if (i == arr.length - 1){
// System.out.print(arr[i] );
// }else{
// System.out.print(arr[i] + ", ");
// }
System.out.print(i == arr.length - 1 ? arr[i] : arr[i] + ", ");//三元运算符
}
}
System.out.println("]");
}
2、设计一个方法可以接收整型数组,和要查询的元素值;最终返回元素在该数组中的索引,如果数组中不存在该元素则返回-1。
public static void main(String[] args) {
//需求:设计一个方法可以接收整型数组,和要查询的元素值;最终返回元素在该数组中的
// 索引,如果数组中不存在该元素则返回-1.
//定义数组,调用方法
int[] arr = {11, 22, 33, 66, 87, 19};
int index = searchIndex(arr,87);
System.out.println("您查询的数据的索引是: " + index);
}
/**
1、定义一个方法:参数接收数组,要查询的数据,返回值:整型
*/
public static int searchIndex(int [] arr , int data ){
//开始找出这个数据的索引
for (int i = 0; i < arr.length; i++) {
if (arr[i] == data){
return i;
}
}
return - 1 ;// 代表查无此元素。
}
3、如果两个数组的类型,元素个数,元素顺序和内容是一样的我们就认为这2个数组是一模一样的。使用方法完成:能够判断任意两个整型数组是否一样,并返回true或false。
public static void main(String[] args) {
//需求:如果两个数组的类型,元素个数,元素顺序和内容是一样的我们就认为这2个数组是一模一样的。
//使用方法完成:能够判断任意两个整型数组是否一样,并返回true或false。
int[]arr1 = {10,120,30};
int[]arr2 = {10,20,30};
System.out.println(campare(arr1, arr2));
}
//1、定义方法,接收2个整型数组,--》是否需要参数、返回值类型:布尔类型
public static boolean campare(int[]arr1,int[]arr2){
//2、判断两个数组的内容是一样的呢
if (arr1.length == arr2.length){
for (int i = 0; i < arr1.length; i++) {
if (arr1[i] != arr2[i]){
return false ;
}
}
return true; // 是一样的!
}else{
return false;
}
}
9、方法重载
- 方法重载:同一个类中,多个方法的名称相同,形参列表不同。
- 方法重载的前提是:在同一个类里,并且方法的名字一样。
在同一个类中。方法名必须相同,但是参数列表不同(参数的个数不同、参数的数据类型不同、参数的顺序不同(指的是参数的数据类型的顺序))- 方法重载的好处:对于相似功能的业务场景:可读性好,方法名称相同提示是同一类型的功能,通过形参不同实现功能差异化的选择。
- 案例1:
public class Test1 {
/*
定义类 Test1,类中定义 main方法,定义int类型a为10, b为10.
main方法中,调用printNum方法,传入a,b
main方法中,调用doubling方法,传入a,b
main方法中,调用printNum方法,传入a,b
main方法中,调用doubling方法,传入a,用a接收返回值
main方法中,调用doubling方法,传入b,用b接收返回值
main方法中,调用printNum方法,传入a,b
*/
public static void main(String[] args) {
int a = 10;
int b = 10;
printNum(a,b);
System.out.println("------------");
doubling(a,b);
System.out.println("------------");
printNum(a,b);
System.out.println("------------");
a = doubling(a);
System.out.println(a);
System.out.println("------------");
b = doubling(b);
System.out.println(b);
System.out.println("------------");
printNum(a,b);
}
/*
定义printNum方法,参数为(int iVar, int iVar2),返回值无,输出iVar和iVar2的值
*/
public static void printNum (int iVar,int iVar2){
System.out.println(iVar);
System.out.println(iVar2);
}
/*
定义doubling方法,参数为(int r, int p),返回值无,方法内r翻倍,p翻倍,并调用printNum方法,输出r和p的值
*/
public static void doubling (int r,int p){
r *= 2;
p *= 2;
printNum(r,p);
}
/*
定义doubling方法,参数为(int r),返回值int, 方法内r翻倍,返回r.
*/
public static int doubling (int r){
r *= 2;
return r;
}
}
- 案例2:
public static void main(String[] args) {
fire();
fire("岛国");
fire("岛国",100);
}
public static void fire(){
fire("米国");
}
public static void fire(String location){
fire(location,1);
}
public static void fire(String location ,int number){
System.out.println("默认发射" + number + "枚武器给" + location + "----");
}
- 方法重载的识别方法:
同一个类中,多个方法的名称相同,形参列表不同,其他无所谓。
形参列表的不同指的是:形参的个数、类型、顺序不同。不关心形参的名称。
// 新方法
public static void open(){}
// 重载方法
public static void open(int a ){}
//重载方法
static void open(int a , int b){}
//重载方法
public static void open(double a , int b ){}
// 重载方法
public static void open(int a, double b){}
//不是重载方法,是重复方法
//public void open(int i , double d){}
//新方法
public static void OPEN(){}
如果调用方法时的实参,同时满足多个重载方法,会优先调用类型更小的重载方法
10、补充知识:单独使用return关键字
return关键字单独使用:可以立即跳出并结束当前方法的执行;return关键字单独使用可以放在任何方法里。
示例:如果写一个除的方法,我们如果输入的分母为0,方法会出现bug!所以应该先判断分母是否等于0,如果等于0,就可以使用return直接结束当前的除的方法了。代码如下:
public static void main(String[] args) {
// 目标:明确return关键字的作用。
System.out.println("main开始。。");
chu(10,0);
System.out.println("main结束。。");
}
public static void chu(int a ,int b){
if (b == 0){
System.out.println("您输入的数据有问题,除数不能是0!!");
return;// 立即跳出当前方法并结束当前方法执行。然后还能执行下面的a/b。
}
//如果b等于0,a除b会出现bug。所以必须加一层判断b是否等于0。
int c = a / b;
System.out.println("结果是:" + c);
}
一dian小知识:
gui的界面来获取输入的值
把字符串变成整型
代码实现:
//gui的界面来获取输入的值
String numString = JOptionPane.showInputDialog("请输入一个整数:");
System.out.println(numString);
//把字符串变成整型
int num = Integer.parseInt(numString);
System.out.println(111==num);