Java学习随笔-方法


方法的定义

public 返回数据类型 方法名 (形参列表..) {
//方法体
	语句;
	return 返回值;
}

注意:
1.形参列表:表示成员方法输入cal(int n),	getSum(int num1, int num2)

2.返回数据类型:表示成员方法输出,void表示没有返回值

3.方法主体:表示为了实现某一功能代码块

4.return语句不是必须的。

方法的调用机制

Java学习随笔-方法

方法使用细节

Java学习随笔-方法

Java学习随笔-方法

  • 在调用带参数的方法时,一定要对应着参数列表传入相同类型或兼容类型的参数
public class test01{
    public double f1(){
        double d1 = 1.1 * 3;
        int n = 100;
        return n; //int自动转换为double,编译通过
        //return d1; 这里就不行了,double不能转换为int,会报错!不能把高精度的转为低精度的
    }
}
  • 一个方法最多有一个返回值,那如何返回多个结果?返回一个数组就好了
public class test02{
    public void f3(int n1,int n2){
        int[] resArr = new int[2];
        resArr[0] = n1 + n2;
        resArr[1] = n1 - n2;
        return resArr;
    }
}
  • 方法不能嵌套定义!
public class test03{
    
    //错误:方法不能这样嵌套定义!
	public void m1(){
        public void m2(){ 
        }
    }
    
    //可以这样写:
    public void m3(){
       m4();
    }
    
    //在方法m3()外定义m4(),然后再m3里面调用方法m4()
    public void m4(){
        
    }
}

调用细节

Java学习随笔-方法

  • 同一个类中的方法调用:直接调用就好了
class Demo{
    //同一个类中的方法调用:直接调用即可
    public void print(int n){
        System.out.println("调用print()方法 n=" + n);
    }
    
    public void sayOk(){
        //sayOk调用 print
        print(10);
    }
}
  • 跨类中的方法A类调用B类方法:需要对象名调用
class B{
    public void hi(){
        System.out.println("B类中的hi(被执行)");
    }
}
class A{
    public void m1(){
        //创建B对象,然后再调用方法即可
        System.out.println("m1()方法被执行");
        B b = new B();
        b.hi();
        System.out.println("m1()方法继续执行");
    }
}

Java学习随笔-方法

public class test {
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        //创建AA对象 名字 obj
        AA obj = new AA();
        obj.swap(a,b); //调用swap
        System.out.println("main方法 a="+a+" b="+b);//这个输出什么??
        //输出 a=10 b=20,方法swap()没有改变main方法里的a和b,因为是值传递,具体原理如上图(在调用方法的时候会在栈区建立一个新的栈空间用于执行方法体,执行完之后销毁这个栈空间释放内存,从始至终都没有改变main中的a和b的地址,属于值传递,所以main中的a和b没有受到影响,System.out.println("main方法 a="+a+" b="+b)仍输出 a=10 b=20;
    }
}
public class AA {
    public void swap(int a,int b){
        System.out.println("/na和b交换前的值/n"+a+"/tb="+b);//a=10 b=20
        //完成了a和b的交换
        int tmp = a;
        a = b;
        b = tmp;
        System.out.println("/na和b交换后的值/na="+a+"/tb="+b);//a=20 b=10
    }
}

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


数组是引用数据类型(学C++时刻入DNA的一句话:数组名是数组的首地址,就是数组中第一个元素的地址,是常量

public class Test {
    public static void main(String[] args) {
        B b = new B();
        int[] arr = {1,2,3};
        b.test100(arr);//调用方法
        System.out.println(" main的 arr数组 ");
        //遍历数组
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]+"/t");//输出什么呢?
        }
        System.out.println();
    }
}
public class B {
    //B类中编写一个方法test100,
    //可以接收一个数组,在方法中修改该数组,看看原来的数组是否变化
    public void test100(int[] arr){
        arr[0] = 200;//修改元素
        //遍历数组
        System.out.println(" test100的 arr数组 ");
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]+"/t");//输出什么呢?
        }
        System.out.println();
    }
}

//输出
 test100的 arr数组
200		2		3
 main的 arr数组
200		2		3

Java学习随笔-方法

Java学习随笔-方法

//同理
 
class test{        
    //测试 
    public static void main(String[] args) {
        Person p = new Person();
        p.name = "jack";
        p.age = 10;
		B b = new B();
        b.test200(p);
        System.out.println("main 的p.age"+p.age);//肯定输出了10000
    }
}

class Person{
        String name;
    int age;
}
class B{
      public void test200(Person p){
        p.age = 10000; //修改了对象属性
    }
}

韩老师挖坑题

将上面B类 test200()方法里的 p.age = 10000 改成 p=null后,测试类test里面的main方法的System.out.println(“main 的p.age为”+p.age);输出的是什么???

class test{
    public static void main(String[] args) {
    Person p = new Person();
        p.name = "jack";
        p.age = 10;
		B b = new B();
        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;  
}

答案是:main 的p.age为10

方法的编写思路:

按下列顺序思路编写方法:

  1. 方法的返回类型
  2. 方法的名字
  3. 方法的形参
  4. 方法体

练习题:

编写一个方法copyPerson, 可以复制一个Person对象, 返回复制的对象。克隆对象,注意要求得到新对象和原来的对象是两个独立的对象,只是他们的属性相同。

public class MyTools{
    //编写一个方法copyPerson, 可以复制一个Person对象, 返回复制的对象。克隆对象,
    //注意要求得到新对象和原来的对象是两个独立的对象,只是他们的属性相同

/*       编写方法的思路:
        1. 方法的返回类型
        2. 方法的名字
        3. 方法的形参
        4. 方法体
*/
    public Person copyPerson(Person A){
       Person B = new Person();
       B.name = A.name;
       B.age = A.age;

       return B;
    }
}
public class Person {
    //编写一个方法copyPerson, 可以复制一个Person对象, 返回复制的对象。克隆对象,
    //注意要求得到新对象和原来的对象是两个独立的对象,只是他们的属性相同
    public String name;
    public int age;
}
public class Test {
    public static void main(String[] args) {
        MyTools test = new MyTools();
        Person I1 = new Person();
        I1.name = "芒特";
        I1.age = 25;
        Person I2 = test.copyPerson(I1);
        System.out.println("对象A的属性: 姓名:"+I1.name+" 年龄:"+I1.age);
        System.out.println("对象B的属性: 姓名:"+I2.name+" 年龄:"+I2.age);

    }
}
//结果:
对象A的属性: 姓名:芒特 年龄:25
对象B的属性: 姓名:芒特 年龄:25

以上是看韩顺平老师的Java课程做的随笔笔记

韩老师课程链接:https://www.bilibili.com/video/BV1fh411y7R8?spm_id_from=333.999.0.0&vd_source=a5cb5abf51083a337c47109ab202cc59

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/288709.html

(0)
上一篇 2022年9月11日
下一篇 2022年9月11日

相关推荐

发表回复

登录后才能评论