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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 田光峰 中级黑马   /  2013-4-3 16:14  /  2007 人查看  /  8 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 田光峰 于 2013-4-5 23:18 编辑

为什么要定义内部类 ,成员内部类的用法,局部内部类可以是静态的吗?

8 个回复

倒序浏览
内部类可以访问它所在作用域内的数据,包括私有数据,在同一个包中,内部类对于其他类不可见,使用匿名内部类可以在写回调函数时,减少代码量

内部类可以是静态的

第二个问题我觉得你应该自己看视频做一下
回复 使用道具 举报
成员内部类:作为外部类的一个成员存在,与外部类的属性、方法并列。
  优点:一方面,内部类作为外部类的成员,可以访问外部类的私有成员或属性。(即使声明为private,但是对于处于其内部的内部类还是可见的。)另一方面,可以内部类定义在外部类不可访问的属性。这样就在外部类中实现了比外部类private还要小的额访问权限。
  注意:
  内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两个类。
  对于一个名为Outer的外部类和其内部定义的名为Inner的内部类。编译完成后出现Outer.class 和 Outer$Inner.class 两个类
  当Outer是一个private类时,外部类对于其外部访问是私有的,所以就无法建立外部类对象,进而也无法建立内部类对象。
  局部内部类
  在方法中第一的内部类称为局部内部类。
  与局部变量类似,在局部内部类前不加修饰符public和private,其范围为定义它的代码块
  注意:
  在类外不可直接生产局部内部类(保证局部内部类对外是不可见的)。
  要想使用局部内部类时需要生产对象,对象调用方法,在方法中才能调用局部内部类。
  通过内部类和接口达到一个强制的弱耦合,用局部内部类来实现接口,并在方法中返回接口类型,使局部内部类不可见,屏蔽实现类的可见性。
  静态内部类
  静态内部类可以使用public,protected,private修饰
  静态内部类中可以定义静态和非静态的成员
  注意:
  一个静态内部类不需要一个外部类的成员:只是静态内部类和成员内部类的区别。静态内部类的对象可以直接生成
  这实际上静态内部类成为了一个顶级类。
  静态内部类不可用private来进行定义。
  当类与接口(或者是接口与接口)发生方法命名冲突的时候,此时必须使用内部类来实现。用接口不能完全地实现多继承,用接口配合内部类才能实现真正的多继承。
  匿名内部类
  匿名内部类就是没有名字的内部类。
  注意:
  匿名内部类不能有构造函数
  匿名内部类不能定义任何静态成员、方法和类
  匿名内部类不能是public、protected、private、static
  只能创建匿名内部类的一个实例
  一个匿名内部类用其隐含实现一个接口或实现一个类。
  因匿名内部类为局部内部类,所以局部内部类的所有限制都对其生效

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
内部类就是将一个类的定义放到另一个类的定义内部。内部类分为:成员内部类、局部内部类、静态内部类、匿名内部类。

  成员内部类:作为外部类的一个成员存在,与外部类的属性、方法并列。

  优点:一方面,内部类作为外部类的成员,可以访问外部类的私有成员或属性。(即使声明为private,但是对于处于其内部的内部类还是可见的。)另一方面,可以内部类定义在外部类不可访问的属性。这样就在外部类中实现了比外部类private还要小的额访问权限。

  注意:

  内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两个类。

  对于一个名为Outer的外部类和其内部定义的名为Inner的内部类。编译完成后出现Outer.class 和 Outer$Inner.class 两个类

  当Outer是一个private类时,外部类对于其外部访问是私有的,所以就无法建立外部类对象,进而也无法建立内部类对象。

回复 使用道具 举报
如果某个类它是属于另外一个类的一部分,不能在外部单独存在,那么这时候就可以将其声明成内部类。 内部类可以存在局部位置或成员位置。对于内部类来说,如果它声明在成员位置上可以使用成员修饰符来修饰,在局部位置时就可以用修饰局部变得关键字去修饰 static也可以。
回复 使用道具 举报
因为内部类可以直接访问外部类的成员,包括私有的。
通过代码解释:

  1. class Outer1{
  2.         private void show(){
  3.                 System.out.println("outer...show...method");
  4.         }
  5.         class Inter{//内部类定义在成员上可以被成员修饰符修饰。
  6.                 public void printShow(){
  7.                         show();//内部类可以直接调用外边类的成员。包括私有的。
  8.                 }
  9.         }
  10.        
  11.         public void method(){
  12.                 int x = 8;
  13.                 final int y = 10;
  14.                 class Demo{//内部类定义在局部时,不可以被成员修饰符修饰,所以不可以被static修饰
  15.                         public void function(){
  16.                                 show();//可直接访问外部类中的成员。因为还持有外部类中的引用。
  17.                                 Inter in = new Inter();
  18.                                 in.printShow();
  19.                                 //System.out.println("x="+x);//错误的;不可以访问它所在的局部的变量,只能访问被final修饰的局部变量。
  20.                                 System.out.println("y="+y);//合法的。
  21.                         }
  22.                 }
  23.                 Demo d = new Demo();//在局部方法上创建内部类。
  24.                 d.function();//调用局部内部类的方法。
  25.                 System.out.println("method....");
  26.         }
  27. }

  28. class Demo1{
  29.         public static void main(String[] args) {
  30.                 //创建成员内部的方法:
  31.                 Outer1.Inter in = new Outer1().new Inter();
  32.                 in.printShow();//调用内部类的方法。
  33.                
  34.                 Outer1 out = new Outer1();
  35.                 out.method();
  36.         }
  37. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报

1.        为了简化书写,和更好地封装,我们通常在适当的时候定义内部类。当描述事物时,事物的内部还有事物,该事物用内部类来描述。因为内部类事物在使用外部事物的内容。又比如当一个类继承了只有一两个方法的父类或借口,并只是简单的实现了继承到的方法而且只用一两次,就可以定义一个匿名内部来来简化程序。
2.        成员内部类用法:
a)        静态内部类:成员内部类可以作为外部类的成员可以被static修饰,成为静态内部类;如果内部类中有静态成员时,该内部类必须是静态内部类。其用法与外部类的静态成员一样。
i.        当内部类被static修饰后,只能直接访问外部类中的static成员,出现了访问局限。
ii.        可以被外部类的静态方法直接访问
iii.        在外部其他类中,如何直接访问static内部类的非静态成员呢?用: new Outer.Inner().function();
iv.        在外部其他类中,如何直接访问static内部类的静态成员呢? Outer.Inner.function();
b)        内部类访问外部类:
i.        内部类可以直接访问外部类的成员,也可以按类和类之间的访问方式访问外部其他类的成员;
ii.        如果外部类,内部类,内部类的方法内都有一个成员变量num,那么在该方法内只写num,访问的是最近的也就是方法内部定义的num;如果想访问用this.num是访问内部类的num;用Outer.this.num是访问外部类的num;如果内部类和内部类方法中都没有重名变量num,则只需写一个num即默认访问外部类的num.
c)        外部类访问内部类:如果内部类时非静态的,必须建立内部类的对象。
i.        外部其他类访问内部类(非私有):如果该内部类非静态,则要new一个该内部类对象,但要用全名,即外部类.内部类 比如: Outer.Inner in = new Outer().new Inner();等号后面是先new了一个外部类对象,再用外部类对象调用内部类构造方法new了一个内部类对象。
3.        局部内部类不可以静态。因为static是用来修饰类的成员的,而方法中的成员都是临时变量或临时常量(比如void k(final int a)是合法的),当然不能有static修饰了。记住:static 是属于类的。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
内部类的访问规则:
  1,内部类可以直接访问外部类中的成员,包括私有。之所以可以直接访问外部类中成员,是因为内部类中持有了一个外部类的引用,格式:外部类名.this   
  2,外部类要访问内部类,必须建立内部对象。
直接访问内部类中成员的格式:
    外部类名.内部类名 变量名称=new 外部类.new 内部类,如:Outer.Inner in=new Outer().new Inner();
  3,当内部类在成员位置上,就可以被成员修饰符所修饰。比如,
        private:将内部类在外部类中进行修饰。
        static:内部类就具备static特性。当内部类被static修饰后,只能直接访问外部类中的static成员,出现了访问局限。
注意:当内部类中定义了静态成员,该内部类必须是static的。
      当外部类中的静态方法访问内部类时,内部类也必须是静态的。
        局部内部类不可以被静态修饰。

当描述事物时,事物内部还有事物,该事物用内部类来表示。因为内部事物在使用外部事物的内容。
内部类被定义在局部时
   1,不可以被成员修饰符修饰
   2,可以直接访问外部类中的成员,因为还持有外部类中的引用。
      但不可以访问它所在的局部中的变量。只能访问被final修饰的局部变量。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
若还有问题,继续追问; 没有的话,尽量及时将帖子分类改成【已解决】~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马