Java入门之深入理解嵌套类和内部类(2)

   三、在外部类中定义内部类

如下所示代码为在外部类中定义两个内部类及它们的调用关系:

public class Outer{
int outer_x = 100;
class Inner{
public int y = 10;
private int z = 9;
int m = 5;
public void display(){
System.out.println("display outer_x:"+ outer_x);
}
private void display2(){
System.out.println("display outer_x:"+ outer_x);
}
}
void test(){
Inner inner = new Inner();
inner.display();
inner.display2();
//System.out.println("Inner y:" + y);//不能访问内部内变量
System.out.println("Inner y:" + inner.y);//可以访问
System.out.println("Inner z:" + inner.z);//可以访问
System.out.println("Inner m:" + inner.m);//可以访问
InnerTwo innerTwo = new InnerTwo();
innerTwo.show();
}
class InnerTwo{
Inner innerx = new Inner();
public void show(){
//System.out.println(y);//不可访问Innter的y成员
//System.out.println(Inner.y);//不可直接访问Inner的任何成员和方法
innerx.display();//可以访问
innerx.display2();//可以访问
System.out.println(innerx.y);//可以访问
System.out.println(innerx.z);//可以访问
System.out.println(innerx.m);//可以访问
}
}
public static void main(String args[]){
Outer outer = new Outer();
outer.test();
}
}
 

以上代码需要说明有,对于内部类,通常在定义类的class关键字前不加public 或 private等限制符,若加了

没有任何影响,同时好像这些限定符对内部类的变量和方法也没有影响(?)。另外,就是要注意,内部类Inner及

InnterTwo只在类Outer的作用域内是可知的,如果类Outer外的任何代码尝试初始化类Inner或使用它,编译就不

会通过。同时,内部类的变量成员只在内部内内部可见,若外部类或同层次的内部类需要访问,需采用示例程序中的方法,不可直接访问内部类的变量。

    四、在方法中定义内部类

如下所示代码为在方法内部定义一个内部类:

public class FunOuter {
int out_x = 100;

public void test(){

class Inner{

String x = "x";

void display(){

System.out.println(out_x);

}

}

Inner inner = new Inner();

inner.display();

}

public void showStr(String str){

//public String str1 = "test Inner";//不可定义,只允许final修饰

//static String str4 = "static Str";//不可定义,只允许final修饰

String str2 = "test Inner";

final String str3 = "final Str";

class InnerTwo{

public void testPrint(){

System.out.println(out_x);//可直接访问外部类的变量

//System.out.println(str);//不可访问本方法内部的非final变量

//System.out.println(str2);//不可访问本方法内部的非final变量

System.out.println(str3);//只可访问本方法的final型变量成员

}

}

InnerTwo innerTwo = new InnerTwo();

innerTwo.testPrint();

}

public void use(){

//Inner innerObj = new Inner();//此时Inner己不可见了。

//System.out.println(Inner.x);//此时Inner己不可见了。

}

public static void main(String[] args) {

FunOuter outer = new FunOuter();

outer.test();

}

}

 

从上面的例程我们可以看出定义在方法内部的内部类的可见性更小,它只在方法内部

可见,在外部类(及外部类的其它方法中)中都不可见了。同时,它有一个特点,就是方法

内的内部类连本方法的成员变量都不可访问,它只能访问本方法的final型成员。同时另一个

需引起注意的是方法内部定义成员,只允许final修饰或不加修饰符,其它像static等均不可用。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wzyzdy.html