在java中,static的用法以我现有的了解有以下3中:
1、修饰成员变量:如果一个成员被声明为static,它就能在类的任何对象创建之前被访问,而不必引用任何对象。声明为static的变量实质上就是全局变量,当声明一个对象时,并不产生static变量的拷贝,而是所有该类的实例变量共用同一个static变量;
2、修饰成员方法:如果一个成员被声明为static,它就能在类的任何对象创建之前被访问,而不必引用任何对象。声明为static的方法有以下几条限制:
它们仅能调用其他的static方法;
它们只能访问static数据;
它们不能以任何方式引用this或者super。
3、修饰一个内部类(是否能修饰普通类有待考证):
静态内部类和非静态内部类的区别:
在非静态内部类中不可以声明静态成员,也就是说只有静态内部类才能定义静态的成员变量和成员方法;
非静态内部类可以随意访问外部类中的成员变量和方法,即使这些成员被修饰为private。但不能从静态内部类的对象中访问外部类的非静态成员变量和方法;
非静态内部类的实例一定要绑定在外部类的实例中,即在创建非静态内部类之前要先在外部类中要利用new关键字来创建这个内部类的对象,非静态内部类的对象是依附在外部类对象之中的;但在定义静态内部类的时候,是不需要定义绑定在外部类的实例上的,即要在一个外部类中定义一个静态的内部类,不需要利用关键字new来创建内部类的实例。例如:
静态内部类:
- package
innerClass; - public
class OutClass1 { -
public int oid; -
public String oname; -
public static class InnerStaticClass1{ -
public int iid; -
public String iname; -
} - }
- package
innerClass; - import
innerClass.OutClass1.InnerStaticClass1; - public
class Test1 { -
public static void main(String[] args) { -
OutClass1 oc=new OutClass1(); -
InnerStaticClass1 ic=new InnerStaticClass1(); //不依赖与外部类的实例 -
} - }
非静态内部类:
- package
innerClass; - public
class OutClass2 { -
public int oid; -
public String oname; -
public class InnerClass2 -
{ -
public int iid; -
public String iname; -
} - }
- package
innerClass; - public
class Test2 { -
public static void main(String[] args) { -
OutClass2 oc=new OutClass2(); -
OutClass2.InnerClass2 ic=oc.new InnerClass2(); //依赖与外部类的实例 -
} - }