一个方法用static 修饰,便是静态方法或者类方法。
静态方法不属于特定对象。
由于static方法在加载class时首先完成,比构造方法早,此时非static的属性和方法还没有完成初始化。
所以:
在static方法内部无法直接调用非static的方法,可以通过先实例化对象,再通过该对象调用非static方法,
在非static方法中可以调用static方法,通过直接调用 方法名()或者 类名.方法名()。
public void show(){
//DuotaiTest.func(new Animal());
//等同于
func(new Animal());
}
注意:main方法也是static方法。
import javax.xml.catalog.Catalog; public class DuotaiTest { public static void main(String[] args){ //func(new Animal()); //func(new Cat()); //Error:(3, 9) java: 无法从静态上下文中引用非静态 方法 func(Animal) DuotaiTest t=new DuotaiTest(); /* t.func(new Animal()); System.out.println("------"); t.func(new Dog()); System.out.println("---------"); t.func(new Cat()); */ t.show(); } public static void func(Animal a){//Animal a=new Dog(); a.eat(); a.jump(); if(a instanceof Dog){ Dog d=(Dog) a; //((Dog) a).wang(); d.wang(); } if(a instanceof Cat){ Cat c=(Cat) a; c.catchMouse(); } if(a instanceof Animal){ System.out.println("大家都是动物"); } } public void show(){ //DuotaiTest.func(new Animal()); //等同于 func(new Animal()); } } class Animal{ String name; int age; public void eat(){ System.out.println("动物找吃的"); } public void jump(){ System.out.println("动物跳跳糖"); } } class Dog extends Animal{ public void eat(){ System.out.println("狗吃骨头"); } public void jump(){ System.out.println("狗急跳墙"); } public void wang(){ System.out.println("小狗汪汪叫"); } } class Cat extends Animal{ public void eat(){ System.out.println("猫吃鱼"); } public void jump(){ System.out.println("小猫爬墙"); } public void catchMouse(){ System.out.println("小猫喵喵叫"); } }