Java_成员方法
基本介绍
在某些情况下,我们要需要定义成员方法(简称方法)。比如人类:除了有一些属性外( 年龄,姓名…),我们人类还有一些行为比如:可以说话、跑步…,通过学习,还可以做算术题。这时就要用成员方法才能完成。现在要求对 Person 类完善。
/*
1) 添加 speak 成员方法,输出 “我是一个好人”
2) 添加 cal01 成员方法,可以计算从 1+..+1000 的结果
3) 添加 cal02 成员方法,该方法可以接收一个数 n,计算从 1+..+n 的结果
4) 添加 getSum 成员方法,可以计算两个数的和
*/public class Method01{public static void main(String[] args){//方法使用//1. 方法写好后,如果不去调用(使用),不会输出//2. 先创建对象 ,然后调用方法即可Person p1 = new Person();p1.speak();p1.cal01();p1.cal02(5);p1.cal02(10);int returnRes = p1.getSum(10,20);System.out.println("getSum 方法返回值="+ returnRes);}
}class Person{String name;int age;//方法(成员方法)//添加 speak 成员方法,输出 “我是一个好人”//老韩解读//1. public 表示方法是公开//2. void : 表示方法没有返回值//3. speak() : speak 是方法名, () 形参列表//4. {} 方法体,可以写我们要执行的代码//5. System.out.println("我是一个好人"); 表示我们的方法就是输出一句话public void speak(){System.out.println("Hello,World!");}public void cal01(){int sum=0;for(int i = 0; i < 1001; i++){sum += i;}System.out.println("1到1000的和为:" + sum);}
//1. (int n) 形参列表, 表示当前有一个形参 n, 可以接收用户输入public void cal02(int rem){int sum = 0;for(int i = 0; i < rem+1; i++){sum += i;}System.out.println("1到"+rem+"的和为:" + sum);}
//1. public 表示方法是公开的
//2. int :表示方法执行后,返回一个 int 值
//3. getSum 方法名
//4. (int num1, int num2) 形参列表,2 个形参,可以接收用户传入的两个数
//5. return res; 表示把 res 的值, 返回public int getSum(int num1,int num2){int sum =0 ;sum = num1 + num2;return sum;}}
方法的调用机制原理
成员方法的好处
- 提高代码的复用性
- 可以将实现的细节封装起来,然后供其他用户来调用即可
public class Method02 {public static void main(String[] args) {int[][] map = {{0,1,0},{1,0,1},{1,1,1}};MyTools mytools = new MyTools();mytools.printArr(map);mytools.printArr(map);mytools.printArr(map);}
}class MyTools {public void printArr(int[][] map) {System.out.println("=====");for(int i = 0; i<map.length; i++){for (int j = 0; j<map[i].length; j++){System.out.print(map[i][j] + " ");}System.out.println();}}
}
成员方法的定义
- 形参列表:表示成员方法输入 cal(int n) , getSum(int num1, int num2)
- 返回数据类型:表示成员方法输出, void 表示没有返回值
- 方法主体:表示为了实现某一功能代码块
- return 语句不是必须的。
- 结合前面的题示意图, 来理解
注意事项和使用细节
-
访问修饰符 (作用是控制 方法使用的范围)
如果不写默认访问,[有四种: public, protected, 默认, private], 具体在后面说; -
返回数据类型
- 一个方法最多有一个返回值 [思考,如何返回多个结果 返回数组 ]
- 返回类型可以为任意类型,包含基本类型或引用类型(数组,对象)
- 如果方法要求有返回数据类型,则方法体中最后的执行语句必须为 “return 值”;
而且要求返回值类型必须和 return 的值类型一致或兼容; - 如果方法是 void,则方法体中可以没有 return 语句,或者 只写 return ;
- 方法名
遵循驼峰命名法,最好见名知义,表达出该功能的意思即可, 比如 得到两个数的和 getSum, 开发中按照规范
public class MethodDetail02 {public static void main(String[] args) {A a = new A();// a.sayOK();a.m1();}
}class A {//同一个类中的方法调用:直接调用即可;public void print(int n) {System.out.println("print()方法被调用了 n="+ n);}public void sayOK() { //sayOK调用 print(直接调用即可)print(10);System.out.println("继续执行sayOK()!");}// 跨类中的方法A类调用B类方法public void m1() {System.out.println("m1() 方法被执行");// 创建B对象,然后再调用方法即可;B b = new B();b.hi();System.out.println("m1() 继续被执行");}
}class B {public void hi() {System.out.println("B类中的 hi()被执行");}
}
java方法练习题
-
编写类 AA ,有一个方法:判断一个数是奇数 odd 还是偶数, 返回 boolean
-
根据行、列、字符打印 对应行数和列数的字符,比如:行:4,列:4,字符#,则打印相应的效果
老师建议:一定要自己写一遍,不要嫌太简单,不写的话,永远不知道自己在哪会掉坑里~~~~
public class MethodExercise01 {public static void main(String[] args) {AA a = new AA();if(a.isOdd(1)){System.out.println("是一个奇数");} else {System.out.println("是一个偶数");}a.print(20,30,'@');}}class AA {/*1) 编写类 AA ,有一个方法:判断一个数是奇数 odd 还是偶数, 返回 boolean1.返回类型:boolean2.方法名称:isOdd3.形参:(int num)4.方法体:if判断 或 三元运算符*/public boolean isOdd(int num) {/*if (num % 2 != 0){return true;} else {return false;}*/// return num % 2 != 0 ? true ; false;return num % 2 !=0;}/*2) 根据行、列、字符打印 对应行数和列数的字符,比如:行:4,列:4,字符#,则打印相应的效果一定要自己写一遍,不要嫌太简单1.返回类型:void2.方法名:print3.形参:(int row,int col,char c)4.方法体:for循环*/public void print(int row,int col,char c) {for (int i = 0;i < row ;i++){for(int j = 0; j < col; j++){System.out.print(c);}System.out.println();}}}
成员方法传参机制
方法的传参机制对我们今后的编程非常重要,一定要搞的清清楚楚明明白白。我们通过案例来学习
1.传参机制1
public class MethodParameter01 {public static void main(String[] args) {int a = 10;int b = 20;AA obj = new AA();obj.swap(a,b); //调用 swap;System.out.println("main方法中的 a b 值:"+ a + " " +b);// 10 20 因为形参不会影响主类中的数据类型;}
}class AA {public void swap(int a,int b) {System.out.println("交换前的a b值" + a + " " + b);// 10 20int tmp = a;a = b;b = tmp;System.out.println("交换后的a b值" + a + " " + b);// 20 10}
}
示意图
结论:
基本数据类型,传递的是值(值拷贝),形参的任何改变不影响实参!
2.传参机制2
- B 类中编写一个方法 test100,可以接收一个数组,在方法中修改该数组,看看原来的数组是否变化?会变化
public class MethodParameter02 {public static void main(String[] args) {/*B 类中编写一个方法 test100,可以接收一个数组,在方法中修改该数组,看看原来的数组是否变化?会变化*/int[] arr = {1,2,3};B b = new B();b.test100(arr);for(int i = 0; i< arr.length;i++){System.out.print(arr[i]+"\t");}}
}class B {public void test100(int[] arr) {arr[0] = 1000;for(int i = 0; i< arr.length;i++){System.out.print(arr[i]+"\t");}System.out.println();}
}
- B 类中编写一个方法 test200,可以接收一个 Person(age,sal)对象,在方法中修改该对象属性,看看原来的对象是否变化?会变化.
public class MethodParameter02 {public static void main(String[] args) {/*B 类中编写一个方法 test200,可以接收一个 Person(age,sal)对象,在方法中修改该对象属性,看看原来的对象是否变化?会变化.*/B b = new B();Person p = new Person();p.name = "jack";p.age = 20;b.test200(p);System.out.println("main 的 p.age = " + p.age);}
}
class Person{String name;int age;
}
class B {public void test200(Person p){p.age = 10000; //修改对象的属性;}
}
结论及示意图
引用类型传递的是地址(传递也是值,但是值是地址),可以通过形参影响实参!
请思考
在看一个案例,下面的方法会对原来的对象有影响吗?
p=null 和 p = new Person(); 对应示意图
最后输出的结果将是,p.age == 10;
克隆对象
- 编写一个方法 copyPerson,可以复制一个 Person 对象,返回复制的对象。克隆对象, 注意要求得到新对象和原来的对象是两个独立的对象,只是他们的属性相同
public class MethodExercise02 {public static void main(String[] args) {Person p = new Person();p.name = "milan";p.age = 100;//创建 toolsMyTools tools = new MyTools();Person p2 = tools.copyPerson(p);//到此 p 和 p2 是 Person 对象,但是是两个独立的对象,属性相同System.out.println("p 的属性 age=" + p.age + " 名字=" + p.name);System.out.println("p2 的属性 age=" + p2.age + " 名字=" + p2.name);//这里老师提示: 可以同 对象比较看看是否为同一个对象System.out.println(p == p2);//false}
}class Person {String name;int age;
}class MyTools {//编写一个方法 copyPerson,可以复制一个 Person 对象,返回复制的对象。克隆对象,//注意要求得到新对象和原来的对象是两个独立的对 象,只是他们的属性相同//// 编写方法的思路//1. 方法的返回类型 Person//2. 方法的名字 copyPerson//3. 方法的形参 (Person p)//4. 方法体, 创建一个新对象,并复制属性,返回即可public Person copyPerson(Person p) {//创建一个新的对象Person p2 = new Person();p2.name = p.name; //把原来对象的名字赋给 p2.namep2.age = p.age; //把原来对象的年龄赋给 p2.agereturn p2;}
}