JAVA20231215
201202203204205206207208成员方法
基本介绍:在某些情况下,我们需要定义成员方法(简称方法)。比如人类:除了有一些属性外(年龄,姓名…),我们人类还有一些行为比如:可以说话、跑步…,通过学习,还可以做算术题。这是就要用成员方法才能完成。现在要求对Person类完善。
方法快速入门:Method01.java
public class Method01{
public static void main(String[] args){
//需求分析:
//1.添加speak成员方法,输出“我是一个好人”
//2.添加cal01成员方法,可以计算从1+...+1000的结果
//3.添加cal02成员方法,该方法可以接收一个数n,计算从1+...+n的结果
//4.添加getSum成员方法,可以计算两个数的和
//思路分析:
//先创建一个类,再创建一个对象 class Person Person p1 = new Person()
//在类中添加方法 public void speak()
//通过对象调用方法 p1.speak()
//代码实现:
Person p1 = new Person();
p1.speak();
p1.cal01();
p1.cal02(1000);
p1.getSum(1,2);
//使用int变量 res来接收返回的sum
int res = p1.getSum1(3,4);
System.out.println("3 + 4的结果为:" + res);
}
}
//创建一个类
class Person{
//方法 = 访问修饰符 + 返回值 + 方法名() + 方法体
//方法中 public 为访问修饰符 void代表没有返回值 speak(),speak为方法名括号中填形参 {}中括号中为方法体
public void speak(){
System.out.println("我是一个好人");
}
public void cal01(){
int sum = 0;
for(int i = 1 ;i <= 1000;i++){
sum += i;
}
System.out.println("从1+...+1000的结果为" + sum);
}
public void cal02(int j){
int sum = 0;
for(int i = 1;i <= j;++i){
sum += i;
}
System.out.println("您计算的1+...+" + j + "的结果为" + sum);
}
public void getSum(int i,int j){
System.out.println("计算的" + i + "+" + j + "的和为" + (i+j));
}
// 若返回值为int
public int getSum1(int i,int j){
int sum = i + j;
return sum;//将sum的值返回,对象调用时需要有一个int变量接收
}
}
方法的调用机制原理:(!!!)
画出程序执行过程
为什么需要成员方法:看一个需求 Method02.java
public class Method02{
public static void main(String[] args){
//为什么需要方法呢?
//看一个需求
//假如要对一个二维数组arr遍历100次
int [][]arr = {{1,2,3},{4,5,6},{7,8,9}};
//传统方法
for(int i = 0;i < arr.length;i++){
for(int j = 0;j < arr[i].length;j++){
System.out.println(arr[i][j]);
}
}
for(int i = 0;i < arr.length;i++){
for(int j = 0;j < arr[i].length;j++){
System.out.println(arr[i][j]);
}
}
for(int i = 0;i < arr.length;i++){
for(int j = 0;j < arr[i].length;j++){
System.out.println(arr[i][j]);
}
}
//.....很麻烦
//使用方法
MethodImport m1 = new MethodImport();
m1.arrExercise();
}
}
class MethodImport{//创建一个类
public void arrExercise(){
int [][]arr = {{1,2,3},{4,5,6},{7,8,9}};
for(int i = 0;i < arr.length;i++){
for(int j = 0;j < arr[i].length;j++){
System.out.println(arr[i][j]);
}
}
}
}
由此可见方法可以提到代码的复用性,提高效率
成员方法的好处:
- 提高代码的复用性
- 可以将实现的细节封装起来,然后供其他用户来调用即可
成员方法的定义:
格式:
访问修饰符(public、protected、默认、private) 返回数据类型 方法名(形参列表…){//方法体
语句;
return 返回值;
}
- 形参列表:表示成员方法输入cal(int n) getSum(int num1 , int num2)
- 返回数据类型:表示成员方法输出,void表示没有返回值
- 方法主体:表示为了实现某一功能代码块
- return 语句不是必须的
成员方法注意事项和使用细节:
public class MethodDetail{
public static void main(String[] args){
AA a = new AA();
int []res = a.getSumAndSub(1,4);
System.out.println("和 = " + res[0]);
System.out.println("差 = " + res[1]);
//细节:调用带参数的方法时,一定对应着参数列表传入相同类型或兼容类型的参数
byte b1 = 1;
byte b2 = 2;
a.getSumAndSub(b1,b2);//byte -> int
//a.getSumAndSub(1.1,1.8);//double -> int(×)
//细节:实参和形参的类型要一致或兼容、个数、顺序必须一致
//a.getSumAndSub(100);//× 个数不一致
a.f3("tom",10);//√
//a.f3(100,"jack");//实际参数和形式参数顺序不对
}
}
class AA{
//细节:方法不能嵌套定义
public void f4(){
//错误
//public void f5(){
//}
}
public void f3(String str,int n){
}
//1.一个方法最多有一个返回值[思考,如何返回多个结果 返回数组]
public int []getSumAndSub(int n1,int n2){
int []resArr = new int [2];
resArr[0] = n1 + n2;
resArr[1] = n1 - n2;
return resArr;
}
//2.返回类型可以为任意类型,包含基本类型或引用类型(数组,对象)
//具体看 getSumAndSub
//
//3.如果方法要求有返回数据类型,则方法体中最后的执行语句必须为return值;
//而且要求返回值类型必须和return的值类型一致或兼容
public double f1(){
double d1 = 1.1*3;
int n = 100;
return n;//int -> double(√)
//return d1;
}
//如果方法时void,则方法体中可以没有return语句,或者只写return;
//在实际工作中,我们的方法都是为了完成某个功能,所以方法名要有一定含义,最好是见名知义
public void f2(){
System.out.println("hello1");
System.out.println("hello1");
System.out.println("hello1");
int n = 10;
//return;
}
}
访问修饰符(作用是控制 方法使用的范围)
如果不写就是默认访问[有四种:public、protected、默认、private]
返回数据类型
- 一个方法最多有一个返回值[思考,如何返回多个结果 返回数组]
- 返回类型可以为任意类型,包含基本类型或引用类型(数组、对象)
- 如果方法要求有返回数据类型,则方法体中最后的执行语句必须为return值;而且要求返回值类型一致或兼容
- 如果方法时void,则方法体中可以没有return语句,或者只写return
方法名
遵循驼峰命名法,最好见名知义,表达出该功能的意思即可,比如 得到两个数的和getSum开发中按照规范
形参列表
- 一个方法可以有0个参数,也可以有多个参数,中间用逗号隔开,比如getSum(int n1,int n2)
- 参数类型可以为任意类型,包含基本类型或引用类型,比如printArr(int [] []map)
- 调用带参数的方法时,一定对应着参数列表传入相同类型或兼容类型的参数
- 方法定义时的参数称为形式参数,简称形参;方法调用时的传入参数称为实际参数,简称实参,实参和形参的类型要一致或兼容、个数、顺序必须一致
方法体
里面写完成功能的具体语句,可以为输入、输出、变量、运算、分支、循环、方法调用,但里面不能再定义方法!即:方法不能嵌套定义
方法调用细节说明(!!!)
- 同一个类中的方法调用:直接调用即可。
- 跨类中的方法A类调用B类方法:需要通过对象名调用。
- 特别说明:跨类的方法调用和方法的访问修饰符相关
209类的完善
方法练习题
MethodExercise01.java
- 编写类 AA ,有一个方法:判断一个数是奇数 odd 还是偶数, 返回 boolean
- 根据行、列、字符打印 对应行数和列数的字符,比如:行:4,列:4,字符#,则打印相应的效果
public class MethodExercise01{
public static void main(String[ ] args){
//需求分析:
//1.编写类AA,有一个方法:判断一个数是奇数odd还是偶数,返回boolean
//2.根据行、列、字符打印对应行数和列数的字符,比如:行:4,列:4,字符:#则打印相应的效果
//思路分析:
//1.创建一个类AA 方法为public 返回类型为boolen 方法名为oddOrNo
//2. 方法为public 返回类型为void 方法名为print
//代码实现
AA a1 = new AA();
if(a1.oddOrNo(6)){
System.out.println("经判断这个数为偶数");
}else{
System.out.println("经判断这个数为奇数");
}
AA a2 = new AA();
a2.print(4,4,'#');
}
}
class AA{
public boolean oddOrNo(int i){
if(i % 2 == 0){
return true;
}else{
return false;
}
}
public void print(int line,int cloumn,char c){
int [][]arr = new int[line][cloumn];
for(int i = 0;i < line;i++){
for(int j = 0;j < cloumn;j++){
System.out.print(c);
}
System.out.println();
}
}
}
210成员方法传参机制
基本数据类型的传参机制
看一个案例,分析结果是什么?
public void swap(int a,int b){
int temp = a;
a = b;
b = temp;
System.out.println("a = " + a + "\tb = " + b);
}
结论及示意图:
基本数据类型,传递的是值(值拷贝),形参的任何改变不影响实参!