Java学习笔记 --- 成员方法

一、成员方法

基本介绍:

Java学习笔记 --- 成员方法_第1张图片

在某些情况下,我们需要定义成员方法(简称方法)比如人类:除了有一些属性外(年龄,姓名)

我们人类还有一些行为比如:可以说花,跑步,通过学习,还可以做算术题。这时就需要成员方法才能完成

案例演示:

public class Method01 {
	public static void main(String[] args) {
		//方法使用
        /*
        1、方法写好后,不去调用是没有效果的
        2、先创建对象,再调用方法即可
        */
		Person p1 = new Person();//创建对象
		p1.speak();//调用方法
		p1.cal01(); 
		p1.cal02(10);//调用cal02方法 同时给n赋值10
		p1.cal02(15);//可以多次调用方法
		//调用getSum,同时sum1=10 sum2=20
		//把方法getSum返回的值,赋给变量returnRes
		int returnRes = p1.getSum(10, 20);
		System.out.println("getSum返回的值=" + returnRes);
	}
}
class Person {
	String name;
	int age;
	//方法(成员方法)
    //public:表示方法公开
    //void:表示没有返回值
    //speak:表示方法名
    //():表示形参列表
    //{}:方法体,要执行的代码
    //System.out.println("这是一个人");:该方法输出的内容
    public void speak() {
        System.out.println("这是一个人");
    }
    //添加一个cal01 成员方法,可以计算从1+..+1000的结果
    public void cal01() {
    	//循环完成
    	int res = 0;
    	for(int i = 1; i <= 1000; i++) {
    		res += i;
    	}
    	System.out.println("1+..+1000的和=" + res);
    }
    public void cal02(int n) {
    	int res = 0;
    	for(int i = 1; i <= n; i++) {
    		res += i;
    	}
    	System.out.println("1+..+1000的和=" + res);
    }
    /*
    1.int 表示方法执行后,返回一个int值
    2.getSum 方法名
    3.(int num1, int num2)形参列表,2个形参,可以接收用户传入的两个数
    4.return res;表示把res的值,返回
    */
    public int getSum(int num1, int num2) {
    	int res = num1 + num2;
    	return res;
    }
}

二、方法调用机制

 三、方法的妙用

不使用方法遍历数组:

public class Method02 {
	public static void main(String[] args) {
	   int[][] map = {{0, 0, 1}, {1, 1, 1}, {1, 1, 3}};
       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();
        }


        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();
        }


        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();
        }
	}
}

代码冗余,可读性差,维护麻烦

使用方法遍历数组:

public class Method02 {
	public static void main(String[] args) {
	   int[][] map = {{0, 0, 1}, {1, 1, 1}, {1, 1, 3}};
       MyTools tool = new MyTools();
       //多次调用方法即可
       tool.printArr(map);
       tool.printArr(map);
       tool.printArr(map);
	}
}
//把输出的功能,写到一个类方法中,然后调用该方法即可
class MyTools {
    //方法,接收一个二维数组
    public void printArr(int[][] map) {
        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();
        }
    }
}

提高了代码的复用性

将实现的细节封装起来,供其他用户调用就行

四、方法的注意事项和使用细节

1、访问修饰符(控制方法使用范围)

当不写访问修饰符时使用默认修饰符,主要有四种(public,protected,默认,private)

2、返回数据类型

1、一个方法最多有一个返回值,当要返回多个结果,使用数组。

2、返回类型可以为任意类型,包括基本类型或引用类型(数组,对象)

案例演示:

public class MethodDetail {
    public static void main(String[] args) {
        AA a = new AA();
        int[] res = a.geta(1, 4);
        System.out.println("和=" + res[0]);
        System.out.println("差=" + res[1]);

    }
}
class AA {
    //一个方法最多有一个返回值,如何返回多个结果,使用数组
    public int[] geta(int n1, int n2) {
        int[] resArr = new int[2];
        resArr[0] = n1 + n2;
        resArr[1] = n1 - n2;
        return resArr;
    }
}

3.方法要求有返回数据类型, 则方法体中最后的执行语句必须为return值;而且要求返回值类型必须和return的值类型一致或兼容

案例演示:

 public double a(){
        double a = 1.1;
        int n = 1;
        return a; //ok
        return 1.1;//ok
        return n;//ok 会自动进行类型转换
    }

4.如果方法是void,则方法体重可以没有return语句,或者只写return

案例演示:

public void aa(){
        return; //可以写return,但是不能返回数据类型
    }

3、方法名

遵循驼峰命名法,最好见名知意。

4、形参列表

1.一个方法可以有0个参数,也可以有多个参数,中间用逗号隔开,比如arr(int n1, int n2)

2.参数类型可以为任意类型,包含基本类型或者引用类型,比如arr(int[][] map)

3.调用参数的方法时,一定对应着参数列表传入相同类型或者兼容类型的参数

4.方法定义时的参数称为形式参数,简称参数;方法调用时的参数称为实际参数,简称实参,实参和形参的类型要一致或兼容、个数、顺序必须一致!

5、方法体

完成功能的具体语句,可以是输入、输出、变量、运算、分支、循环、方法调用,但不允许方法里面再定义方法。即:方法不能嵌套定义。

案例演示:

public void a(){
        public void b(){ //编译就报错
            
        }
    }

6、方法细节调用说明

1、同一个类中的方法调用,直接调用就行。

案例演示:


public class MethodDetail {
    public static void main(String[] args) {
        A a = new A();
        a.say();

    }
}
class A {
    //同一个类中的方法调用,直接调用就行。
    public void print(int n) {
        System.out.println("print()方法被调用 n=" + n);
    }

    public void say() {//say调用 print 直接调用
        print(10);
        System.out.println("继续执行say");
    }
}

2、跨类中的方法A类调用B类的方法,需要通过对象名调用

案例演示:

public class Method4 {
    public static void main(String[] args) {
        B b = new B();
        b.b1();
 
    }
}
class A{
    public void m1(){
        System.out.println("m1方法被调用");
         //先创建B对象,再调用方法
        B b = new B();
        b.b1();
    }
}
class B{
    public void b1(){
       System.out.println("b1方法调用");
    }
}

五、成员方法练习

1.编写一个类,有一个方法判断一个数是奇数还是偶数,返回Boolean。

import java.util.Scanner;
public class MethodExercise01 {
	public static void main(String[] args) {
		Scanner myScanner = new Scanner(System.in);
		AA a = new AA();
		System.out.println("请输入一个数");
		int arr = myScanner.nextInt();
		if(a.bb(arr)) {
			System.out.println("这个数是偶数");
		}else {
			System.out.println("这个数是奇数");
		}
	}
}
// 创建一个类
class AA {
	// 创建一个新方法
	public boolean bb(int n) {
		// if(n % 2 != 0) {
		// 	return true;
		// }else {
		// 	return false;
		// }  可以简化

		// return n % 2 != 0 ? true; false;  再简化
		return n % 2 == 0;
	}
}

2.根据行、列、字符打印对应行数和列数的字符。

import java.util.Scanner;
public class MethodExercise02 {
	public static void main(String[] args) {
		Scanner myScanner = new Scanner(System.in);
		AA a = new AA();
		System.out.println("请输入行");
		int arr = myScanner.nextInt();
		System.out.println("请输入列");
		int brr = myScanner.nextInt();
		System.out.println("请输入需要打印的字符");
		char crr = myScanner.next().charAt(0);
		System.out.println("===开始打印===");
		a.bb(arr, brr, crr);
	}
}
// 创建一个类
class AA {
	// 创建一个新方法
	// 思路
	// 1.方法的返回类型 void
	// 2.方法的名字
	// 3.方法的形参
	// 4.方法体,循环
	public void bb(int n, int m, char c) {
		for(int i = 0; i < n; i++) {
			for(int j = 0; j < m; j++) {
				System.out.print(c + " ");
			}
			System.out.println();//换行
		}
	}
}

六、成员方法传参机制

1.基本数据类型传参

基本数据类型,传递的是值(值拷贝),形参的任何改变不影响实参。

案例演示:

public class MethodParameter01 {
	public static void main(String[] args) {
		int a = 1;
		int b = 2;
		// 创建AA的对象
		AA aa = new AA();
		aa.swap(a, b); 

		System.out.println("main方法中的值a=" + a + "\tb=" + b);
	}
}
// 创建一个类
class AA {
	public void swap(int a, int b) {
		System.out.println("\na和b交换前的值\na=" + a + "\tb=" + b);
		//完成了a和b的交换
		int tmp = a;
		a = b;
		b = tmp;
		System.out.println("\na和b交换后的值\na=" + a + "\tb=" + b);
	}
}

2.引用类型传参

 引用数据类型传递的是地址(传递也是值,但是值是地址),可以通过形参影响实参。

案例演示:

public class MethodParameter02 {
	public static void main(String[] args) {
		//测试
		B b = new B();
		int[] arr = {1, 2, 3};
		b.test(b);

		for(int i = 0; i < arr.length; i++) {
			System.out.print(arr[i] + " ");//输出结果200 2 3
		}
		System.out.println();
	}
}
// 创建一个类
class B {
	public void test(int[] arr) {
		arr[0] = 200;//修改元素
		for(int i = 0; i < arr.length; i++) {
			System.out.print(arr[i] + " ");//输出结果200 2 3
		}
		System.out.println();
	}
}

案例演示2:

对象属性也会影响

public class Method {
    public static void main(String[] args) {
        Persons p = new Persons();
        p.name = "jcak";
        p.age = 10;

        B b = new B();
        b.test(p);
        System.out.println("main方法中的年龄为:" + persons.age);
    }
}
class Persons{
    String name;
    int age;
}
class B{
    public void test(Persons p){
        p.age = 100;//修改对象属性
    }
}

七、成员方法传参机制练习

1.编写类Mytools类,编写一个方法可以打印二维数组的数据

public class MethodExercise03 {
	public static void main(String[] args) {
		MyTools a = new MyTools();
		int[][] aa = {{1, 1, 1}, {2, 2, 2}, {3, 3, 3}}; 
		a.bb(aa);
	}
}
// 创建一个类
class MyTools {
	// 创建一个新方法,接收二维数组
	public void bb(int[][] map) {
		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();//换行
		}
	}
}

2.编写一个方法copyPerson,可以复制一个Person对象,返回复制的对象。克隆对象,

注意要求得到新的对象和原来的对象是两个独立的对象,只是他们属性相同

public class MethodExercise04 {
	public static void main(String[] args) {
		/*
		编写一个方copyPerson,可以复制一个Person对象,返回复制的对象。克隆对象
		注意要求得到的新对象和原来的对象是两个独立的对象,只是他们的属性相同
		*/
		Person p = new Person();
		p.name = "jack";
		p.age = 10;
		//创建tools
		MyTools tools = new MyTools();
		Person p2 = toosl.copyPerson(p);

		//到此p和p2是Person的对象,但是是两个独立的对象,属性相同
		System.out.ptintln("P的属性 age=" + p.age + "名字=" + p.name);
		System.out.ptintln("P2的属性 age=" + p2.age + "名字=" + p2.name);
		//可以通过对象比较看看是否为同一个对象
		System.out.ptintln(p == p2);
	}
}
// 创建一个类
class Person {
	String name;
	int age;
}

class MyTools {
	// 编写思路
	// 1.方法的返回类型 Person
	// 2.方法的名字copyPerson
	// 3.方法的形参(Person p)
	// 4.方法体,创建一个新对象,并复制属性,返回即可
	public Person copyPerson(Person p) {
		Person p2 = new Person();
		p2.name = p.name;
		p2.age = p.age;
		return p2;
	}

}

你可能感兴趣的:(java基础学习,学习,java)