一个方法用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("小猫喵喵叫");
}
}

Java的静态方法不能直接访问非静态方法和属性,因为它们在类加载时即被初始化,而非静态成员在对象创建后才存在。在静态方法内调用非静态成员需先创建对象,而在非静态方法中可以直接调用静态方法。main方法作为入口点,也是静态的。
752

被折叠的 条评论
为什么被折叠?



