秦疆的Java课程笔记:61-62 回顾方法的定义&回顾方法的调用

发布时间 2023-12-08 17:13:44作者: Acolyte_9527

61 面向对象 回顾方法的定义


62 面向对象 回顾方法的调用

  • 对于静态方法
//先写一个静态方法===========================
public class Student1 {  
    public static void say() {  
        System.out.println("学生说话了");  
    }  
}
//然后在主程序中调用==========================
public class Demo01 {  
    public static void main(String[] args) {  
        Student1.say();  
    }  
}
====效果如下====
学生说话了
  • 对于非静态方法
//先写一个非静态方法==========================
public class Student2 {  
    public void say() {  
        System.out.println("学生说话了");  
    }  
}
//在主程序中将非静态方法实例化=================
public class Demo02 {  
    public static void main(String[] args) {  
        new Student2().say();  
    }  
}
====效果如下====
学生说话了
  • 或者
public class Demo03 {  
    public static void main(String[] args) {  
	    //对象类型 对象名 = 对象值;
        Student3 student3 = new Student3();  
        student3.say();  
    }  
}
  • TIPS:IDEA中输入new Student();后,按alt+enter快捷键“引入局部变量”,则会自动生成语句Student student = new Student();

  • 静态方法调用静态方法,或者非静态方法调用非静态方法,都是没有问题的。

//静态调用静态===============================
public class Demo04 {  
    public static void main(String[] args) {  
    }  
    public static void a() {  
        b();  
    }  
    public static void b() {  
    }  
}
//非静态调用非静态============================
public class Demo05 {  
    public static void main(String[] args) {  
    }  
    public void a() {  
        b();  
    }  
    public void b() {  
    }  
}
  • 但是静态方法调用非静态方法会报错
public class Demo06 {  
    public static void main(String[] args) {  
    }  
    public static void a() {  
        b();   //报错“无法从static上下文引用非static方法”
    }  
    public void b() {  
    }  
}
  • 原因在于,静态方法是和类一起加载的,而非静态方法要类实例化之后才存在。

  • 形式参数和实际参数

public class Demo07 {  
    public static void main(String[] args) {  
        int add = Demo07.add(1,2);   //这里是实参  
        System.out.println(add);  
    }  
    public static int add(int a, int b) {   //这里是形参  
        return a+b;  
    }  
}
  • 关键:实际参数和形式参数的类型要对应

  • 值传递

public class Demo08 {  
    public static void main(String[] args) {  
        int a = 1;  
        System.out.println(a);  
        Demo08.change(1);  
        System.out.println(a);  
    }  
    //change方法的返回值为空  
    public static void change(int a) {  
        a = 10;  
    }  
}
====结果为====
1
1
  • 因为java中都是值传递,这里change方法中a的值并不会返回给main方法。

  • 引用传递,传递一个对象,本质还是值传递。

public class Demo09 {  
    public static void main(String[] args) {  
        Person person = new Person();  
        System.out.println(person.name);  
        Demo09.change(person);  
        System.out.println(person.name);  
    }  
    public static void change(Person person) {  
        person.name = "acolyte";  
    }  
}  
//定义一个Person类,有一个属性name  
class Person {  
    String name;  
}
====输出结果====
null   //此时Person类中name属性并未初始化。
acolyte   //经过change方法,person对象已经被赋值为acolyte
  • person.name = "acolyte";指向的是Person person = new Person();
  • 等之后讲解了对象和内存的问题,这个会更好理解一些。