浅谈 Java static关键字

   static表示“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,当用public修饰static变量或静态方法时它有点带“全局”的意思,而Java中没有全局变量和全局方法的概念。

1、static变量:引用static变量有两种方法,可以通过一个对象去定位它,也可以通过类名直接引用。而后者是首先方式,因为它强调了变量的static结构,而且在某些情况下它还为编译器进行优化提供了更好的帮助。

        当static作用于某个字段时,将会改变数据的创建方式,因为static变量对每个类来说都只有一份存储空间,而非static变量则是每个对象有一个存储空间。

2、静态方法:静态方法是指用static修饰的成员方法其中的一个重要作用是在不创建任何对象的时候就调用它,main()方法就是一个例子,JVM在运行的时候可以直接去调用而不用创建实例。

        通常静态方法不能直接调用非静态的方法或成员(实例方法或成员)的,因为实例成员与特定的对象关联。 当然你可以传递一个对象的引用到静态方法里,然后通过这个引用,你就可以调用非静态方法和访问非静态数据成员了。

class TestStatic01{
 public void testMethod01(){
  System.out.println("hi()");
 }
}
public class TestStatic {
 
 //非静态方法
 public void testMethod02(){
  System.out.println("testMethod02()");
 }
 //静态方法
 public static void testApp(){
  TestStatic01 ts = new TestStatic01();
  ts.testMethod01();
  /*错误提示:Cannot make a static reference to the non-static method testMethod02()
   * from the type TestStatic      
   */
  //testMethod02(); 
 }
}

        当申明一个事务是用static时,就意味着这个域或方法不会与包含它的那个类的任何对象实例联系在一起。所以即使没有创建某个类的任何对象也可以调用其static方法或访问其static域。

         无论创建多少的对象,静态数据都只占用一份存储区域,static关键字不能应用于局部变量,因此它只能作用于域,如果一个域是静态的基本类型域,且没有对它进行初始化,那么它就会获得基本类型的标准值;如果它是一个对象的引用,那么它的默认初始化值就是null。
 
         静态变量和静态方法可以直接通过类名.静态变量名 和 类名.静态方法名()直接去访问而不需要通过创建对象去访问,当然也可以通过对象去访问。

3、static代码块:称作静态代码块,是在类中独立于方法之外的语句集合,通常JVM加载类时,就会执行该代码块。同样,它能独立运行而并不需要去调用,如果在一个类中有多个静态代码块,执行顺序是按照他们分别的出现顺序执行。

public class TestStatic {
 
 static{
  System.out.println("static01");
 }
 
 static{
  System.out.println("static02");
 }
 
 /*
  * 虽然main方法在第三个静态代码块前面,但是代码的执行顺序是先运行静态代码块的,
  * 这里涉及到代码的执行顺序:
  * 执行父类的相关代码->如果有静态初始化,先执行静态初始化,且只执行一次,
  * 以后即使有该类实例化,也不会再执行->如果有静态代码块,以与静态初始化一样的方式执行->
  * 如果有new语句带来的实例化,先为成员变量分配空间,并绑定参数列表,隐式或显式执行super(),
  * 即父类的构造方法,->执行非静态代码块-〉执行本类的构造函数-〉执行其他代码
  */
 {
  System.out.println("构造块");
 }
 public static void main(String[] args) {
  System.out.println("test");
 }
 static{
  System.out.println("static03");
 }
}
输出结果如下:
static01
static02
static03
test

        提示:虽然static确实给我们带来了很大的便利性,但是当你在代码中实现了大量的静态方法,就应该考虑自己设计的代码是否有问题了,因为全局方法和全局变量和“面向对象”是相违背的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值