一、static关键字
static关键字在类中可以声明属性或方法。声明的属性将称为全局属性,声明的方法将成为类方法。
static的使用注意
1、静态方法和静态变量是属于某一个类,而不属于类的对象。
2、静态方法和静态变量的引用直接通过类名引用。
3、使用static声明的方法,不能访问非static的操作(属性或方法)
4、非static声明的方法,可以访问static声明的属性或方法
原因:
1、 如果说现在一个类中的属性或方法都是非static类型的,肯定是要有实例化对象才可以调用。
2、 static声明的属性或方法可以通过类名称访问,可以在没有实例化对象的情况下调用。
当一个实例化对象产生之后,可以调用所有的非static的操作,那么肯定也就可以调用所有的static操作。
1.1、静态数据
在我们创建一个类的实例时(对象),通常使用new方法,这样这个类的数据空间才会被创建,其方法才能被调用。但是,有时候我们希望一个类虽然可以被创建n个对象(显然这n个对象的数据空间是不相同的),但这n个对象的某些数据是相同的,即不管这个类有多少的实例,这些数据对这些实例而言之有一份内存拷贝,这是静态变量的情形。
public class TStatic { static int i; public TStatic() { i = 4; } public TStatic(int j) { i = j; } public static void main(String args[]) { System.out.println(TStatic.i); TStatic t = new TStatic(5); // 声明对象引用,并实例化。此时i=5 System.out.println(t.i); TStatic tt = new TStatic(); // 声明对象引用,并实例化。此时i=4 System.out.println(t.i); System.out.println(tt.i); System.out.println(t.i); } } /*Output 0,5,4,4,4 */
1.2、静态方法
望某个方法不与包含它的类的任何对象关联在一起。也就是说,即使没有创建对象,也能够调用这个方法。static方法的一个重要用法就是在不创建任何对象的前提下,这是静态方法的情形
class Singleton { private static final Singleton instance = new Singleton() ; // 在内部准备好一个对象 public static Singleton getInstance(){ // 将instance传递到外部去 return instance ; } private Singleton(){} public void print(){ System.out.println("Hello World!!!") ; } }; public class Test{ public static void main(String args[]){ Singleton s1 = Singleton.getInstance() ; Singleton s2 = Singleton.getInstance() ; Singleton s3 = Singleton.getInstance() ; s1.print() ; s2.print() ; s3.print() ; } };
单例设计模式中,当一个类中只能产生一个实例化对象的时候,就需要将构造方法封闭,封闭之后的操作通过一个静态方法取得本类的实例化对象,
1.3、静态初始化
静态块:使用static关键字声明的代码块,静态代码块在第一次加载类时执行,而且只执行一次,当访问类的静态属性或者方法,创建类对象,或者执行该类的main方法之前,都要加载类。可以用来为静态变量初始化。在主类中定义的静态块将优先于主方法main()执行。而且可以发现静态块优先于构造块执行.
class Cup { Cup(int marker) { System.out.println("Cup(" + marker + ")"); } void f(int marker) { System.out.println("f(" + marker + ")"); } } class Cups { static Cup cup1; static Cup cup2; static { cup1 = new Cup(1); cup2 = new Cup(2); } Cups() { System.out.println("Cups()"); } } public class ExplicitStatic { static { System.out.println("静态块在类加载时候执行"); } public static void main(String[] args) { System.out.println("Inside main()"); Cups.cup1.f(99); } } /* * Output: 静态块在类加载时候执行 Inside main() Cup(1) Cup(2) f(99) */
可以使用静态块“替代”掉main方法。
static { System.out.println("HelloWorld!!!") ; System.exit(1); }
二、final关键字
在Java中可以使用final关键字定义类、方法、属性:
2.1、Final数据
1、使用final声明的变量即成为常量,常量必须在声明处或者构造器内初始化。
2、在声明一个常量的时候所有的单词的字母都必须采用大写的形式出现,
3、在参数列表中以声明的方式将参数声明为final,意味着你无法在方法中更改参数引用指定的对象。
4、一个永不改变的编译时常量或者在运行时被初始化的值,并且不能改变
private static Random rand = new Random(47); private final int i = rand.nextInt(20);
2.2、Final方法
使用final声明的方法不能被子类所覆写
2.3、Final类
使用final关键字定义的类不能有子类