A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 执笔梦 金牌黑马   /  2013-11-24 15:54  /  1451 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

不太明白是否在
方法体外面定义的内部类(静态的,和非静态的),
方法内部定义的和在静态方法内部定义的内部类
都能访问外部类的静态成员?


评分

参与人数 1技术分 +1 收起 理由
FFF + 1 鼓励分+1

查看全部评分

2 个回复

倒序浏览
1.什么是内部类?sataic nested class和Inner Class的不同。

   内部类就是在一个类的内部定义的类,内部类中不能定义静态成员,内部类可以直接访问外部类中的成员变量,内部类可以定义在外部类的方法外面,也可以定义在外部类的方法体中。

   在方法体外面定义的内部类的访问类型可以是public ,protected,默认的,private等4种类型,这就好像类中定义的成员变量有4中访问类型一样,它们决定这个内部类中定义对其他类是否可见;对于这种情况,我们也可以在外面创建内部类的实例对象,创建内部类的实例对象时,一定要先创建外部类的实例对象,然后用这个外部类的实例对象去创建内部类的实例对象,代码如下:

             Outer outer =new Outer();

             Outer.Inner1 inner1=outer.new Inner1();

   在方法内部定义的内部类前面不能有访问类型修饰符,就好像方法中定义的局部变量一样,但这种内部类的前面可以使用final和abstract修饰符。这种内部类对其他类是不可见的其他类无法饮用这种内部类,但是这种内部类创建的实例对象可以传递给其他类访问。这种内部类必须是先定义,后使用,即内部类的定义代码必须出现在使用该类之前,这与方法中的局部变量必须限定以后使用的道理也是一样的。这种内部类可以访问方法体中局部变量,但是,该局部变量前必须加fianl修饰符。

    在方法体内部还可以采用如下语法来创建一种匿名内部类,即定义某一接口或子类的同时,还创建了该子类的实例对象,无需为该子类定义名称:

    public class Outer

   {

        public void start()

       {

            new Thread(

                new Runnable(){

                    public void run(){};



               }

             ).start();

        }

    }

   最后,在方法外部定义的内部类前面可以加上static关键字,从而成为Static Nested Class,他不再具有内部类的特性,所有,从狭义上讲,他不是内部类。Static Nested Class与普通类在运行时的行为和功能上没有什么区别,只是在编程引用时的语法上有一些差别,它可以定义成public,protected 默认的、private等多种类型,而普通类只能定义成public和默认的这两种类型。在外面引用Static Nested Class类的名称为“外部类名.内部类名”。在外面不需要创建外部类的实例对象,就可以直接创建Static Nested Class,例如,假设Inner是定义在Outer类中的Static Nested Class,那么可以使用如下语句创建Inner类:

   Outer.Inner inner=new Outer.Inner();

   由于static nested class不依赖于外部类的实例对象,所以,static nested class能访问外部类的非static成员变量。当在外部类中访问Static Nested Class时,可以直接使用Static Nested Class的名字,而不需要加上外部类的名字,在static nested class中可以直接引用外部类的static的成员变量,不需要加上外部类的名字。

   在静态方法中定义的内部类也是static nested class,这时候不能在类前面加static关键字,静态方法中的static nested class与普通方法中的内部类的应用方式很相似,它除了可以直接访问外部类中的static的成员变量,还可以访问静态方法中局部变量,但是,该局部变量前必须加final修饰符。

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 如果不是复制的~那就太好了!

查看全部评分

回复 使用道具 举报
内部类可以直接访问外部类成员变量,若内部类在方法体内,访问局部变量的话,则该局部变量需要被final修饰。
用代码解释一下
  1. public class InnerClass {
  2.         //成员变量
  3.         private int a = 5;

  4.         public static void main(String[] args) {

  5.         }

  6.         public void run() {
  7.                 //局部变量
  8.                 final int b = 6;
  9.                 new Runnable() {
  10.                         public void run() {
  11.                                 System.out.println(a + b);
  12.                         }
  13.                 };
  14.         }
  15. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马