java基础知识—java中static修饰符
2015-07-19 15:09
316 查看
static:表示“全局”或者“静态”的意思,开用来修饰变量、方法、代码块。
1.静态变量
按照是否静态对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量;另一种是没有被static修饰的变量,叫实例变量。
两者的区别是:
(1).对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态变量分配一次内存,它当且仅当在类初次加载时会被初始化,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。static成员变量的初始化顺序按照定义的顺序进行初始化。
(2).对于实例变量,每创建一个实例,就会为实例变量分配一次内存,在创建对象的时候被初始化,实例变量可以在内存中有多个拷贝,互不影响(灵活)。
类加载的过程,类本身也是保存在文件中(字节码文件保存着类的信息)的,java会通过I/O流把类的文件(字节码文件)读入JVM(java虚拟机),这个过程成为类的加载。JVM(java虚拟机)会通过类路径(CLASSPATH)来找字节码文件。
类变量,会在加载时自动初始化,初始化规则和实例变量相同。
2.static修饰方法
当static修饰方法时,我们称它为静态方法,此时这个方法成为整个类所公有的方法,可以用类名.方法名访问,也可以通过实例调用。
在使用静态方法时,需要注意以下几点:
(1)static修饰的方法,不直接能访问本类中的非静态(static)成员(包括方法和属性),本类的非静态(static)方法可以访问本类的静态成员(包括方法和属性),可以调用静态方法(下图)。静态方法要慎重使用。在静态方法中不能出现this和super关键字。它不依附于任何对象,既然都没有对象,就谈不上this了。
(2)父类中是静态方法,子类中不能覆盖为非静态方法,在符合覆盖规则的前提下,在父子类中,父类中的静态方法可以被子类中的静态方法覆盖,但是没有多态。
(3)父子类中,静态方法只能被静态方法覆盖,父子类中,非静态方法只能被非静态方法覆盖。
(4)因为static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract。
3.static代码块
static关键字还有一个比较关键的作用就是
用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。
1.静态变量
按照是否静态对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量;另一种是没有被static修饰的变量,叫实例变量。
两者的区别是:
(1).对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态变量分配一次内存,它当且仅当在类初次加载时会被初始化,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。static成员变量的初始化顺序按照定义的顺序进行初始化。
(2).对于实例变量,每创建一个实例,就会为实例变量分配一次内存,在创建对象的时候被初始化,实例变量可以在内存中有多个拷贝,互不影响(灵活)。
public class Test{ public static final int age=10; public static void main(String[] args){ System.out.println(Test.age);//类名.变量 Test test=new Test(); System.out.println(test.age);//类的实例.变量 } }
类加载的过程,类本身也是保存在文件中(字节码文件保存着类的信息)的,java会通过I/O流把类的文件(字节码文件)读入JVM(java虚拟机),这个过程成为类的加载。JVM(java虚拟机)会通过类路径(CLASSPATH)来找字节码文件。
类变量,会在加载时自动初始化,初始化规则和实例变量相同。
2.static修饰方法
当static修饰方法时,我们称它为静态方法,此时这个方法成为整个类所公有的方法,可以用类名.方法名访问,也可以通过实例调用。
在使用静态方法时,需要注意以下几点:
(1)static修饰的方法,不直接能访问本类中的非静态(static)成员(包括方法和属性),本类的非静态(static)方法可以访问本类的静态成员(包括方法和属性),可以调用静态方法(下图)。静态方法要慎重使用。在静态方法中不能出现this和super关键字。它不依附于任何对象,既然都没有对象,就谈不上this了。
(2)父类中是静态方法,子类中不能覆盖为非静态方法,在符合覆盖规则的前提下,在父子类中,父类中的静态方法可以被子类中的静态方法覆盖,但是没有多态。
(3)父子类中,静态方法只能被静态方法覆盖,父子类中,非静态方法只能被非静态方法覆盖。
(4)因为static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract。
3.static代码块
static关键字还有一个比较关键的作用就是
用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。
class Person{ private Date birthDate; public Person(Date birthDate) { this.birthDate = birthDate; } boolean isBornBoomer() { Date startDate = Date.valueOf("1990"); Date endDate = Date.valueOf("2000"); return birthDate.compareTo(startDate)>=0 && birthDate.compareTo(endDate) < 0; } }分析发现,该程序的功能是判断一个人是不是1990-2000年出生的,而每次isBornBoomer被调用的时候,都会生成startDate和birthDate两个对象,造成了空间浪费,如果改成这样效率会更好:
class Person{ private Date birthDate; private static Date startDate,endDate; static{ startDate = Date.valueOf("1946"); endDate = Date.valueOf("1964"); } public Person(Date birthDate) { this.birthDate = birthDate; } boolean isBornBoomer() { return birthDate.compareTo(startDate)>=0 && birthDate.compareTo(endDate) < 0; } }很多时候会将一些只需要进行一次的初始化操作都放在static代码块中进行。而不需要没判断一个类的对象,都要生成生成startDate和birthDate两个对象,大大节省了空间。
相关文章推荐
- struts2学习笔记(一)
- java创建二叉树并递归遍历二叉树
- Hadoop2.6.0学习笔记(二)MapReduce通过Eclipse运行
- javaweb webSocket 实现简单的点对点聊天功能
- Spring事务详解(转)
- javaweb webSocket 实现简单的点对点聊天功能
- java中反射的小结
- 杭电oj 2200 Eddy's AC难题 Java
- Java内存区域分配、存储、垃圾回收策略与回收机制(深入JVM虚拟机)
- java基础总结
- poj 1405 Heritage java 高精度
- hoj 1368 Very Simple Arithmetic java 高精度
- eclipse常用快捷键
- java知识
- javaAPI(字节流,打印流)
- Java知识点
- Java 学习笔记(2015.7.13~17)
- Eclipse插件开发步骤和两个内存分析工具
- (图文)在MyEclipse(2015)中上传项目到github的步骤(很详细)
- struts2框架工作大体流程