java基本语法-static关键字

    xiaoxiao2021-03-25  20

    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必须要被实现!

    转载请注明原文地址: https://ju.6miu.com/read-150165.html

    最新回复(0)