zoukankan      html  css  js  c++  java
  • 二、Java面向对象(5)_static修饰符

    2018-04-29

    树欲静而风不止 

    static修饰符

    static修饰符表示静态的,该修饰符可以修饰字段、方法、内部类使用该关键字修饰的内容,在面向对象中static修饰的内容是隶属于类,而不是直接隶属于对象的,所以static修饰的成员变量一般称作类成员变量,而static修饰的方法一般称作类方法。

     

    static修饰符的特点:

      1)static修饰的成员(字段/方法),随着所在类的加载而加载。

        当JVM把字节码加载进JVM的时候,static修饰的成员已经在内存中存在了。

      2)优先于对象的存在。

        对象是我们手动通过new关键字创建出来的。

      3)satic修饰的成员被该类型的所有对象所共享。

        根据该类创建出来的任何对象,都可以访问static成员。

          分析:表面上通过对象去访问static成员,其本质依然使用类名访问,和对象没有任何关系(通过反编译可以看到)。

      4)直接使用类名访问static成员 。

        因为static修饰的成员直接属于类,不属于对象,所以可以直接使用类名访问static成员。

    类成员和实例成员的访问

      1)类成员:使用static修饰的成员。

      2)实例成员:没有使用static修饰的成员。

      3)static方法中,只能调用static成员。无法从静态上下文中引用非静态变量

      4)非static方法可以访问静态成员,也可以访问实例成员。

      -----------------------------------------------------------------------------------

      类成员只能访问类成员,实例成员只能访问实例成员

      -----------------------------------------------------------------------------------

      类成员直接属于类,可以通过类来访问static字段和static方法。

      实例成员只属于对象,通过对象来访问非static字段和非static方法(对象其实可以访问类成员,但是底层依然使用类名访问的)。

     

    静态与非静态的区别:

    (1)

    非静态成员变量又称为实例变量。

    静态成员变量又称为类变量。 

    (2)

    非静态成员变量,随着对象的创建而存在,随着对象的消失而消失。

    静态成员变量,随着类的加载而存在,随着类的消失而消失。

    (3)

    非静态变量存在于对象堆内存中。

    静态变量存在于方法区中。

    (4)

    非静态变量只能被对象所调用。

    静态变量可以被类名调用,也可以被对象调用。 

    什么时候定义成static的字段和方法:

      如果这个一个状态或行为属于整个事物(类),就直接使用static修饰,被所有对象所共享。 在开发中,往往把工具方法使用static修饰。如果不使用static修饰,则这些方法属于该类的对象,我们得先创建对象再调用方法,在开发中工具对象只需要一份即可,可能创建N个对象,此时我们往往把该类设计为单例的,但还是有点麻烦。所以,一般在开发中设计工具方法,为了调用简单,我们使用static修饰。

     

    static成员在JVM中的存储:

    代码举例:

     1 class Person
     2     {
     3         String name;//名字
     4         int age;//年纪
     5 
     6         static int totalNum = 5;//人类总人数5
     7 
     8         //构造函数
     9         Person(String n, int a){
    10             name = n;//将n赋给name
    11             age = a;//将a赋给age
    12             totalNum++;
    13         }
    14 
    15         void die(){
    16             totalNum--;
    17             System.out.println("死亡");
    18         }
    19 
    20         //只有人类才有毁灭
    21         static void destory(){
    22             totalNum = 0;
    23             System.out.println("人类毁灭");
    24         }
    25     }
    26 
    27 
    28 //演示static修饰符
    29 class PersonDemo2
    30 {
    31     
    32         public static void main(String[] args) 
    33         {
    34             System.out.println(Person.totalNum);
    35             Person p1 = new Person("张三",10);
    36             Person p2 = new Person("李四",5);
    37             System.out.println(Person.totalNum);//使用类调用对象
    38 
    39             p2.die();//p2死亡
    40             System.out.println(Person.totalNum);
    41 
    42             Person.destory();
    43             System.out.println(Person.totalNum);
    44     }
    45 }

    输出结果:

  • 相关阅读:
    Codeforce Round #215 Div2 C
    Facebook Hacker Cup 2014 Qualification Round
    Codeforce Round #214 Div2
    Codeforce Round #213 Div2
    FOJ 2013 11 月赛
    Codeforce Round #211 Div2
    Codeforce Round #210 Div2
    如何下载spring-framework
    [转]大型网站系统架构的演化
    sql查询,如何增加一列
  • 原文地址:https://www.cnblogs.com/sunNoI/p/8972457.html
Copyright © 2011-2022 走看看