静态方法(static method)
先从一道笔试题说起
关于Java中的静态方法,下列说法哪些是正确的()
A:静态方法是一个属于类而不属于对象(实例)的方法。(√)
静态方法可以在没有创建对象实例的情况下调用,其是可以通过类名引用。
B:静态方法只能访问静态数据。无法访问非静态数据(实例变量)。(√)
它这边的意思是不能直接访问非静态数据(实例变量),因为非静态数据是属于对象属性的,其只有在对象存在的时候才能引用。
C:静态方法只能调用其他静态方法,不能从中调用非静态方法。(√)
这里也是不能直接调用非静态方法,因为非静态方法是属于某个对象的,不先实例化对象,通过对象引用,那么将无法判断具体调用哪个对象(实例)的非静态方法。
D:静态方法不能通过类名直接访问,也不需要任何对象。(×) 静态方法可以直接用类名访问。
类名.静态方法名() 这种方式是可以的,所以静态方法可以直接通过类名进行访问。
简单总结
先总结:
- (1)静态方法中不可以直接引用实例方法(非静态方法)或实例成员变量(非静态变量);
静态方法中引用实例方法、实例变量,须先实例化对象,然后通过 对象名.实例变量名 和 对象名.实例方法名( )
- (2)静态方法、实例方法(非静态方法)都可以引用静态变量、静态方法;
- 如果在不同类中,则是通过 类名.静态变量名 和 类名.静态方法名( ) 的方式引用;
- 如果是在同一个类中,则可以省略类名;
当然,要想其他类能引用其静态变量、静态方法,则其不能将这些变量、方法设置为private。
- (3)实例方法(非静态方法)中引用实例变量、其他实例方法;
- 如果在不同类中,则需要先实例化对象,通过对象进行引用;
- 如果在同一个类中,则直接引用即可;
- (4)引用(调用)静态方法的方式有两种:
- 类名.静态方法名( )
- 先实例化一个对象,然后通过 对象名.静态方法名( )
- (5)静态方法中不能使用 this 和 super ,而实例方法可以;
具体案例
通过下面的案例,可以对上面所述内容有个更加清晰的认识。
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
如果错误,欢迎指正!谢谢!