static
在《Java编程思想》P86页有这样一段话:
“static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。”
这段话虽然只是说明了static方法的特殊之处,但是可以看出static关键字的基本作用,简而言之,一句话来描述就是:
方便在没有创建对象的情况下来进行调用(方法/变量)。
很显然,被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问。
static可以用来修饰类的成员方法、类的成员变量,另外可以编写static代码块来优化程序性能。
static class
一般情况下是不可以用static修饰类的。如果一定要用static修饰类的话,通常static修饰的是匿名内部类。
在一个类中创建另外一个类,叫做成员内部类。这个成员内部类可以静态的(利用static关键字修饰),也可以是非静态的
public class MainInStaticClass {
static class Main{
static void main() {
//将主方法写到静态内部类中,从而不必为每个源文件都这种一个类似的主方法
new MainInStaticClass().print();
}
}
static方法
- static方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了。并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。
- 但是要注意的是,虽然在静态方法中不能访问非静态成员方法和非静态成员变量,但是在非静态成员方法中是可以访问静态成员方法/变量的
- 调用时直接类名.方法 不用在实例化 MyObject.print2();
package testP.test;
class Person {
private static boolean name;
protected String age;
protected String sex;
String how;
public Person() {
name = false;
}
static String getName() { //静态方法
String age1 = age; // 报错了,不是static变量
boolean name1 = name;
}
}
static变量
- static变量也称作静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。
- static成员变量的初始化顺序按照定义的顺序进行初始化。
static代码块
- static关键字还有一个比较关键的作用就是 用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。
- 注意如果有构造函数和static同时使用时,先调用static,然后调用构造函数
实例
package testP.test;
class Person {
private static boolean name;
protected String age;
protected String sex;
String how;
Person() {
System.out.println("Person默认构造函数");
}
static {
System.out.println("Person静态代码显示框");
}
static String getName() {
return name?"真数据":"假数据";
}
}
package testP.test;
public class son2 {
public son2() {
System.out.println("son2默认构造函数");
}
static {
System.out.println("son2的静态代码");
}
public static void main(String[] args) {
son2 s = new son2();
System.out.println(Person.getName());
}
}
结果为:
son2的静态代码
son2默认构造函数
Person静态代码显示框
假数据
- 结果没有调用Person类里面的构造函数,因为构造函数是要在类被实例化后才会被执行
final
如果一个类不允许其子类覆盖某个方法,则可以把这个方法声明为final方法。
final方法
使用final方法的原因有二:
- 第一、把方法锁定,防止任何继承类修改它的意义和实现。
- 第二、高效。编译器在遇到调用final方法时候会转入内嵌机制,大大提高执行效率。
final 类
- final类不能被继承,因此final类的成员方法没有机会被覆盖,默认都是final的。在设计类时候,如果这个类不需要有子类,类的实现细节不允许改变,并且确信这个类不会载被扩展,那么就设计为final类。
static和final一起
static final用来修饰成员变量和成员方法,可简单理解为“全局常量”! 对于变量,表示一旦给值就不可修改,并且通过类名可以访问。 对于方法,表示不可覆盖,并且可以通过类名直接访问。
http://www.cnblogs.com/dolphin0520/p/3799052.html
http://blog.163.com/fanning_7213/blog/static/24965052010731270601/