游戏代码中出现大量的python static 变量方法和变量

java中带static的成员变量和方法有何作用_百度经验
&&&&&&&&&电脑软件java中带static的成员变量和方法有何作用?听语音
百度经验:jingyan.baidu.com& & & &在java开发中,常常要创建带不同修辞关键字[public]\[private] static的成员变量或方法。提出问题:这些关键字各起什么作用呢?解决问题:现结合实例对static 小结一下。百度经验:jingyan.baidu.com1、开发工具:Intellij IDEA 14以上2、在此进行java开发练习百度经验:jingyan.baidu.com1& & & 首先,认识由这几个关键修辞的成员变量和成员方法,形成的4类成员变量和4类成员方法。& & 4类成员变量:public static 数据类型 &成员变量名;-------公共的、静态的成员变量。public 数据类型 &成员变量名;------公共的、非静态的成员变量。private static 数据类型 &成员变量名;------私有的、静态的成员变量。private &数据类型 &成员变量名;--------私有的非静态的成员变量。& & &4类成员方法:public static 数据类型 &成员方法名(){ &}-------公共的、静态的成员方法。public 数据类型 &成员方法名(){ &}-----公共的、非静态的成员方法。private static 数据类型 &成员方法名(){ &}-----私有的、静态的成员方法。private &数据类型 &成员方法名(){ &}------私有的非静态的成员方法。2& & & &其次,要知道,创建好的成员变更,只有当它们在方法里面被访问时,才能起作用。另外,原则上一个方法是可以调用另一个方法的。但是有了这些关键字修辞的成员变量和成员方法,它们能否在另一方法中被访问到,被调用到呢?& & & 以下是实例3step1:新建一个类(本例类名:MethodVisitMethod)。8个成员方法,1个主方法main() 它是用来测试验证。& &&4step2:代码如下/**& * 本实例探究一个方法访问其它成员方法有什么的规律&*/public class MethodVisitMethod {& & //create 主方法& & public static void main(String[] args) {& & & & System.out.println(&综合测试结果,得出如下结论:&);& & & & System.out.println(&1.静态的方法只能调用到静态的成员方法。&);& & & & System.out.println(&2.非静态的方法可以调用到静态的和非静态的方法。&);& & }& & //create 公有、静态的方法& & public static void show_1() {& & & & int a = 10;& & & & int b = 20;& & & & int c = a +& & & & System.out.println(c);& & }& & //create 私有、静态的方法& & private static void show_2() {& & & & int a = 10;& & & & int b = 20;& & & & int c = a *& & & & System.out.println(c);& & }& & //create 公有的、非静态的方法& & public void show_3() {& & & & int a = 10;& & & & int b = 20;& & & & int c = a /& & & & System.out.println(c);& & }& & //create 私有、非静态的方法& & private void show_4() {& & & & int a = 10;& & & & int b = 20;& & & & int c = a -& & & & System.out.println(c);& & }& & //create 测试方法& & public static void test_1() {& & & & show_1();& & & & show_2();& & & & //show_3();//无法从静态上下文中引用非静态 方法 show_3()& & & & //show_4();//无法从静态上下文中引用非静态 方法 show_4()& & & & //说明公有、静态的方法只能调用静态的方法。& & }& & private static void test_2() {& & & & show_1();& & & & show_2();& & & & //show_3();//无法从静态上下文中引用非静态 方法 show_3()& & & & //show_4();//无法从静态上下文中引用非静态 方法 show_4()& & & & //说明私有、静态的方法只能调用静态的方法。& & }& & public void test_3() {& & & & show_1();& & & & show_2();& & & & show_3();& & & & show_4();& & & & //说明公有、非静态的方法可以调用静态的和非静态的方法。& & }& & private void test_4() {& & & & show_1();& & & & show_2();& & & & show_3();& & & & show_4();& & & & //说明私有、非静态的方法可以调用静态的和非静态的方法。& & }& &/*& &* 综合以下测试,可得出如下结论:& &* 1.静态的方法只能调用到静态的成员方法。& &* 2.非静态的方法可以调用到静态的和非静态的方法。& & 3 .成员方法调用另一成员方法取决于两者的static,与它们的public\private无关。& &* */}& &&5step3:新建一个类(本例类名:MethodVisitVariable)本类由4个成员变量,4个成员方法,1个主方法main()组成6代码如下/**&* 本实例探究一个方法访问成员变量的规律&*/public class methodVisitVariable {& & public static void main(String[] args){& & & & System.out.println(&综合测试结果,可以得出结论:&);& & & & System.out.println(&1.静态方法只能访问静态的成员变量。&);& & & & System.out.println(&2.非静态的方法可以访问静态的和非静态的成员变量。&);& & }& & //satement variable& & public static String a1;& & private static &String a2;& & public String a3;& & private &String a4;& & //create method& & public static void call_1(){& & & & String a=a1;& & & & String b=a2;& & & & //String c=a3;& & & &// String d=a4;& & & & //说明公有、静态的方法只能访问静态的成员变量。& & }& & // create method& & private static void call_2(){& & & & String a=a1;& & & & String b=a2;& & & &// String c=a3;& & & &// String d=a4;& & & & //说明私有、静态的方法只能访问静态的成员变量。& & }& & // create method& & public void call_3(){& & & & String a=a1;& & & & String b=a2;& & & & String c=a3;& & & & String d=a4;& & & & //说明公有、非静态的方法可以访问静态的和非静态成员变量。& & }& & //create method& & private void call_4(){& & & & String a=a1;& & & & String b=a2;& & & & String c=a3;& & & & String d=a4;& & & & //说明私有、非静态的方法可以访问静态的和非静态成员变量。& & }}& & /*测试方法是逐个方法进行测试,取消前各个被调用的方法前面的注释符//,运行main方法。对多次行动的结果进行归纳总结:得出如下规律:(如图所示)& 在同一类中,成员方法想去调用其它的成员变量,权限是:& 1.静态成员方法只能访问静态的成员变量。& 2.非静态成员方法可以访问所有的成员变量& 3.成员方法访问成员变量取决于两者的static,与它们的public\private无关。*/7最后总结:1、一个静态的成员方法只能访问(调用)静态的成员变量和静态的成员方法。2、一个非静态的成员方法可以访问(调用 )静态和非静态的成就变量。也可以调用静态的和非静态的成员方法。END经验内容仅供参考,如果您需解决具体问题(尤其法律、医学等领域),建议您详细咨询相关领域专业人士。作者声明:本篇经验系本人依照真实经历原创,未经许可,谢绝转载。投票(0)已投票(0)有得(0)我有疑问(0)◆◆说说为什么给这篇经验投票吧!我为什么投票...你还可以输入500字◆◆只有签约作者及以上等级才可发有得&你还可以输入1000字◆◆如对这篇经验有疑问,可反馈给作者,经验作者会尽力为您解决!你还可以输入500字相关经验2000040热门杂志第1期你不知道的iPad技巧3767次分享第1期win7电脑那些事6629次分享第2期新人玩转百度经验1400次分享第1期Win8.1实用小技巧2651次分享第1期小白装大神1910次分享◆请扫描分享到朋友圈java一个类中有一个static变量a ,那么同时开两个程序,那么其中的a是同一个么_百度知道
java一个类中有一个static变量a ,那么同时开两个程序,那么其中的a是同一个么
我有更好的答案
按照问题的表述答案是:不是同一个。这里的重点是“同时开两个程序”,是运行两次么?如果是的话,那必然是两个,每一次运行都会创建一个Java虚拟机,两个Java虚拟机之间完全独立。如果所谓的运行两次是指创建俩线程的话,那就是一个。关键是是否在同一个Java虚拟机中。比较简单的方法是你可以看看进程管理器是否创建了俩java.exe(或javaw.exe)
采纳率:63%
来自团队:
同一个JVM里面运行的话,肯定是一样的,static的变量只有在第一次装载的时候会分配内存空间。
不是同一个,开始第二个程序时,变量a分配的内存空间与第一个变量a分配不同。
不一样 a是局部变量
没错,这个类实例化的所有对象都共享一个静态变量a。
其他2条回答
为您推荐:
其他类似问题
static的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。  static表示&全局&或者&静态&的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。
  只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它类的对象市,不生成static变量的副本,而是类的所有实例共享同一个static变量。
  static变量前可以有private修饰,表示这个变量可以在类的静态代码块中,或者类的其他静态成员方法中使用(当然也可以在非静态成员方法中使用--废话),但是不能在其他类中通过类名来直接引用,这一点很重要。实际上你需要搞明白,private是访问权限限定,static表示不要实例化就可以使用,这样就容易理解多了。static前面加上其它访问权限关键字的效果也以此类推。
  static修饰的成员变量和成员方法习惯上称为静态变量和静态方法,可以直接通过类名来访问,访问语法为:  类名.静态方法名(参数列表...)  类名.静态变量名
  用static修饰的代码块表示静态代码块,当Java虚拟机(JVM)加载类时,就会执行该代码块(用处非常大,呵呵)。 
  1、static变量    按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量;另一种是没有被static修饰的变量,叫实例变量。
  两者的区别是:   对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。   对于实例变量,没创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。
  所以一般在需要实现以下两个功能时使用静态变量:  ?& 在对象之间共享值时  ?& 方便访问变量时
  2、静态方法    静态方法可以直接通过类名调用,任何的实例也都可以调用,    因此静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和    成员方法。    因为实例成员与特定的对象关联!这个需要去理解,想明白其中的道理,不是记忆!!!    因为static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract。
    例如为了方便方法的调用,Java API中的Math类中所有的方法都是静态的,而一般类内部的static方法也是方便其它类对该方法的调用。
    静态方法是类内部的一类特殊方法,只有在需要时才将对应的方法声明成静态的,一个类内部的方法一般都是非静态的
  3、static代码块
   static代码块也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。例如:
public class Test5 {
Test5.a=3;
System.out.println(a);
Test5 t=new Test5();
System.out.println(t.b);
Test5.a=4;
System.out.println(a);
public static void main(String[] args) {
// TODO 自动生成方法存根
Test5.a=5;
System.out.println(a);
public void f(){
System.out.println("hhahhahah");
  运行结果:
  利用静态代码块可以对一些static变量进行赋值,最后再看一眼这些例子,都一个static的main方法,这样JVM在运行main方法的时候可以直接调用而不用创建实例。 
  4、static和final一块用表示什么  static final用来修饰成员变量和成员方法,可简单理解为&全局常量&!  对于变量,表示一旦给值就不可修改,并且通过类名可以访问。  对于方法,表示不可覆盖,并且可以通过类名直接访问。
  有时你希望定义一个类成员,使它的使用完全独立于该类的任何对象。通常情况下,类成员必须通过它的类的对象访问,但是可以创建这样一个成员,它能够被它自己使用,而不必引用特定的实例。在成员的声明前面加上关键字static(静态的)就能创建这样的成员。如果一个成员被声明为static,它就能够在它的类的任何对象创建之前被访问,而不必引用任何对象。你可以将方法和变量都声明为static。static 成员的最常见的例子是main( ) 。因为在程序开始执行时必须调用main() ,所以它被声明为static。
  声明为static的变量实质上就是全局变量。当声明一个对象时,并不产生static变量的拷贝,而是该类所有的实例变量共用同一个static变量。声明为static的方法有以下几条限制:  &它们仅能调用其他的static 方法。  &它们只能访问static数据。  &它们不能以任何方式引用this 或super(关键字super 与继承有关,在下一章中描述)。  如果你需要通过计算来初始化你的static变量,你可以声明一个static块,Static 块仅在该类被加载时执行一次。下面的例子显示的类有一个static方法,一些static变量,以及一个static 初始化块:
// Demonstrate static variables,methods,and blocks.
class UseStatic {
static int a = 3;
static void meth(int x) {
System.out.println("x = " + x);
System.out.println("a = " + a);
System.out.println("b = " + b);
System.out.println("Static block initialized.");
b = a * 4;
public static void main(String args[]) {
  一旦UseStatic 类被装载,所有的static语句被运行。首先,a被设置为3,接着static 块执行(打印一条消息),最后,b被初始化为a*4 或12。然后调用main(),main() 调用meth() ,把值42传递给x。3个println ( ) 语句引用两个static变量a和b,以及局部变量x 。
  注意:在一个static 方法中引用任何实例变量都是非法的。
  下面是该程序的输出:
Static block initialized.
  在定义它们的类的外面,static 方法和变量能独立于任何对象而被使用。这样,你只要在类的名字后面加点号运算符即可。例如,如果你希望从类外面调用一个static方法,你可以使用下面通用的格式:
  classname.method( )
  这里,classname 是类的名字,在该类中定义static方法。可以看到,这种格式与通过对象引用变量调用非static方法的格式类似。一个static变量可以以同样的格式来访问&&类名加点号运算符。这就是Java 如何实现全局功能和全局变量的一个控制版本。
  下面是一个例子。在main() 中,static方法callme() 和static 变量b在它们的类之外被访问。
class StaticDemo {
static int a = 42;
static int b = 99;
static void callme() {
System.out.println("a = " + a);
class StaticByName {
public static void main(String args[]) {
StaticDemo.callme();
System.out.println("b = " + StaticDemo.b);
  下面是该程序的输出:
  static成员是不能被其所在class创建的实例访问的。如果不加static修饰的成员是对象成员,也就是归每个对象所有的。加static修饰的成员是类成员,就是可以由一个类直接调用,为所有对象共有的。
1、static变量 按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量;另一种是没有被static修饰的变量,叫实例变量。
两者的区别是: 对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。 对于实例变量,没创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。
所以一般在需要实现以下两个功能时使用静态变量:?& 在对象之间共享值时?& 方便访问变量时
2、静态方法静态方法可以直接通过类名调用,任何的实例也都可以调用,因此静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法。因为实例成员与特定的对象关联!这个需要去理解,想明白其中的道理,不是记忆!!!因为static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract。
例如为了方便方法的调用,Java API中的Math类中所有的方法都是静态的,而一般类内部的static方法也是方便其它类对该方法的调用。
静态方法是类内部的一类特殊方法,只有在需要时才将对应的方法声明成静态的,一个类内部的方法一般都是非静态的
(一)java 静态代码块 静态方法区别一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序来调用的时候,需要使用静态方法,这种代码是被动执行的. 静态方法在类加载的时候 就已经加载 可以用类名直接调用比如main方法就必须是静态的 这是程序入口两者的区别就是:静态代码块是自动执行的;静态方法是被调用的时候才执行的.
静态方法(1)在Java里,可以定义一个不需要创建对象的方法,这种方法就是静态方法。要实现这样的效果,只需要在类中定义的方法前加上static关键字。例如:
public static int maximum(int n1,int n2)
使用类的静态方法时,注意:a在静态方法里只能直接调用同类中其他的静态成员(包括变量和方法),而不能直接访问类中的非静态成员。这是因为,对于非静态的方法和变量,需要先创建类的实例对象后才可使用,而静态方法在使用前不用创建任何对象。
b 静态方法不能以任何方式引用this和super关键字,因为静态方法在使用前不用创建任何实例对象,当静态方法调用时,this所引用的对象根本没有产生。
(2)静态变量是属于整个类的变量而不是属于某个对象的。注意不能把任何方法体内的变量声明为静态,例如:fun(){static int i=0;//非法。}
(3)一个类可以使用不包含在任何方法体中的静态代码块,当类被载入时,静态代码块被执行,且只被执行一次,静态块常用来执行类属性的初始化。例如:static{}
类装载步骤在Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:装载、链接和初始化,其中链接又可以分成校验、准备和解析三步,除了解析外,其它步骤是严格按照顺序完成的,各个步骤的主要工作如下:
装载:查找和导入类或接口的二进制数据;链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的;校验:检查导入类或接口的二进制数据的正确性;准备:给类的静态变量分配并初始化存储空间;解析:将符号引用转成直接引用;初始化:激活类的静态变量的初始化Java代码和静态Java代码块。初始化类中属性是静态代码块的常用用途,但只能使用一次。
(二)静态代码块的初始化顺序
class Parent{
static String name = "hello";
System.out.println("parent block");
System.out.println("parent static block");
public Parent(){
System.out.println("parent constructor");
class Child extends Parent{
static String childName = "hello";
System.out.println("child block");
System.out.println("child static block");
public Child(){
System.out.println("child constructor");
public class StaticIniBlockOrderTest {
public static void main(String[] args) {
new Child();//语句(*)
  问题:当执行完语句(*)时,打印结果是什么顺序?为什么?  解答:当执行完语句(*)时,打印结果是这样一个顺序 :
parent static block
child static block
parent block
parent constructor
child block
child constructor
分析:当执行new Child()时,它首先去看父类里面有没有静态代码块,如果有,它先去执行父类里面静态代码块里面的内容,当父类的静态代码块里面的内容执行完毕之后,接着去执行子类(自己这个类)里面的静态代码块,当子类的静态代码块执行完毕之后,它接着又去看父类有没有非静态代码块,如果有就执行父类的非静态代码块,父类的非静态代码块执行完毕,接着执行父类的构造方法;父类的构造方法执行完毕之后,它接着去看子类有没有非静态代码块,如果有就执行子类的非静态代码块。子类的非静态代码块执行完毕再去执行子类的构造方法,这个就是一个对象的初始化顺序。
总结:对象的初始化顺序:首先执行父类静态的内容,父类静态的内容执行完毕后,接着去执行子类的静态的内容,当子类的静态内容执行完毕之后,再去看父类有没有非静态代码块,如果有就执行父类的非静态代码块,父类的非静态代码块执行完毕,接着执行父类的构造方法;父类的构造方法执行完毕之后,它接着去看子类有没有非静态代码块,如果有就执行子类的非静态代码块。子类的非静态代码块执行完毕再去执行子类的构造方法。总之一句话,静态代码块内容先执行,接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。
注意:子类的构造方法,不管这个构造方法带不带参数,默认的它都会先去寻找父类的不带参数的构造方法。如果父类没有不带参数的构造方法,那么子类必须用supper关键子来调用父类带参数的构造方法,否则编译不能通过。
阅读(...) 评论()Java中的static关键字解析
  static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一。下面就先讲述一下static关键字的用法和平常容易误解的地方,最后列举了一些面试笔试中常见的关于static的考题。以下是本文的目录大纲:
  一.static关键字的用途
  二.static关键字的误区
  三.常见的笔试面试题
  若有不正之处,希望谅解并欢迎批评指正。
  请尊重作者劳动成果,转载请标明原文链接:
一.static关键字的用途
  在《Java编程思想》P86页有这样一段话:
  &static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。&
  这段话虽然只是说明了static方法的特殊之处,但是可以看出static关键字的基本作用,简而言之,一句话来描述就是:
  方便在没有创建对象的情况下来进行调用(方法/变量)。
  很显然,被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问。
  static可以用来修饰类的成员方法、类的成员变量,另外可以编写static代码块来优化程序性能。
1)static方法
  static方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了。并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。
  但是要注意的是,虽然在静态方法中不能访问非静态成员方法和非静态成员变量,但是在非静态成员方法中是可以访问静态成员方法/变量的。举个简单的例子:
  在上面的代码中,由于print2方法是独立于对象存在的,可以直接用过类名调用。假如说可以在静态方法中访问非静态方法/变量的话,那么如果在main方法中有下面一条语句:
  MyObject.print2();
  此时对象都没有,str2根本就不存在,所以就会产生矛盾了。同样对于方法也是一样,由于你无法预知在print1方法中是否访问了非静态成员变量,所以也禁止在静态成员方法中访问非静态成员方法。
  而对于非静态成员方法,它访问静态成员方法/变量显然是毫无限制的。
  因此,如果说想在不创建对象的情况下调用某个方法,就可以将这个方法设置为static。我们最常见的static方法就是main方法,至于为什么main方法必须是static的,现在就很清楚了。因为程序在执行main方法的时候没有创建任何对象,因此只有通过类名来访问。
  另外记住,关于构造器是否是static方法可参考:http://blog.csdn.net/qq_/article/details/
2)static变量
  static变量也称作静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。
  static成员变量的初始化顺序按照定义的顺序进行初始化。
3)static代码块
  static关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。
  为什么说static块可以用来优化程序性能,是因为它的特性:只会在类加载的时候执行一次。下面看个例子:
class Person{
private Date birthD
public Person(Date birthDate) {
this.birthDate = birthD
boolean isBornBoomer() {
Date startDate = Date.valueOf("1946");
Date endDate = Date.valueOf("1964");
return birthDate.compareTo(startDate)&=0 && birthDate.compareTo(endDate) & 0;
  isBornBoomer是用来这个人是否是年出生的,而每次isBornBoomer被调用的时候,都会生成startDate和birthDate两个对象,造成了空间浪费,如果改成这样效率会更好:
class Person{
private Date birthD
private static Date startDate,endD
startDate = Date.valueOf("1946");
endDate = Date.valueOf("1964");
public Person(Date birthDate) {
this.birthDate = birthD
boolean isBornBoomer() {
return birthDate.compareTo(startDate)&=0 && birthDate.compareTo(endDate) & 0;
  因此,很多时候会将一些只需要进行一次的初始化操作都放在static代码块中进行。
二.static关键字的误区
1.static关键字会改变类中成员的访问权限吗?
  有些初学的朋友会将java中的static与C/C++中的static关键字的功能混淆了。在这里只需要记住一点:与C/C++中的static不同,Java中的static关键字不会影响到变量或者方法的作用域。在Java中能够影响到访问权限的只有private、public、protected(包括包访问权限)这几个关键字。看下面的例子就明白了:
  提示错误"Person.age 不可视",这说明static关键字并不会改变变量和方法的访问权限。
2.能通过this访问静态成员变量吗?
  虽然对于静态方法来说没有this,那么在非静态方法中能够通过this访问静态成员变量吗?先看下面的一个例子,这段代码输出的结果是什么?
public class Main {  
static int value = 33;
public static void main(String[] args) throws Exception{
new Main().printValue();
private void printValue(){
int value = 3;
System.out.println(this.value);
  这里面主要考察队this和static的理解。this代表什么?this代表当前对象,那么通过new Main()来调用printValue的话,当前对象就是通过new Main()生成的对象。而static变量是被对象所享有的,因此在printValue中的this.value的值毫无疑问是33。在printValue方法内部的value是局部变量,根本不可能与this关联,所以输出结果是33。在这里永远要记住一点:静态成员变量虽然独立于对象,但是不代表不可以通过对象去访问,所有的静态方法和静态变量都可以通过对象访问(只要访问权限足够)。
3.static能作用于局部变量么?
  在C/C++中static是可以作用域局部变量的,但是在Java中切记:static是不允许用来修饰局部变量。不要问为什么,这是Java语法的规定。
  具体原因可以参考这篇博文的讨论:http://www.debugease.com/j2se/178932.html
三.常见的笔试面试题
  下面列举一些面试笔试中经常遇到的关于static关键字的题目,仅供参考,如有补充欢迎下方留言。
1.下面这段代码的输出结果是什么?
public class Test extends Base{
System.out.println("test static");
public Test(){
System.out.println("test constructor");
public static void main(String[] args) {
new Test();
class Base{
System.out.println("base static");
public Base(){
System.out.println("base constructor");
base static
test static
base constructor
test constructor
  至于为什么是这个结果,我们先不讨论,先来想一下这段代码具体的执行过程,在执行开始,先要寻找到main方法,因为main方法是程序的入口,但是在执行main方法之前,必须先加载Test类,而在加载Test类的时候发现Test类继承自Base类,因此会转去先加载Base类,在加载Base类的时候,发现有static块,便执行了static块。在Base类加载完成之后,便继续加载Test类,然后发现Test类中也有static块,便执行static块。在加载完所需的类之后,便开始执行main方法。在main方法中执行new Test()的时候会先调用父类的构造器,然后再调用自身的构造器。因此,便出现了上面的输出结果。
2.这段代码的输出结果是什么?
public class Test {
Person person = new Person("Test");
System.out.println("test static");
public Test() {
System.out.println("test constructor");
public static void main(String[] args) {
new MyClass();
class Person{
System.out.println("person static");
public Person(String str) {
System.out.println("person "+str);
class MyClass extends Test {
Person person = new Person("MyClass");
System.out.println("myclass static");
public MyClass() {
System.out.println("myclass constructor");
test static
myclass static
person static
person Test
test constructor
person MyClass
myclass constructor
  类似地,我们还是来想一下这段代码的具体执行过程。首先加载Test类,因此会执行Test类中的static块。接着执行new MyClass(),而MyClass类还没有被加载,因此需要加载MyClass类。在加载MyClass类的时候,发现MyClass类继承自Test类,但是由于Test类已经被加载了,所以只需要加载MyClass类,那么就会执行MyClass类的中的static块。在加载完之后,就通过构造器来生成对象。而在生成对象的时候,必须先初始化父类的成员变量,因此会执行Test中的Person person = new Person(),而Person类还没有被加载过,因此会先加载Person类并执行Person类中的static块,接着执行父类的构造器,完成了父类的初始化,然后就来初始化自身了,因此会接着执行MyClass中的Person person = new Person(),最后执行MyClass的构造器。
3.这段代码的输出结果是什么?
public class Test {
System.out.println("test static 1");
public static void main(String[] args) {
System.out.println("test static 2");
test static 1
test static 2
  虽然在main方法中没有任何语句,但是还是会输出,原因上面已经讲述过了。另外,static块可以出现类中的任何地方(只要不是方法内部,记住,任何方法内部都不行),并且执行是按照static块的顺序执行的。
  参考资料:
  《Java编程思想》
阅读(...) 评论()}

我要回帖

更多关于 c static 成员变量 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信