java中static关键字

     初识static

   static是静态的意思,这个大家应该都清楚,静态变量,静态方法大家也都能随口道来。但是真正理解静态变量和静态方法么?除了这些static还有什么用处?

  static大体上有五种用法:

  1.静态导入

  2.静态变量

  3.静态方法

  4.静态代码段

  5.静态内部类

   

  静态导入

  如何进行静态导入呢?下面我们由一段代码演示静态导入:

   package com.example.learnjava:

   

   public class Common{


      public static fianl int AGE = 10;


      public static void output(){


         System.out.println("Hello World!");


      }

   }

   上面是我们定义的一个类.

   在另一个保重使用时候,如果不使用静态导入,是这样用的:

    package com.example.learnjava2;


    import com.example.learnjava.Common;


    public class StaticImportTest{


      public static void main(String[] args){


         int a =  Common.AGE;


         System.out.println(a);


         Common.output();


      }


    }


  使用静态导入

  静态导入的语法是:

  import static 包名.类名.静态成员变量;

  import static 包名.类名.静态成员函数;

  注意导入的是成员变量和方法名。

  如前面的程序使用静态导入后:

  package com.example.learnjava2;

  

  import static com.example.learnjava.Common.AGE;

  import static com.example.learnjava.Common.output;


  public class StaticImportTest{


     public static void main(String[] args){


         int a = AGE;

         

         System.out.println(a);


          output();     

     }

 

  }

  缺点:过度的使用静态导入会在一定程度降低代码的可读性。


  静态变量与静态方法:

  在这里先解释下静态对象是什么:

   静态对象就是在代码编译前就已经存在于内存中的对象,所以不需要new,并且可以直接用类名调用。所以static只能修饰类的成员变量和方法,不能修饰方法类的局部变量。另外不能被继承,因为它仅属于某个类,但不是其对象。

  静态变量和静态方法都属于静态对象,它与非静态对象差别分别在拥有属性上,内存分配上,分配顺序上。

  从属性上,静态是类共同拥有的,非静态是类各对象独立拥有的。内存上,内存空间上是固定的,而非晶态是空间各个附属类里面分配,分配顺序:先分配静态对象的空间,继而再对非静态对象分配空间也就是初始化顺序是先静态再非静态.(java中内存大体上有四块:堆,栈,静态区,常量区)


 静态代码块

 静态代码块就是用static修饰的用{}括起来的代码块,它的主要目的就是对静态属性进行初始化,静态代码块可以有多个,位置可以随便放,它不在任何的方法体内,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。

 看下面代码

 public class Person{

    

     private Date birthDeate;


     public Person(Date birthDeate){


         this.birthdate = birthDate;


     }


       boolean isBornBoomer(){

          

           Date startDate = Date.valueOf("1990");

           Date endDate = Date.valueOf("1999");


            return birthDate.compareTo(startDate)>=0 &&  birthDate.compareTo(endDate)<0;

       }

 }


  当程序执行到isBornBoomer是用来判断这个人是否是1990~1999年出生的,而每次isBornBoomer被调用的时候,都会生成startDate和birthDate两个对象,造成了空间浪费,如果改成这样效率会更好:

  public class Person{


    private Date birthDate;


     private static Date startDate,endDate;


     static{

        startDate = date.valueof("1990");

         endDate = date.valueof("1999");

     }


     public Person(Date birthDate){

         this.birthDate = birthDate;

    }


     boolean isBornBoomer(){

        return birthdDate.compareTo(startDate)>=0 && birthDate.compareTo(endDate)<0;

    }

}

  静态类部类

  被static修饰的内部类,它可以不依赖与外部类实例对象而被实例化,而通常的内部类需要在外部类实例化后才能实例化。静态内部类不能与外部类有相同的名字,不能访问外部类的普通成员变量,只能访问内部类中的静态成员变量和静态方法(包括私有类型)。

  注:只有累不累才能被static修饰,普通的类不可以。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值