`
ticojj
  • 浏览: 151980 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

java中 static与final 小解

    博客分类:
  • java
阅读更多

---------2012-5-7----------
static是静态修饰符。
在程序中,所有的变量或代码在编译时,都会由系统分配内存来存储。而所谓的静态就是指,该内存被分配后会一直存在,直到程序退出,内存才会释放该空间(程序在运行,内存一直存在)。
普通情况下,若访问类的成员变量或成员函数,都需要先实例化。但若用static定义该成烟,就无需此情况了。

//以下就是无需实例化的情况
class A{
static name ;
static void fuck_you(){
  .......
}
}

class B{
A.name;
A.fuck_you();
}

//以下为说明静态变量属于全局变量
class TStatic{
static int i;

public TStatic(){
   i = 4;
}

public TStatic(int j){
   i = j;
}

public static void main(String args[]){
   TStatic t2 = new TStatic(10);
   TStatic t1 = new TStatic();
   sysout(t2.i);
   sysout(t1.i);
   sysout(t2.i);
}
}
结果都为4 。所有对象共享一个内存,呵呵‘
//static 用处
比如班级人数是变化的。 可以static count;
比如基本工资是变化的,但是工厂N多人是统一的基本工资。 可以static int base_salary ;
进行get set方法。老板可以set ,其他员工就可以get。(需考虑到屏蔽员工Set端口)




--------我这人健忘,以下为以前写的。当时理解了,可现在我又忘记了-----------------




以下全部都是理解后copy,下面是我自己来说句话了:
static定义变量,属于全局性,所有人都可引用;
static定义程序块,会被优先加载出来;
static定义方法,该类不需要生成对象,该类就可以直接调用该方法(例如上面那个程序示例)。

final定义变量,不可改变其值;

final定义方法,方法在子类中不能被重写;
final定义类,该类不能被继承。




java中
方法或变量被定义为static时,会被优先访问。

静态方法
通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法。如下所示:
class Simple{
static void go(){
System.out.println("Go...");
}
}
public class Cal{
public static void main(String[] args){
Simple.go();
}
}


.static 属于全局,也就是类的属性 和方法,换句话说 一个类,不管有多少个实例,却只有一个全局变量
class B {static int a=0;}
B b1=new B();..................;B bn=new B();
b1~bn 都是类B的实例,每个实例都共享 变量a,a是全局变量,属于类B的属性,每个实例都能引用变量a,
加入执行b1.a=1;后 那么b2.a,b3.a,b4.a......bn.a 都等于1了,

static 方法也是类似的

需要注意的是 静态属性和方法属于类方法,加载类后,就已经存在静态属性和方法,实例是需要用new构造出来后 才会有引用
根据先后顺序,就有以下两条规则
1、非静态的方法可以调用静态的或者非静态的属性和方法;
2、静态的方法不可以调用非静态的属性和方法,因为非静态的还不一定存在,只能先构造出来后,再通过实例引用
例如 在main方法中 可以直接调用static 的方法,调用非static方法 需要先构造出类的实例,通过实例才能调用



static是静态修饰关键字,可以修饰变量和程序块以及类方法:当你定义一个static的变量的时候jvm会将将其分配在内存堆上,所有程序对它的引用都会指向这一个地址而不会重新分配内存;修饰一个程序块的时候(也就是直接将代码写在static{...}中)时候,虚拟机就会优先加载静态块中代码,这主要用于系统初始化;当修饰一个类方法时候你就可以直接通过类来调用而不需要新建对象。
final可以修饰变量、方法及类,当你定义一个final变量时,jvm会将其分配到常量池中,程序不可改变其值;当你定义一个方法时,改方法在子类中将不能被重写;当你修饰一个类时,该类不能被继承。




static如果用这个修饰你女朋友就意味着你女朋友是所有人的女朋友。
final如果用这个修饰你女朋友那就是意味着她已经变成你老婆了,你甩不掉了。只给你一次初始化机会。



------------------------------static 执行顺序
class UseStatic {
  static int a = 3;
  static int b;
  static void meth(int x) {
  System.out.println("x = " + x);
  System.out.println("a = " + a);
  System.out.println("b = " + b);
  }
  static {
  System.out.println("Static block initialized.");
  b = a * 4;
  }
  public static void main(String args[]) {
  meth(42);
  }
  }


  1.  一旦UseStatic 类被装载,所有的static语句被运行。首先,a被设置为3,
    2   接着static 块执行(打印一条消息),最后,b被初始化为a*4 或12。
    3.  然后调用main(),main() 调用meth() ,把值42传递给x。3个println ( ) 语句引用两个static变量a和b,以及局部变量x 。
  注意:在一个static 方法中引用任何实例变量都是非法的。
  下面是该程序的输出:
  Static block initialized.
  x = 42
  a = 3
  b = 12

---------------------
看帖要回复啊!!!!
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics