黑马程序员__内部类

来源:互联网 发布:企业 java用什么软件 编辑:程序博客网 时间:2024/06/14 14:50

                     ------- android培训java培训、期待与您交流! ----------

  java中的类,按照其所处的位置可以分为顶层类和内部类,顶层类与内部类两者既有区别

又有相同点。本篇博文将详细介绍内部类的使用方式以及其语法特点。

  所谓内部类,就是定义在一个类中的类,按照它的作用域可以分为 成员内部类和局部内部

类,而成员内部类又分为实例内部类和静态内部类。这与内中的各种变量的分类是一致的。

前面在讲修饰符时曾经提到过:顶层类只能处于public和默认访问级别,而成员 内部类可以处于

4中不同的访问级别。

class A{public class B{}}


(1)上述代码中定义了一个公开的成员内部类,如果不希望客户程序访问成员内部类,我们可以将

B类的修饰符改成private。

<span style="font-size:12px;">class A{private class B{}}</span>

(2)成员内部类的完整类名为:

外部类名.内部类名

(3)用static关键字修饰的成员内部类叫做静态内部类,而没有static关键字的叫做实例内部类。

实例内部类具有以下几个特点:

   (3.1)在创建实例内部类的实例时,外部类的实例必须存在。例如,要创建B内的实例,必须先创建

A类的实例。所以其实例创建的方式如下

class A{private class B{}public static void main(String[] args){A.B b=new A().new B();//创建一个实例内部类}}


  (3.2)实例内部类的实例自动持有外部内实例的引用。在内部类中可以直接访问外部类的所有成员,

包括成员变量和成员方法。

<span style="font-size:12px;">class A{int a=1;static int b=0;static void show(){}void method(){}private class B{a++;//编译成功b++;//编译成功show();//编译成功method();//编译成功}public static void main(String[] args){A.B b=new A().new B();//创建一个实例内部类}}</span>


  (3.3)外部类实例与内部类实例是1对多的关系,一个内部类实例只会引用一个外部类实例,而一个

外部类实例会对应零或者多个内部类实例。所以在外部内中不可以直接访问内部类实例成员,必须通

过内部类实例来访问。

<span style="font-size:12px;">class A{void show(){x++;//编译失败}private class B{int x;}</span>


  (3.4)在实例内部类中不能定义静态成员,而只能定义实例成员。

 

class A{private class B{int x;static int w=1;//编译失败,不可定义静态成员}}}

 

 (3.5)如果实例内部类B与外部类A包含同名的成员(比如x),那么在类B中this.x代表B中的x,而

A.this.x代表A中x。

 

(4)静态内部类是成员内部类的一种,用static关键字修饰。静态内部类有以下几个特点:

  (4.1)静态内部类的实例不会自动持有外部类实例的引用,在创建内部类的实例时,不必创建外部

类的实例。

  (4.2)静态内部类可以直接访问外部类的静态成员,如果想要访问外部类的实例成员,就必须通过

外部内的实例去访问。

  (4.3)在静态内部类中可以定义实例成员以及静态成员。

   (4.4)客户类可以通过完整的类名访问静态内部类。

 

(5)局部内部类是在一个方法中定义的内部类,它的可见范围是当前方法,和局部变量一样,局部

内部类不能用访问控制修饰符来修饰。局部内部类有以下几个值得注意的特点:

  (5.1)局部内部类只能在当前方法中使用

class A {void show(){B b=new B();//编译失败}void method{class B{}}


 

  (5.2)局部内部类和实例内部类一样不能包含静态成员。

 

class A {void method{class B{static int x=9;//编译失败}}}

  (5.3)局部内部类和实例内部类一样可以访问外部类的所有成员。

 

0 0
原创粉丝点击