秦疆的JavaSE课程笔记:61-62 面向对象 回顾方法的定义&回顾方法的调用
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();
。- 等之后讲解了对象和内存的问题,这个会更好理解一些。