输入理解JAVA嵌套类和内部类

深入理解JAVA嵌套类和内部类

一、什么是嵌套类及内部类? 可以在一个类的内部定义另一个类,这种类称为嵌套类(nested classes),它有两种类型: 静态嵌套类和非静

 

一、什么是嵌套类及内部类?

 

可以在一个类的内部定义另一个类,这种类称为嵌套类(nested classes),它有两种类型:

 

静态嵌套类和非静态嵌套类。静态嵌套类使用很少,最重要的是非静态嵌套类,也即是被称作为

 

内部类(inner)。嵌套类从JDK1.1开始引入。其中inner类又可分为三种:

 

其一、在一个类(外部类)中直接定义的内部类;

 

其二、在一个方法(外部类的方法)中定义的内部类;

 

其三、匿名内部类。

 

下面,我将说明这几种嵌套类的使用及注意事项。

 

二、静态嵌套类

 

如下所示代码为定义一个静态嵌套类,

 

public class StaticTest {

 

private static String name = "javaJohn";

 

private String id = "X001";

 

static class Person{

 

private String address = "swjtu,chenDu,China";

 

public String mail = "josserchai@yahoo.com";//内部类公有成员

 

public void display(){

 

//System.out.println(id);//不能直接外部类的非静态成员

 

System.out.println(name);//只能直接外部类的静态成员

 

System.out.println("Inner "+address);//本内部类成员。

 

}

 

}

 

public void printInfo(){

 

Person person = new Person();

 

person.display();

 

//System.out.println(mail);//不可

 

//System.out.println(address);//不可

 

System.out.println(person.address);//可以内部类的私有成员

 

System.out.println(person.mail);//可以内部类的公有成员

 

}

 

public static void main(String[] args) {

 

StaticTest staticTest = new StaticTest();

 

staticTest.printInfo();

 

}

 

}

 

在静态嵌套类内部,不能外部类的非静态成员,这是由Java语法中"静态方法不能直接非静态成员"所限定。

 

若想外部类的变量,必须通过其它方法解决,由于这个原因,静态嵌套类使用很少。注意,外部类内

 

部类的的成员有些特别,不能直接,但可以通过内部类来,这是因为静态嵌套内的所有成员和方法默认为

 

静态的了。同时注意,内部静态类Person只在类StaticTest 范围内可见,若在其它类中引用或初始化,均是错误的。

 

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

 

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

 

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或使用它,编译就不会通过。同时,内部类的变量成员只在内部内内部可见,若外部类或同层次的内部类需要访问,需采用示例程序中的方法,不可直接访问内部类的变量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值