文章开头引用一下《java 编程思想》里面的一段话:
“static 方法就是没有 this 的方法。在 static 方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用 static 方法。这实际上正是 static 方法的主要用途。”
一、static 与 java 的加载机制的关系
static 关键字可以用来修饰成员变量和方法,还可以用来构建 static 语句块。首先我们来看 static 与类加载机制之间的关系:static 修饰的成员变量和方法会在类加载的时候就加载出来,所以我们可以用 类名.变量(方法)名来调用相应的变量(方法),而普通的成员变量则不然,普通的成员变量是在实例加载的时候才被加载出来而实例的加载是在类的加载之后发生的,我们不能在实例被加载出来之前去调用实例里面的变量和方法,这也就解释了为什么不能在 static 方法中引用非 static 变量和方法
static 成员变量和普通成员变量:
package com.my.testStatic;
public class TestStatic {
public static String pstring="先一步被加载";
public String lstring="后一步被加载";
public static void main(String[] args) {
System.out.println(TestStatic.pstring);
TestStatic test=new TestStatic();
System.out.println(test.lstring);
}
}
程序的输出是:(java>> 后面的是原样输出,之所以用 java>> 是排版美观的需要)
java>> 先一步被加载
java>> 后一步被加载
二、static 对访问权限的影响
首先给出关键字和对应的访问权限
修饰词本类同一个包的类继承类*********************其他类
private √ × × ×
无(默认) √ √ √(在同一个包中)×(不在同一个包中) ×
protected √ √ √ ×
public √ √ √ √
static 对访问权限的影响无非就两种:
1、扩大了访问权限
2、缩小了访问权限
为了研究 static 的使用是否缩小了访问权限,我们只要去研究在原来的访问权限的情况下是否可以正常调用 static 即可。其中其他类,我设置的是其它包中的其它类而不是本包中
代码如下:
package com.my.testStatic;
/**
- 测试 static 是否影响访问权限
- @author hero
*/
public class TestRoot {
public static String string1="public";
private static String string2="private";
protected static String string3="protected";
static String string4="友好变量";
public void show(){
System.out.println("在本类中:");
System.out.println(TestRoot.string1);
System.out.println(TestRoot.string2);
System.out.println(TestRoot.string3);
System.out.println(TestRoot.string4);
}
public static void main(String[] args) {
new TestRoot().show();
new TestStatic().show();
new Test().show();
new com.my.testRoot.Test().show();
new com.my.testRoot.Test2().show();
}
}
package com.my.testStatic;
public class Test extends TestRoot{
public static void main(String[] args) {
System.out.println("在同一个包中的继承类中:");
System.out.println(TestRoot.string1);
System.out.println(TestRoot.string3);
System.out.println(TestRoot.string4);
}
}
package com.my.testRoot;
import com.my.testStatic.TestRoot;
public class Test extends TestRoot {
public void show(){
System.out.println("在不同的包中的继承类:");
System.out.println(TestRoot.string1);
System.out.println(TestRoot.string3);
}
}
package com.my.testRoot;
import com.my.testStatic.TestRoot;
public class Test2 {
public void show(){
System.out.println("不在同一个包中的其他类:");
System.out.println(TestRoot.string1);
}
}
运行结果:
java>> 在本类中:
java>>public
java>>private
java>>protected
java>> 友好变量
java>> 在同一个包中:
java>>public
java>>protected
java>> 友好变量
java>> 在本类中:
java>>public
java>>private
java>>protected
java>> 友好变量
java>> 在不同的包中的继承类:
java>>public
java>>protected
java>> 不在同一个包中的其他类:
java>>public
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于