您的位置:首页 > 编程语言 > Java开发

JavaSE_Java的内部类和静态内部类的区别与联系

2016-08-23 17:01 399 查看
最近项目中遇到了静态内部类,并且在项目中使用的非常广泛。

下面讲解下静态内部类与内部类的区别:

静态内部类的使用限制

将某个内部类定义为静态类,跟将其他类定义为静态类的方法基本相同,引用规则也基本一致。不过其细节方面仍然有很大的不同。具体来说,主要有如下几个地方要引起各位程序开发人员的注意。

 

一: 是静态成员(包括静态变量与静态成员)的定义。

在非静态内部类中不可以声明静态成员。如现在在一个student类中定义了一个内部类age,如果没有将这个类利用static关键字修饰,即没有定义为静态类,那么在这个内部类中如果要利用static关键字来修饰某个成员方法或者成员变量是不允许的。在编译的时候就通不过。故程序开发人员需要注意,只有静态内部类才能够定义静态的成员变量与成员方法。

 

二: 是在成员的引用上,有比较大的限制。

   一般的非静态内部类,可以随意的访问外部类中的成员变量与成员方法。即使这些成员方法被修饰为private(私有的成员变量或者方法)。因为在其他类中是无法访问被定义为私有的成员变量或方法。但是如果一个内部类被定义为静态的,那么在引用外部类的成员方法或则成员变量的时候,就会有诸多的限制。如不能够从静态内部类的对象中访问外部类的非静态成员(包括成员变量与成员方法)。这是什么意思呢?如果在外部类中定义了两个变量,一个是非静态的变量,一个是静态的变量。静态内部类只能引用外部类中的静态的成员(变量或方法),而不能够访问非静态的变量。对于那些非静态的成员变量与成员方法,在静态内部类中是无法访问的。这就是静态内部类的最大使用限制。在普通的非静态内部类中是没有这个限制的。也正是这个原因,决定了静态内部类只应用在一些特定的场合。其应用范围远远没有像非静态的内部类那样广泛。

 

三: 是在创建静态内部类时不需要将静态内部类的实例绑定在外部类的实例上。

   通常情况下,在一个类中创建成员内部类的时候,有一个强制性的规定,即内部类的实例一定要绑定在外部类的实例中。也就是说,在创建内部类之前要先在外部类中要利用new关键字来创建这个内部类的对象。如此的话如果从外部类中初始化一个内部类对象,那么内部类对象就会绑定在外部类对象上。也就是说,普通非静态内部类的对象是依附在外部类对象之中的。通常情况下,程序员在定义静态内部类的时候,是不需要定义绑定在外部类的实例上的。也就是说,要在一个外部类中定义一个静态的内部类,不需要利用关键字new来创建内部类的实例。

 

从以上的分析中可以看出,静态内部类与非静态的内部类还是有很大的不同的。一般程序开发人员可以这么理解,非静态的内部类对象隐式地在外部类中保存了一个引用,指向创建它的外部类对象。

牢记两个差别:

一、如是否可以创建静态的成员方法与成员变量(静态内部类可以创建静态的成员,而非静态的内部类不可以)

二、对于访问外部类的成员的限制(静态内部类只可以访问外部类中的静态成员变量与成员方法,而非静态的内部类即可以访问所有的外部类成员方法与成员变量)。

 

静态内部类的使用场景

(1)在程序测试的时候,为了避免在各个Java源文件中书写主方法的代码,可以将主方法写入到静态内部类中,以减少代码的书写量,让代码更加的简洁。

总结:

   静态内部类在Java语言中是一个很特殊的类,跟普通的静态类以及非静态的内部类都有很大的差异。作为程序开发人员,必须要知道他们之间的差异,并在 实际工作中在合适的地方采用合适的类。不过总的来说,静态内部类的使用频率并不是很高。但是在有一些场合,如果没有这个内部静态类的话,可能会起到事倍功半的反面效果.

创建内部类实例

内部类:

OuterClassA outTest = new OuterClassA();

InnerClassNonStatic innerTest = outTest.new InnerClassNonStatic();

静态内部类:

OuterClassB.InnerClassStatic innerStatic = new OuterClassB.InnerClassStatic();

------------------------------------------------------------------------------------------------------------------------------------------------

代码地址: http://pan.baidu.com/s/1kV4iRuJ

代码示例

内部类:

public class OuterClassA {

private String outA = "outer";

public String getOutA() {
return outA;
}

public void setOutA(String outA) {
this.outA = outA;
}

class InnerClassNonStatic{
private String innerA = "inner";

public String getInnerA() {
return innerA;
}

public void setInnerA(String innerA) {
this.innerA = innerA;
}

public void printOuterAndInner(){
System.out.println("innerA:" + this.innerA + " " + "outA:" + outA);
}

//要想在非静态内部类中定义一个静态变量,必须为一个定值(final)
public static final String innerB = "xxxx";

//不能在非静态内部类中定义一个非final的static变量
//public static String innerC;
}

public static void main(String[] args) {
OuterClassA outTest = new OuterClassA();
InnerClassNonStatic innerTest = outTest.new InnerClassNonStatic();
innerTest.printOuterAndInner();
}

}


静态内部类:

public class OuterClassB {

private String outA = "outNonStaticA";

public static String outB = "outStaticB";

public String getOutA() {
return outA;
}

public void setOutA(String outA) {
this.outA = outA;
}

static class InnerClassStatic{
private String innerA = "inner";

public String getInnerA() {
return innerA;
}

public void setInnerA(String innerA) {
this.innerA = innerA;
}

//要想在非静态内部类中定义一个静态变量,必须为一个定值(final)
public static final String innerB = "xxxx";

//不能在非静态内部类中定义一个非final的static变量
//public static String innerC;

public void printOutStaticB(){
System.out.println("outStatic:"+outB);
}

//		//静态内部类 ,访问外部非静态变量会报错
//		public void printOuterNonStaticA(){
//			System.out.println("outNonStatic:"+outA);
//		}

}

public static void main(String[] args) {
OuterClassB.InnerClassStatic innerStatic = new OuterClassB.InnerClassStatic();
innerStatic.printOutStaticB();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: