1、静态方法中可以引用静态方法和静态变量,不可以引用非静态方法与变量。
这很好理解:因为静态方法不需要实例化类,可以直接用(类名.方法名)的方式调用。 假设静态方法可以操作非静态方法与变量,那么对于(类名.方法名)的这种方法调用方式, 那么其中的非静态变量就没有被实例化。(我们知道静态变量是不需要实例化的)。 老师上课的时候讲因为静态方法中没有this指针。
2、非静态方法中可以引用静态方法和静态变量(可以直接调用访问本类静态方法),也可以引用非静态方法与变量(可以直接调用访问本类非静态方法 )。
(1).类名.静态方法名或对象.方法名(在本类时。直接调用静态方法)
(2).对象名.非静态方法名
(3).静态方法在访问本类的成员时,只允许访问静态方法,不能访问非静态的方法,尽管非静态的方法内部又调用了静态的方法
public class StaticMethod {
//定义一个非静态方法
public void callMe2()
{
System.out.println("This is a nonstatic method");
}
//定义一个静态方法
public static void callMe() //静态方法
{
System.out.println("This is a static method");
}
public void Test(){
callMe(); //正确,可以直接调用访问本类静态方法
callMe2(); //正确,可以直接调用访问本类非静态方法
StaticMethod.callMe(); //调用静态对象无需创建对象,可以直接用“类名。方法名”访问
StaticMethod mob=new StaticMethod();
mob.callMe2(); //调用非静态的使用“对象。方法名”访问
}
public static void main(String[] args){
StaticMethod.callMe(); //静态方法在访问本类的成员时,只允许访问静态方法,在静态方法中不能调用非静态的方法和引用非静态的成员变量
callMe(); //正确,可以直接调用访问本类静态方法
//callMe2(); //静态方法在访问本类的成员时,只允许访问静态方法,所以不能直接访问callMe2();因为callMe2()是非静态的。
StaticMethod oa=new StaticMethod();
oa.Test(); //静态方法在访问本类的成员时,只允许访问静态方法,Test是非静态的,尽管Test内部又调用了静态的CallMe()
}
}
class Run{
public void RunTest(){
// callMe(); //错误
// callMe2(); //错误
StaticMethod.callMe(); //调用静态对象无需创建对象,可以直接用“类名。方法名”访问
//StaticMethod.callMe2(); //错误
StaticMethod ob=new StaticMethod();//调用非静态对象要先实例化对象
ob.callMe2(); //调用非静态的使用“对象。方法名”访问
}
public static void Run_main(String[] args){
StaticMethod.callMe(); //静态方法在访问本类的成员时,只允许访问静态方法,在静态方法中不能调用非静态的方法和引用非静态的成员变量
//StaticMethod.callMe2(); //静态方法在访问本类的成员时,只允许访问静态方法,所以不能直接访问callMe2();因为callMe2()是非静态的。
StaticMethod oa=new StaticMethod();
oa.callMe(); //调用静态对象无需创建对象,可以直接用“类名。方法名”访问,也可以使用“对象。方法名”访问
oa.callMe2(); //调用非静态的使用“对象。方法名”访问
oa.Test(); //静态方法在访问本类的成员时,只允许访问静态方法,Test是非静态的,尽管Test内部又调用了静态的CallMe()
}
}
3、子类不能重写父类的静态方法,但可以声明与该静态方法相同的方法,从而将父类的静态方法隐藏。
这让我联想起了记下的一个关于private 方法的经验:java私有方法(private)
public class ClassA {
private void method1(){
System.out.println("called ClassA's method1!!!");
}
static void method2(){
System.out.println("called ClassA's method2!!!");
}
}
class SubClassA extends ClassA{
void method1(){
System.out.println("called Sub's method1!!!");
}
static void method2(){
System.out.println("called Sub's method1!!!");
}
public static void main(String args[]){
SubClassA a=new SubClassA();
a.method1(); //SubClassA类中无法调用父类的method1,因为该方法为私有(private)
a.method2(); //该方法也是对父类中的静态方法的覆盖
}
}