首页 > 编程 > Java > 正文

java基本语法-static关键字

2019-11-10 20:16:57
字体:
来源:转载
供稿:网友

static通常无需要本类创建对象就可以使用,直接通过类名来点这个变量或方法。

申明static的限制:

1.只能调用static申明的变量或方法

2.非static申明的变量或方法不能访问

3.不能引用this或super

class c (){

  PRivate static int a = 2;

}

main(){

   c.a;

}

static静态变量 --共享一块储存区

 public class T{

   static int i=1;

  static void runs(){

     i++;

}

 main(){

  T t1,t2;

  system,out.printer(t1.i+","+t2.i);

   t1.runs();

  system.out.printer(t1.i+","+t2.i);

}

}

输出的是: 1, 1

                     2,2

可见它调用t1的runs方法,但是在t2中的变量i也取得是那个值

静态块:

public class Value3 {    static int c = 0;        Value3(){     c = 15;    }        Value3(int i){     c = i;    }        static void inc(){     c++;    }    }

public class Count {  public static void prt(String s){  System.out.println(s);  }     Value3 v = new Value3(10);   static Value3 v1,v2;   static{//此即为static块   System.out.println("v1.c="+v1.c+" v2.c="+v2.c);   v1 = new Value3(27);   System.out.println("v1.c="+v1.c+" v2.c="+v2.c);   v2 = new Value3(15);   System.out.println("v1.c="+v1.c +" v2.c="+v2.c);   }

   public static void main(String[] args) {Count ct =new Count();System.out.println("ct.c="+ct.v.c);System.out.println("v1.c="+v1.c + " v2.c="+v2.c);v1.inc();System.out.println("v1.c="+v1.c + " v2.c="+v2.c);System.out.println("ct.c="+ct.v.c);}}

在mian方法输出的是:

   v1.c=0 v2.c=0;

   v1.c=27 v2.c=27;

   v1.c=15 v2.c= 15     //static块会先运行!!!!

   ct.c=10  

   v1.c=10 v2.c=10

   v1.c=11 v2.c=11

   ct.c=11

  首先它在程序中先运行加载static块,所以在创建这个ct对象时,Count这个类会先执行一次static,所以会先得到结果v1.c=0 v2.c=0; 和v1.c=27 v2.c=27以及 v1.c=15 v2.c=15 之后才会运行ct.c的值

静态类

   通常普通类不允许申明为静态的,都是通过内部类来实现,这时这个静态类才可以做为一个普通类来使用,而不需要实例化一个外部类

public class StaticCls {

    public static void main(String[] args) {

       OuterCls.InnerCls oi = new OuterCls.InnerCls();

    }

}

 

class OuterCls {

    public static class InnerCls {

       InnerCls() {

           System.out.println("InnerCls");

       }

    }

    结果为:InnerCls

static修饰的变量叫静态变量或类变量,而不被static修饰的变量叫做实例变量

静态变量在类加载时,jvm只为静态分配一次内存,它在内存中只有一个拷贝(节省内存),可通过类名直接点(访问)

实例变量是在每创建一个实例,就会为它分配一次内存,实例变量在内存中会有多个,但是因为它们在栈中的引用地址不一样,它们相互互不影响。

static方法可以通过类名直接来使用,任何的实例都可以用来调用。因此静态方法不能用super和this关键字,因此static不能访问实例变量和方法(就是非static方法和变量)

因为static独立于任何的实例。因此static必须要被实现!


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表