zoukankan      html  css  js  c++  java
  • 浅析Java中的static关键字

    关键点

    《Java编程思想》对static方法的描述:“static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建对象的前提下,仅仅通过类本身来调用staic方法。这实际上正是static方法的主要用途。”

    虽然它只说明了static方法,但可以看出static关键字的主要作用:在没有创建对象的前提下,通过类本身来调用静态方法,访问静态域,获取静态常量;在类加载时执行静态块;导入包中的静态方法和静态常量。

    1.静态域(极少使用)

    如果将域定义为static,每个类中只有一个这样的域。而每一个对象对于所有的实例域却都有自己的一份拷贝。

    class Student{
    private static String faculty = "计算机学院";
    ...
    }

    如上,如果这个类创建了多个Sutdent实例,所有实例将共享这个faculty;即便没有对象,静态域也存在,它属于类,不属于任何独立的对象。

    2.静态常量(常用)

    与非静态常量的不同在于,每个类的实例都有一份普通常量,而整个程序中只存在一份静态常量。

    public final int Year = 2015;
    public static final int Year = 2015;  //更节省空间

    3.静态方法

    静态方法是一种不能向对象实施操作的方法,它没有this参数,不能访问实例域。通过class.method来调用。(也可以像调用实例方法使用object.method来调用,但不推荐)

    class Student{
      ...
      public static String getFaculty() {
         return faculty;
      }
      ...
    }
    //Student.getfaculty()   使用class.method调用

    在以下情况下使用静态方法:

    1)一个方法不需要访问对象状态,其所有参数都是通过显示参数提供

    2)一个方法只需要访问类的静态域

    限制

    1)不可升级,重写

    2)固定占用内存,不被释放

    4.静态块

    特点:类加载时,对象创建之前执行,在整个应用程序的生命周期只执行一次。

    public class Test {
        public static void main(String[] args){
            mytest a = new mytest();
            mytest b = new mytest();
        }
    }
    
    class mytest{
        static {
            System.out.println("静态块执行");
        }
        public mytest(){
            System.out.println("构造器执行");
        }
    }
    执行结果:

    静态块执行
    构造器执行
    构造器执行

    5.静态导入

    使用import static xxx来导入静态方法和静态常量

    import static java.lang.System.out;
    out.println("hello world!");  //可使用out而不用System.out

    代码实例:

     1 import java.util.Random;
     2 
     3 import static java.lang.System.out;     //静态导入
     4 
     5 class StuentTest
     6 {
     7     public static void main(String[] args) {
     8         Student[] test = new Student[3];
     9         test[0] = new Student("张三","20151000153","01",3.4);
    10         test[1] = new Student("李四","20150000231","02",2.9);
    11         test[2] = new Student("王五","20151000462","03",4.2);
    12 
    13         double average = 0;
    14         for (Student i:test) {
    15             out.println(i.getName() +' '+Student.Year+' '+Student.getFaculty()+' '+Student.getFacilty_id()+' '+ i.getStu_id()+' ' + i.getClass_id()+' ' + i.getGpa());
    16             //类名.方法名调用静态方法,获取静态常量
    17             average += i.getGpa();
    18         }
    19         out.println("average_gpa:" + average/3);
    20         Student.setFaculty("艺术与传媒学院");  //改变静态常量
    21         for(Student i:test){
    22             out.println(i.getName()+' '+Student.getFaculty());
    23         }
    24     }
    25 }
    26 
    27 class Student
    28 {
    29     private String name;
    30     public static final int Year = 2015;    //静态常量
    31     private static String faculty = "计算机学院";    //静态变量
    32     private static int facilty_id;
    33     private String stu_id;
    34     private String class_id;
    35     private double gpa;
    36 
    37     //静态块
    38     static {
    39         Random generator = new Random();
    40         facilty_id = generator.nextInt(19);
    41     }
    42 
    43     public Student(String name,String stu_id,String class_id,double gpa) {
    44         this.name = name;
    45         this.stu_id = stu_id;
    46         this.class_id = class_id;
    47         this.gpa = gpa;
    48     }
    49 
    50     public static String getFaculty() {
    51         return faculty;
    52     }
    53 
    54     public static int getFacilty_id()
    55     {
    56         return facilty_id;
    57     }
    58 
    59     public String getName() {
    60         return name;
    61     }
    62 
    63     public String getStu_id() {
    64         return stu_id;
    65     }
    66 
    67     public String getClass_id() {
    68         return class_id;
    69     }
    70 
    71     public double getGpa(){
    72         return gpa;
    73     }
    74 
    75     public static void setFaculty(String str){
    76         faculty = str;
    77     }
    78 }

    执行结果:

    张三 2015 计算机学院 7 20151000153 01 3.4
    李四 2015 计算机学院 7 20150000231 02 2.9
    王五 2015 计算机学院 7 20151000462 03 4.2
    average_gpa:3.5
    张三 艺术与传媒学院
    李四 艺术与传媒学院
    王五 艺术与传媒学院

  • 相关阅读:
    GC 的认识
    SSRF 攻击技术
    文件包含漏洞
    文件的上传和下载
    XSS
    SQL注入工具 sqlmap
    自动化测试框架
    mac配置环境变量
    pycharm与git想集成 上传下载代码
    测试人员需要掌握的linux基本操作
  • 原文地址:https://www.cnblogs.com/lht-record/p/8325068.html
Copyright © 2011-2022 走看看