- static
- static variable
- java中的static关键字可以修饰类成员field(成员变量和成员函数)。当一个类field被声明为static,表示在该field只会在类的生命周期中存在一个实体(或者说体现),无论有多少该类的实例被创建。
- 使用static声明的field被称为类(静态)成员,没有用static声明的field称为实例成员。
- 静态成员可以使用类名(class)调用,也可以使用实例名(instance)调用,而非静态成员只能用实例名调用
- 静态变量只初始化一次,并为所有类实例共享
- 语法:Class.variable
- static variable
<span style="white-space:pre"> </span>class Point {
<span style="white-space:pre"> </span>int x, y, useCount;
<span style="white-space:pre"> </span>public Point(int x, int y) { this.x = x; this.y = y;}
<span style="white-space:pre"> </span>static final Point origin = new Point(0, 0);
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>public class StaticTest {
<span style="white-space:pre"> </span>public static void main(String[] args) {
<span style="white-space:pre"> </span>Point p = new Point(1,1);
<span style="white-space:pre"> </span>Point q = new Point(2,2);
<span style="white-space:pre"> </span>p.x = 3;
<span style="white-space:pre"> </span>p.y = 3;
<span style="white-space:pre"> </span>p.useCount++;
<span style="white-space:pre"> </span>p.origin.useCount++;
<span style="white-space:pre"> </span>System.out.println("(" + q.x + "," + q.y + ")");
<span style="white-space:pre"> </span>System.out.println(q.useCount);
<span style="white-space:pre"> </span>System.out.println(q.origin == Point.origin);
<span style="white-space:pre"> </span>System.out.println(q.origin.useCount);
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
-
- static method
- 静态方法属于类,不属于实例
- 静态方法中只能使用静态变量,对于非静态数据必须通过新建实例进行调用
- 静态方法中只能调用静态方法,对于非静态方法必须通过新建实例进行调用
- 可以通过类名直接调用静态方法,语法:Class.methodName()
- 静态方法不能使用this和super关键字进行调用
- static method
-
- static blocks of code
在Java的语法中,可以使用{ }包含一些代码来进行执行。根据代码块的位置的不同,将代码块分为:
- 普通代码块
- 构造代码块
- 静态代码块
这三种的区别是:
- 普通代码块:存在于方法或者语句中
<span style="white-space:pre"> </span>public static void main(String[] args){
{
int a = 1;
System.out.println(a);
}
int b = 2;
System.out.println(b);
<span style="white-space:pre"> </span>}
普通代码块的执行顺序与代码的先后顺序一致。由此可见有没有{ },程序的执行都相同。
- 构造代码块:直接存在于类的声明中
<span style="white-space:pre"> </span>public class Test{
{
System.out.println(“构造代码块”);
}
public Test(){
System.out.println(“构造方法”);
}
...
<span style="white-space:pre"> </span>}
构造代码块在每次类进行实例化时执行,并且执行次序优于构造方法。
- 静态代码块:在构造代码块中加上static关键字就是静态代码块
静态代码块在JVM加载类时执行,优先于构造方法和主方法,而且只执行一次。
静态代码块的用处:按理说,代码块可以使用在任何合适的地方,不过一般会用于数据库连接、API初始化和日志初始化等等。
-
- static nested class
- 具体内容见nested classes
- static nested class
- final
- final fields
- final修饰静态变量必须在声明时给予初始值,final static修饰的原始变量或者String变量在编译时会转换为常量
- final修饰的变量必须在声明时给予初始值 或者 在构造方法中进行复制,最终的意思就是final修饰的变量必须在实例对象创建时有初始值
- final fields
-
- final methods
- final修饰方法是为了阻止子类复写或者覆盖该方法
- final methods
-
- final classes
- final修饰类是因为该类的定义是完整的,不希望也不需要有子类
- final修饰的类中的方法也是final的
- final不能和abstract同时修饰一个类,final修饰的类是功能完整的,而abstract修饰的类是功能不完整的,两个关键字是相冲突的,显而易见,是不能同时使用的
- final classes
- abstract
- abstract methods
- abstract修饰的方法必须是在abstract修饰的类中,或者在enum中声明
- 继承abstract类的非abstract子类必须实现该abstract类中abstract方法
- abstract方法可以被覆盖
- abstract methods
-
- abstract classes
- abstract类是不完整的或者被认为是不完整的
- abstract类不能创建实例
- abstract类的非abstract子类可以进行实例化,与此同时abstract父类的构造器和实例变量会执行或者进行初始化
- abstract类中可以没有abstract方法,但是有abstract方法的类必须是abstract类
- abstract classes
- transient
- transient fields
- transient关键字的作用是将那些会被系统服务(system service)进行持久化的类中某些字段排除在外
- 这种系统服务比较常见的就是Java序列化,序列化会把实例对象持久化,而transient修饰的字段将不会被持久化
- 参考博客:http://www.cnblogs.com/lanxuezaipiao/p/3369962.html
- transient fields
- volatile
- volatile fields
- volatile的目的是线程安全,对于两个或多个线程同时对一个变量进行操作时,volatile会使变量保持一致性,也就是说volatile修饰的变量,一个时刻只能有一个线程对其操作。
- volatile不能和final同时使用
- volatile fields
- synchronized
- synchronized methods
- synchronized的作用和volatile差不多,只不过synchronized修饰的是method,很难用一句话两句话说明它与volatile的联系和区别,需要研究很透彻,还是查考一些博客吧:http://www.ibm.com/developerworks/cn/java/j-jtp06197.html
- synchronized methods