java中staticclass静态类详解
⼀般情况下是不可以⽤static修饰类的。如果⼀定要⽤static修饰类的话,通常static修饰的是匿名内部类。
在⼀个类中创建另外⼀个类,叫做成员内部类。这个成员内部类可以静态的(利⽤static关键字修饰),也可以是⾮静态的。由于静态的内部类在定义、使⽤的时候会有种种的限制。所以在实际⼯作中⽤到的并不多。
在开发过程中,内部类中使⽤的最多的还是⾮静态地成员内部类。不过在特定的情况下,静态内部类也能够发挥其独特的作⽤。
⼀、静态内部类的使⽤⽬的。
在定义内部类的时候,可以在其前⾯加上⼀个权限修饰符static。此时这个内部类就变为了静态内部类。不过由于种种的原因,如使⽤上的限制等等因素(具体的使⽤限制,笔者在下⾯的内容中会详细阐述),在实际⼯作中⽤的并不是很多。但是并不是说其没有价值。在某些特殊的情况下,少了这个静态内部类还真是不⾏。如在进⾏代码程序测试的时候,如果在每⼀个Java源⽂件中都设置⼀个主⽅法(主⽅法是某个应⽤程序的⼊⼝,必须具有),那么会出现很多额外的代码。⽽且最主要的时这段主程序的代码对于Ja
va⽂件来说,只是⼀个形式,其本⾝并不需要这种主⽅法。但是少了这个主⽅法⼜是万万不⾏的。在这种情况下,就可以将主⽅法写⼊到静态内部类中,从⽽不⽤为每个Java源⽂件都设置⼀个类似的主⽅法。这对于代码测试是⾮常有⽤的。在⼀些中⼤型的应⽤程序开发中,则是⼀个常⽤的技术⼿段。为此,这个静态内部类虽然不怎么常⽤,但是程序开发⼈员还必须要掌握它。也许在某个关键的时刻,其还可以发挥巨⼤的作⽤也说不定。
public class MainInStaticClass {
static class Main{
static void main() {
//将主⽅法写到静态内部类中,从⽽不必为每个源⽂件都这种⼀个类似的主⽅法
new MainInStaticClass().print();
}
}
public static void main(String[] args){
new MainInStaticClass().print();
}
public void print(){
System.out.println("main in static inner class");
}
}
public class TestMain {
public static void main(String[] args) {
// TODO Auto-generated method stub
// new MainInStaticClass().print();
MainInStaticClass.Main.main();
new MainInStaticClass.Main();
}
}
⼆、静态内部类的使⽤限制。
将某个内部类定义为静态类,跟将其他类定义为静态类的⽅法基本相同,引⽤规则也基本⼀致。不过其细节⽅⾯仍然有很⼤的不同。具体来说,主要有如下⼏个地⽅要引起各位程序开发⼈员的注意。
⼀是静态成员(包括静态变量与静态成员)的定义。⼀般情况下,如果⼀个内部类不是被定义成静态内部类,那么在定义成员变量或者成员⽅法的时候,是不能够被定义成静态成员变量与静态成员⽅法的。也就是说,在⾮静态内部类中不可以声明静态成员。如现在在⼀个student类中定义了⼀个内部类age,如果没有将这个类利⽤static关键字修饰,即没有定义为静态类,那么在这个内部类中如果要利⽤static关键字来修饰某个成员⽅法或者成员变量是不允许的。在编译的时候就通不过。故程序开发⼈员需要注意,只有将某个内部类修饰为静态类,然后才能够在这个类中定义静态的成员变量与成员⽅法。这是静态内部类都有的⼀个特性。也正是因为这个原因,有时候少了这个静态的内部类,很多⼯作就⽆法完成。或者说要绕⼀个⼤圈才能够实现某个⽤户的需求。这也是静态的内部类之所以要存在的⼀个重要原因。
⼆是在成员的引⽤上,有⽐较⼤的限制。⼀般的⾮静态内部类,可以随意的访问外部类中的成员变量与成员⽅法。即使这些成员⽅法被修饰为private(私有的成员变量或者⽅法),其⾮静态内部类都可以随意的访问。则是⾮静态内部类的特权。因为在其他类中是⽆法访问被定义为私有的成员变量或则⽅法。但是如果⼀个内部类被定义为静态的,那么在银⽤外部类的成员⽅法或则成员变量的时候,就会有诸多的限制。如不能够从静态内部类的对象中访问外部类的⾮静态成员(包括成员变量与成员⽅法)。这是什么意思呢?如果在外部类中定义了两个变量,⼀个是⾮静态的变量,⼀个是静态的变量。那么在静态内部类中,⽆论在成员⽅法内部还是在其他地⽅,都只能够引⽤外部类中的静态的变量,⽽不能够访问⾮静态的变量。在静态内部类中,可以定义静态的⽅法(也只有在静态的内部类中可以定义静态的⽅法),在静态⽅法中引⽤外部类的成员。但是⽆论在内部类的什么地⽅引⽤,有⼀个共同点,即都只能够引⽤外部类中的静态成员⽅法或者成员变量。对于那些⾮静态的成员变量与成员⽅法,在静态内部类中是⽆法访问的。这就是静态内部类的最⼤使⽤限制。在普通的⾮静态内部类中是没有这个限制的。也正是这个原因,决定了静态内部类只应⽤在⼀些特定的场合。其应⽤范围远远没有像⾮静态的内部类那样⼴泛。
三是在创建静态内部类时不需要将静态内部类的实例绑定在外部类的实例上。
通常情况下,在⼀个类中创建成员内部类的时候,有⼀个强制性的规定,即内部类的实例⼀定要绑定在外部类的实例中。也就是说,在创建内部类之前要先在外部类中要利⽤new关键字来创建这个内部
类的对象。如此的话如果从外部类中初始化⼀个内部类对象,那么内部类对象就会绑定在外部类对象上。也就是说,普通⾮静态内部类的对象是依附在外部类对象之中的。但是,如果成员开发⼈员创建的时静态内部类,那么这就⼜另当别论了。通常情况下,程序员在定义静态内部类的时候,是不需要定义绑定在外部类的实例上的。也就是说,要在⼀个外部类中定义⼀个静态的内部类,不需要利⽤关键字new来创建内部类的实例。即在创建静态类内部对象时,不需要其外部类的对象。
newMainInStaticClass.Main();
具体为什么会这样,⼀般程序开发⼈员不需要了解这么深⼊,只需要记住有这个规则即可。在定义静态内部类的时候,千万不要犯画蛇添⾜的错误。
从以上的分析中可以看出,静态内部类与⾮静态的内部类还是有很⼤的不同的。⼀般程序开发⼈员可以这么理解,⾮静态的内部类对象隐式地在外部类中保存了⼀个引⽤,指向创建它的外部类对象。不管这么理解,程序开发⼈员都需要牢记静态内部类与⾮静态内部类的差异。如是否可以创建静态的成员⽅法与成员变量(静态内部类可以创建静态的成员⽽⾮静态的内部类不可以)、对于访问外部类的成员的限制(静态内部类只可以访问外部类中的静态成员变量与成员⽅法⽽⾮静态的内部类即可以访问静态的也可以访问⾮静态的外部类成员⽅法与成员变量)。这两个差异是静态内部类与⾮静态外部类最⼤的差异,也是静态内部类之所以存在的原因。了解了这个差异之后,程序开发⼈员还需要知道,在什么
情况下该使⽤静态内部类。如在程序测试的时候,为了避免在各个Java源⽂件中书写主⽅法的代码,可以将主⽅法写⼊到静态内部类中,以减少代码的书写量,让代码更加的简洁。
总之,静态内部类在Java语⾔中是⼀个很特殊的类,跟普通的静态类以及⾮静态的内部类都有很⼤的差异。作为程序开发⼈员,必须要知道他们之间的差异,并在实际⼯作中在合适的地⽅采⽤合适的类。不过总的来说,静态内部类的使⽤频率并不是很⾼。但是在有⼀些场合,如果没有这个内部静态类的话,可能会起到事倍功半的反⾯效果
三、实例化
看了以上内容后,下⾯我整体测试了⼀下:
⾸先⼤家需要明⽩,静态内部类只是不依附与外部类,它⾥⾯的变量和⽅法也没有说⼀定得是静态的,下⾯拿代码说事:
public class Test {
public static void main(String[] args){
MyInnerStaticClass inner=new MyInnerStaticClass();
inner.a=10;
inner.b="abc";
System.out.println(inner.a+" "+inner.b);
}
static class MyInnerStaticClass{static修饰的变量
int a;
String b;
}
}
public class Test {
public static void main(String[] args){
MyInnerStaticClass inner=new MyInnerStaticClass();
inner.a=10;
inner.b="abc";
System.out.println(inner.a+" "+inner.b);
}
static class MyInnerStaticClass{
int a;
String b;
}
}
上述代码将静态匿名类⽤new实例化了,运⾏后输⼊10 abc,正确!
总结
以上就是本⽂关于java中staticclass静态类详解的全部内容,希望对⼤家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不⾜之处,欢迎留⾔指出。感谢朋友们对本站的⽀持!