标题 | Java语言中static关键词应用解析 |
范文 | 张会 摘要: 介绍了static关键词定义Java类变量,类方法及初始化器,static在main()方法和单例设计模式中的应用,使Java编程人员对static关键词的使用有更深入的理解,并能灵活应用于Java编程中。 关键词:static;单例设计模式;类变量;类方法 中图分类号:TP393 文献标识码:A 文章编号:1009-3044(2017)33-0102-02 在Java中,static关键词可用来修饰类的成员变量,成员方法及代码块,用static关键词修饰的类变量和类方法存储于方法区,而方法区中数据和方法只存在一份,因此static修饰的成员变量和成员方法能被所有对象共享。类中static成员是随着类加载器加载类的时候加载一次,因此static成员与类的生命周期一致,所以类中的static成员可以通过类名直接引用。 1 static修饰类成员 类成员是指用static修饰的变量和方法。由static修饰定义的静态变量和静态方法,既可通过类的实例对象引用,也可通过类名引用,正是因为static成员可以通过类名直接引用,因此把用static修饰的成员变量和成员方法称为类变量和类方法。 1.1 类变量 类变量也叫静态变量,也就是在类中加了static修饰的成员变量,类变量不专属于任何一个具体的对象,被所有对象共用。通常将类的共享数据用static定义成类变量,而其他属性定义为实例变量,把类中定义时没加static的成员变量称为实例变量。类变量与实例变量的区别有: 1) 类变量是随类的加载而存在,随着类的消失而消失,其与类的生命周期相同;而实例变量是随着对象的创建而存在,随着对象被JVM(Java虚拟机)垃圾回收器回收而消失; 2) 类变量是存储在方法区内存中,而且只存在一份数据,用于所有对象共享;实例变量是存储在堆内存中,有n个对象就有n份数据。 3) 类变量共享数据给所有的对象使用,可以被类名直接访问;实例变量是在对象实例化后才分配堆空间,故不能被类名直接访问,只能使用对象进行访问。 public class Student1 { String name; int num; static int count; public Student1(String name, int num) { this.name = name; this.num = num; count++;} public static void main(String[] args) { Student1 stu1 = new Student1("張丽", 101); Student1 stu2 = new Student1("孙力", 102); System.out.println("创建的学生对象个数有:" + Student1.count+"名");}} 运行结果:创建的学生对象个数有:2名 在Student1类中,用static定义了count类变量,该变量被Student1创建的所有对象共同使用。在Student1类的构造函数中的count++实现了,每创建一个Student1对象,共享类变量count的值会自动加1,从而实现了用一个共享的类变量来统计所实例化的学生人数。 1.2 类方法 类方法是指类中的方法前面加了static进行修饰的成员方法。类方法的调用与类变量的使用相似,可以通过类名进行调用。在static定义的类方法中,只能直接访问类中的类变量和类方法。类方法在类被加载到内存时就分配了入口地址,实例方法(类中定义时没加static 的成员方法)是在对象实例化后才分配入口地址或实例变量的堆空间,因此类方法中不能直接访问实例变量或者实例方法,另外在类方法中也不能使用代表对象的this和super关键词,但是在类方法中可以通过实例化对象去引用类的实例成员。 public class Student2 { String name; int num; double score; static double sum; static int count; public Student2(String name,double score){ this.name=name; this.score=score; sum+=score; count++;} public static double average(){ return sum/count;} public static void main(String[] args) { Student2 stu[]={new Student2("张丽",80),new Student2("孙力",90)}; System.out.println("average:"+Student2.average());}} 运行结果:average:85 以上Student2类中定义了两个类变量sum和count,sum用来存放创建的所有学生对象的总成绩,count用来统计创建学生对象个数。在构造函数中使用sum+=score;count++;语句实现在新建对象时累加新建学生对象的成绩及统计新建学生对象人数。同时在类中定义了一个静态方法static double average()用于求所创建的所有学生的平均成绩,由于所计算出的平均成绩不属于某一个对象的,而是属于类,通过类去调用更合适,所以将此方法定义成类方法。 通常当一个函数没有直接访问实例成员而只是直接访问类成员时,该函数可以使用static定义成类方法。 在实际的应用中static方法的定义多用于工具类中方法的定义。如Math,Arrays等工具类中的方法都是static,其中的类方法都是通过类进行调用。 1.3 初始化器 初始化器是一段不在方法之内的程序代码,这段代码用{}包围起来。初始化器分成静态和非静态初始化器。非静态初始化器,在实例化对象时执行,一般用于初始化实例变量,静态初始化器仅在类加载入内存时执行一次,一般用于初始化类变量[1]。 下面代码中用于实现对新创建的学生进行学号自动连续编号并计数功能。其中静态初始化器实现对count(用于计数),nexNum(用于学号递增)和year(表示入学年份)三个类变量进行初始化。而非静态代码块实现对新生成的学生学号进行连续编号并统计创建学生的人数。 public class Student { private String name; private int num; private static int nextNum; private static int count; private static int year; static { //静态初始化器 类被加载时执行,仅被执行一次 count=0; //学生人数计数器初始化 nextNum=10804000; //学号自增变量初始化 year =2017; //入学年份初始化 } {//非静态初始化器:每实例化一个对象时,都会被执行 count++; nextNum++; num=nextNum; } //为每个新建学生学号使用nextNum的值进行连续编号 public Student(String name){ this.name=name;} public String toString() { return "name=" + name + " num="+year+num;} public static void main(String[] args) { Student stu[]={new Student("张丽"), new Student("孙力"), new Student("王琴")}; for(int i=0;i System.out.println(stu[i]);}} 运行结果:name=张丽 num=201710804001 name=孙力 num=201710804002 name=王琴 num=201710804003 2 static关键词在单例设计模式中的应用 Java中单例设计模式是指一个类有且仅有一个实例,并且是在类中生成唯一实例对象。单例设计模式通过定义private的构造函数来阻止在类外生成实例对象,从而限制了对象的实例化只能在类中实现。单例设计模式使用了工厂方法来限制实例化过程,这个工厂方法即是静态方法(类方法)[2]。 下面代码是饿汉单例设计模式: public class Single{ //声明本类的私有引用类型变量,并且使用该变量指向本类实例化对象 private static Single s = new Single(); //私有化构造函数,无法在类外实例化对象 private Single(){} //提供一个公共静态的方法(类方法)获取本类的对象 public static Single getInstance(){ return s;}} 在Single类中,定义了一个Single类的静态引用变量s,同时通过new进行对象的实例化,因为该类成员变量s使用了static进行修饰,所以在类加载入内存时就会生成实例化对象。由于类中定义了一个private的构造函数,因此在类外不能通过Single类实例化任何Single对象,同时由于构造函数是私有的,所以该类是不能被继承,因此也不能通过该类的子类生成该类对象,从而保证该类中s对象的唯一性。由于在类外无法生成对象,而又需要使用该类提供的私有类对象,故该类提供了一个公用的静态(static)方法getInstance()来获得类中生成的唯一实例对象,并且该方法只能通过类名调用。由于类中的唯一对象在类被加载到内存时就生成,故将此种生成方式称为饿汉模式,此种模式生成的实例对象是线程安全的。 单例设计模式的核心作用就是保证一个类有且只有一个实例,通过提供一个全局访问点来访问这个实例对象[3]。此访问点即是类中提供的公用的static方法来实现。由于单例设计模式确保类只生成一个实例对象,在实例化之后向整个系统提供这个实例,所以在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序经常被设计成单例[4]。 常见的单例设计模式有:饿汉式、懒汉式、双重检测锁式、静态内部类式、枚举单例式,而本文是为了综合介绍static在java程序设计中的应用,故其他单例模式在此不进行介绍。 3 static 关键词在main()中的应用 一个Java Application執行的入口函数是main()函数。main()函数的首部声明形如:public static void main(String args[]), main()函数声明为static类型,是为了让Java虚拟机调用main()函数时更加方便,不需要通过实例化进行调用,而是通过Java虚拟机直接调用。 4 结束语 本文介绍了static修饰的成员变量、成员方法,用于实现对所有对象共享;static修饰代码块,实现对类变量进行初始化,从而构成类初始化器,在文中示例代码里通过static初始化器完成了对新建对象计数,自动编号等功能。另外还介绍了static用于单例设计模式生成类的唯一实例及应用于Java Application的执行入口函数main()函数。通过对static在Java Application中应用介绍,使Java程序员综合了解static特性,并能灵活运用于Java程序开发中。 参考文献: [1] 王振飞,孙嫒.Java语言程序设计[M].广州:华南理工大学出版社,2015. [2] 钟冠贤.Objective-C编程之道 iOS设计模式解析[M].北京:人民邮电出版社,2011:80. [3] 陈天超.单例设计模式研究[J].福建电脑,2016,32(8):14-15. [4] 夏浩波.单例模式的设计与应用[J].电脑开发与应用,2011,24(1):58-59. [5] 王丽丽.Java中的static关键词详解[J].学术探讨,2010,20(10):270-272. |
随便看 |
|
科学优质学术资源、百科知识分享平台,免费提供知识科普、生活经验分享、中外学术论文、各类范文、学术文献、教学资料、学术期刊、会议、报纸、杂志、工具书等各类资源检索、在线阅读和软件app下载服务。