成员方法
快速入门
- 添加speak成员方法,输出“我是一个好人”
- 添加cal01成员方法,可以计算从1+…+1000的结果
- 添加cal02成员方法,该方法可以接受一个数n,计算从1加到n的结果
- 添加getSum成员方法,可以计算两个数的和
import java.util.Scanner;
public class Method01{
public static void main(String[] args) {
Person p1 = new Person();
p1.speak();//调用方法
p1.cal01();
p1.cal02(5);//d调用方法,并给n = 5
int returnRes = p1.getSum(10, 20);
System.out.println("getSum 计算结果:" + returnRes);
}
}
class Person{
String name;
int age;
//public表示方法是公开,void表示方法没有返回值
//speak是方法名,()是形参列表
public void speak(){
System.out.println("我是一个好人");
}
public void cal01(){
int res = 0;
for (int i = 1; i <= 1000; i++) {
res += i;
}
System.out.println("cal01 计算结果 = " + res);
}
//(int n)表示当前有一个形参,可以接受用户输入
public void cal02(int n){
int res = 0;
for (int i = 1; i <= n; i++) {
res += i;
}
System.out.println("cal02 计算结果 = " + res);
}
//int表示方法执行后返回一个int
//(int num1, int num2)有两个形参,可以接受用户传入的两个数
//return res;表示把res的值返回
public int getSum(int num1, int num2){
int res = num1 + num2;
return res;
}
}
方法调用机制
- 当程序执行到方法时,就会开辟一个独立空间(栈空间)
- 当方法执行完毕,或者执行到return语句时,就会返回
- 返回到调用方法的地方(此时,之前用于执行方法的栈空间销毁)
- 返回后,继续执行方法后面的代码
- 当main方法(栈)执行完毕,整个程序退出(main栈空间销毁)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9jGKhx3K-1685258389357)(C:/Users/苏逸云/AppData/Roaming/Typora/typora-user-images/image-20230507162646500.png)]
成员方法的好处
- 提高代码的复用性
- 可以将实现的细节封装起来,然后供其他用户来调用
成员方法的定义
访问修饰符 返回数据类型 方法名(形参列表){//方法体
语句;
return 返回值;//return语句不是必须的,void就没有返回值
}
注意事项和使用细节
-
返回数据类型
- 一个方法最多有一个返回值(但是想要返回多个数据的话,可以将多个数组存入数组,返回数组)
- 返回类型可以为任意类型,包括基本类型和引用类型(数组,对象)
- 如果方法要求必须返回数据类型,则方法体中的最后执行语句必须为return;而且要求返回值类型必须和return中的值类型一致或相兼容
- 如果方法是void,则方法体中可以没有return语句,或者只写
return;
-
方法名
遵循驼峰命名法
-
形参列表
- 一个方法可以有0个参数,也可以有多个参数,中间用逗号隔开
- 参数类型可以是任意类型,包括基本类型和引用类型(数组,对象)
- 调用带参数的方法时,一定对应着参数列表,传入相同类型或兼容类型的参数
- 方法定义时的参数成为形式参数,简称形参;方法调用时的参数成为实际参数,简称实参。实参和形参的类型要一致或者兼容,个数顺序必须一致
-
方法体
里面写完成功能的具体的语句,可以作为输入、输出、变量、运算、分支、循环、方法调用,但里面不能再定义方法!,即方法不能嵌套定义
-
方法调用
-
同一个类中的方法调用:直接调用
-
跨类中的方法调用,A类调用B类方法:需要通过对象名调用。
eg. class A{ B b = new B(); b.print(); } class B{...}
-
特别说明一下,跨类的方法调用和方法的访问修饰符有关,以后细说
-
方法练习题
- 编写类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(4, 4, '#');
}
}
class AA{
/*编写类AA,有一个方法:判断一个数是奇数odd还是偶数,返回boolean*/
//1. 方法的返回类型:boolean
//2. 方法的名字:isOdd
//3. 方法的形参:(int num)\
//4. 方法体 判断
public boolean isOdd(int num){
/*if (num % 2 != 0) {
return true;
}else{
return false;
}
*/
//return num % 2 != 0 ? true; false;
return num % 2 != 0; //因为返回值是boolean,所以是真的就是返回true,假的就会返回false
}
//根据行、列,字符,打印对应行数和列数的字符。比如:行:4,列:4,字符#
//1. 方法的返回类型:void
//2. 方法的名字:print
//3. 方法的形参:(int row, int col, char c)
//4. 方法体 循环
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();
}
}
}
成员方法传参机制
-
基本数据类型,传递的是值拷贝,形参的任何改变不影响实参
-
案例
-
public void swap(int a, int b){}//形参再怎么改变,也不影响实参
-
-
引用数据类型,传递的是地址,可以通过形参改变实参
-
案例
-
public int[] test01(int[] a){}//引用类型 public void test02(Person p){}//形参改变实参
-
练习
public class MethodParameter01{
public static void main(String[] args) {
Person p = new Person();
p.name = "Jack";
p.age = 10;
B b = new B();
/*b.test01(p);
System.out.println("main p.age = " + p.age);//20000, 因为是引用数据类型*/
b.test02(p);
System.out.println("main p.age = " + p.age);//10, 因为test02里的p所在的是一个新的栈,它指向了null,但是main的p还指向堆
b.test03(p);
System.out.println("main p.age = " + p.age);//10, 因为test03里的p在堆开辟了一个新的空间,与main指向的堆空间无关
}
}
class Person{
String name;
int age;
}
class B{
public void test01(Person p){
p.age = 20000;
System.out.println("test 02 p.age = " + p.age);//20000
}
public void test02(Person p){
p = null;
}
public void test03(Person p){
p = new Person();
p.age = 20000;
}
}
克隆对象
编写一个方法copyPerson,可以复制一个Person对象,返回复制的对象。克隆对象,注意要求得到的新对象和原来的对象是两个独立的对象,只是他们的属性相同。
public class MethodParameter02{
public static void main(String[] args) {
Person p = new Person();
p.name = "Jack";
p.age = 10;
MyTools tool = new MyTools();
Person p2 = new Person();
p2 = tool.copyPerson(p);
System.out.println("p2 name:" + p2.name);
System.out.println("p2 age:" + p2.age);
//比较p和p2是否为同一个,false即不是同一个
System.out.println(p == p2);//false
}
}
class Person{
String name;
int age;
}
class MyTools{
/*编写一个方法copyPerson,可以复制一个Person对象,返回复制的对象。
克隆对象,注意要求得到的新对象和原来的对象是两个独立的对象,只是他们的属性相同。*/
public Person copyPerson(Person p){
Person p2 = new Person();
p2.name = p.name;
p2.age = p.age;
return p2;
}
}