Java中的静态方法、静态变量以及实例方法、实例变量

静态方法(static method)

先从一道笔试题说起

关于Java中的静态方法,下列说法哪些是正确的()
A:静态方法是一个属于类而不属于对象(实例)的方法。(√)

静态方法可以在没有创建对象实例的情况下调用,其是可以通过类名引用。

B:静态方法只能访问静态数据无法访问非静态数据(实例变量)。(√)

它这边的意思是不能直接访问非静态数据(实例变量),因为非静态数据是属于对象属性的,其只有在对象存在的时候才能引用。

C:静态方法只能调用其他静态方法,不能从中调用非静态方法。(√)

这里也是不能直接调用非静态方法,因为非静态方法是属于某个对象的,不先实例化对象,通过对象引用,那么将无法判断具体调用哪个对象(实例)的非静态方法。

D:静态方法不能通过类名直接访问,也不需要任何对象。(×) 静态方法可以直接用类名访问。

类名.静态方法名() 这种方式是可以的,所以静态方法可以直接通过类名进行访问。

简单总结

先总结:

  • (1)静态方法中不可以直接引用实例方法(非静态方法)或实例成员变量(非静态变量);

静态方法中引用实例方法、实例变量,须先实例化对象,然后通过 对象名.实例变量名 对象名.实例方法名( )

  • (2)静态方法、实例方法(非静态方法)都可以引用静态变量、静态方法;
    • 如果在不同类中,则是通过 类名.静态变量名类名.静态方法名( ) 的方式引用;
    • 如果是在同一个类中,则可以省略类名

当然,要想其他类能引用其静态变量、静态方法,则其不能将这些变量、方法设置为private。

  • (3)实例方法(非静态方法)中引用实例变量、其他实例方法;
    • 如果在不同类中,则需要先实例化对象,通过对象进行引用;
    • 如果在同一个类中,则直接引用即可;
  • (4)引用(调用)静态方法的方式有两种:
    • 类名.静态方法名( )
    • 先实例化一个对象,然后通过 对象名.静态方法名( )
  • (5)静态方法中不能使用 thissuper ,而实例方法可以;

具体案例

通过下面的案例,可以对上面所述内容有个更加清晰的认识。

StaticMethodTest1

package com.yuan.test;

public class StaticMethodTest1 { 
    private static int staticVariable;//静态成员变量
    public static int publicStaticVariable;
    protected static int protectedStaticVariable;
    private int instanceVariable;//实例成员变量(非静态成员变量)

    public static void staticMethod1(){ 
        staticVariable = 166;//静态方法中引用静态变量
        publicStaticVariable = 101;
        protectedStaticVariable = 102;
        System.out.println("StaticMethodTest1's staticVariable ="+staticVariable);
        /* Non-static field 'instanceVariable' cannot be referenced from a static context 不能从静态上下文中引用非静态变量 */
        //instanceVariable = 555;

        /* Non-static method 'instanceMethod()' cannot be referenced from a static context 不能从静态上下文中引用非静态方法(实例方法)的 */
        //instanceMethod1();

        staticMethod2();//在当前类中的静态方法中调用当前类的其它静态方法(可省略类名)
    }

    public void instanceMethod1(){ 
        // 实例方法(非静态方法)中是可以引用非静态变量(实例成员变量)的
        instanceVariable = 100;
        // 实例方法也可以引用静态变量
        staticVariable = 177;
    }

    public static void staticMethod2(){ 
        staticVariable = 188;
    }

    public static void main(String[] args){ 
        StaticMethodTest1 staticMethodTest1 = new StaticMethodTest1();
        staticMethodTest1.instanceMethod1();
        // main方法是典型的静态方法,所以引用实例变量须通过实例对象
        System.out.println(staticMethodTest1.instanceVariable);
        System.out.println(staticVariable);

        staticMethod1();//在当前类中调用静态方法,可以省略类名
        System.out.println(staticVariable);
        System.out.println(publicStaticVariable);
        System.out.println(protectedStaticVariable);
    }
}

运行后结果为:

100
177
StaticMethodTest1's staticVariable =166
188
101
102

StaticMethodTest2

package com.yuan.test;

public class StaticMethodTest2 { 
    private static int staticVariable;
    public static int publicStaticVariable;

    public static void staticMethod1(){ 
        // 通过类名直接引用StaticMethodTest1类的静态方法staticMethod1
        // 引用其他类的静态方法(类名.静态方法名())
        StaticMethodTest1.staticMethod1();
        // 修改当前类中的静态变量,可以省略类名
        staticVariable = 222;
        publicStaticVariable = 221;
        // 修改其它类中的静态变量(类名.静态变量名),注意:其它类的静态变量不能是private的
        StaticMethodTest1.publicStaticVariable = 201;
        StaticMethodTest1.protectedStaticVariable = 202;
        // 除了可以使用类名直接调用静态方法,还可以通过实例对象调用静态方法
        StaticMethodTest1 staticMethodTest1 = new StaticMethodTest1();
        staticMethodTest1.staticMethod1();//会将其publicStaticVariable、protectedStaticVariable 的值又改回101、102 
    }

    public static void main(String[] args){ 
        staticMethod1();
        // 引用其他类的静态变量(类名.静态变量名)
        System.out.println(StaticMethodTest1.publicStaticVariable);
        System.out.println(StaticMethodTest1.protectedStaticVariable);
        // 引用当前类的静态变量
        System.out.println(publicStaticVariable);
    }

}

运行结果为:

StaticMethodTest1's staticVariable =166
StaticMethodTest1's staticVariable =166
101
102
221

如果错误,欢迎指正!谢谢!

参考:
java 调用静态方法和实例(对象)方法的区别

    原文作者:你的代码有灵魂吗?
    原文地址: https://blog.csdn.net/yuanziwoxin/article/details/97613443
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞