21.回顾方法及加深----(静态和非静态方法)调用总结
1. 不同类之间的方法调用
创建两个类 Demo02 Student
//类:学生类
public class Student {
//学生类下面的方法:此方法为静态方法,因为加了static
public static void say(){//为啥不写参数啊!??
System.out.println("学生说话了");
}
//上面没写形参,下面写了形参 ,注意调用的区别
public static void say1(String a){//为啥写参数啊
System.out.println("学生又说话了");
}
//学生类下面的方法:此方法为非静态方法,因为没有加static
public void sleep(){
System.out.println("学生睡觉了");
}
}
public class Demo02 {
public static void main(String[] args){
System.out.println("Hello World !");
//***************** 静态方法的调用 ****************************
//静态方法 加了static
//调用法一:类名.方法名()调用
Student.say();
Student.say1("啊哈哈哈");//因为say1()方法里写了String形参,所以此处要给形参传递值
//***************** 非静态方法的调用 ****************************
//非静态方法 没有加static
//调用不能直接通过类名.方法名调用
//法:第一:实例化这个类 new
new Student();//new Student()就代表把这个类实例化了
new Student().sleep();//实例化之后就能 .sleep() 调用了
//法二:但是通常写成下面的方式
//万能公式:变量类型 变量名 = 变量的值;
//对象类型 对象名 = 对象的值;
Student student = new Student(); //也是把对象值变为实例化对象的过程
//然后调用 对象名.方法名();
student.sleep();
/** (适用非静态的方法)
* 理解:new Student() :把Student类 实例化了
* Student student = new Student(); 实例化之后,又赋值给了student这个对象
* 用student这个对象:所以student这个对象 可以通过 对象名.方法名()调用 。即: student.sleep();
* */
}
}
2. 同一个类下的方法调用
创建一个类,比如Demo03
public class Demo03 {
public static void main(String[] args){
System.out.println("Hello World !");
}
//定义两个普通静态方法a,b
//此时两静态方法c和d可以互相直接调用,也能被main方法直接调用
public static void a(){
b();
}
public static void b(){
a();
}
//定义两个普通非静态方法c,d
//此时两非静态方法a和b可以互相直接调用,但不能被main方法直接调用
public void c(){
d();
}
public void d(){
c();
}
//定义一个静态方法e,一个非静态方法f
//此时静态方法e不能直接调用非静态方法f ,但是非静态方法f可以直接调用静态方法e
public static void e(){
//f();不能直接调用
//类实例化之后才能调用 new
Demo02 demo02 = new Demo02();
demo02.f();
}
public void f(){
e();
}
/**
static 是和类一起加载的(时间片很早:当类存在的适合,它就存在了)
没有static的非静态方法f 是在类实例化之后才存在(是跟对象有关的,对象创建之后才存在)
所以已经存在了的e()方法 直接调用一个不存在的f()方法 会报错。
* 因为被static修饰的内容会跟随类的加载而加载,所以静态化内容可以不用实例化就能被直接调用
* 同时两静态方法之间也可以互相直接调用
* */
/**
* 因为被static修饰的内容会跟随类的加载而加载,所以静态化内容可以不用实例化就能被直接调用
* 同时两静态方法之间也可以互相直接调用
* */
/**
** static 静态方法是和类一起加载的,创建了类 它也就有了。而非静态方法还没创建,是不存在的。
* 所以存在的 调用不存在的 肯定不行的
* 非静态方法在 类实例化之后才存在
**/
/**
*静态方法只能直接调用静态方法(言外之意 静态方法可以间接调用非静态方法。如实例化),非静态方法可以调用静态方法
*/
}
3. 总
public class Demo20 {
public static void main(String[] args){
//调用同一类的静态方法
print();
//类名.方法名
Demo20.print();
//调用不同类的静态方法
//类名.方法名
Student.say();
Student.say1("abc");
//调用同一类的非静态方法
//法一
new Demo20().print1();
Demo20 demo20 = new Demo20();
//法二
demo20.print1();
//调用不同类的非静态方法
//法一
new Student().sleep();
Student student = new Student();
//法二
student.sleep();
}
public static void print(){
System.out.println("Hello");
}
public void print1(){
System.out.println("hello");
}
}