码迷,mamicode.com
首页 > 其他好文 > 详细

内部类

时间:2017-08-08 00:44:13      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:out   类对象   class   解释   ted   定义变量   补充   void   存在   

从语法角度看,定义内部类与定义外部类的语法大致相同,内部类除了需要定义在其他类里面之外,还存在如下两点区别。

1.内部类比外部类可以多使用三个修饰符:private、protected、static——外部类不可以使用这三个修饰符。

2.非静态内部类不能拥有静态成员。

解释第1点:外部类的上一级单元时包,所以它只有2个作用域:同一个包内(default)和任何位置(public)

而内部类的上一级程序单元时外部类,它就具有四个作用域:同一个类、同一个包、父子类和任何位置。

 

定义方法:

定义内部类很简单,只要把一个类放在另一个类内部即可。

 

在外部类里使用非静态内部类时,与平时使用普通类并没哟太大区别。

public class DiscernVariable
{
     private String prop = "外部类的实例变量";
     private class InClass
     {
         private String prop = "内部类的实例变量";
         public void info()
         {
             String prop = "局部变量";
             System.out.println("外部类的实例变量值:"
                 +DiscernVariable.this.prop);
             System.out.println("内部类的实例变量值:"
                 +this.prop);
             System.out.println("局部变量的值:"+prop);
         }
     }
     public void test()
     {
         InClass in = new InClass();
         in.info();
     }
     public static void main(String[] args)
     {
         new DiscernVariable().test();
     }

编译上述程序后,生成两个class文件,DiscernVariable,DiscernVariable$InClass,前者时外部类,后者是内部类,以$连接。

 

在非静态内部类对象里,保存了一个它所寄生的外部类对象的引用,

(当调用非静态内部类的实例方法时,必须由一个非静态内部类实例,非静态内部类实例必须寄生在外部类的实例里)

因此,如果外部类成员变量、内部类成员变量与内部类里方法的局部变量同名,则可以通过使用this、外部类类名.this作为限定来区分。

 

静态成员不能访问非静态成员,不允许在外部类的静态成员中直接使用非静态内部类

Java不允许在非静态内部类里定义静态成员。

 

而对于静态内部类来说,静态内部类是外部类的一个静态成员,因此外部类的所有方法、所有初始化块中可以使用静态内部类来定义变量、创建对象等。

 

外部类与内部类相当于定义了一个人这个外部类,而手就是这个人的内部类。

   --省略访问控制符的内部类,只能被与外部类处于同一个包中的其他类所访问

   --使用protected修饰的内部类,可被与外部类处于同一个包中的其他类和外部类的子类锁访问

   --使用public修饰的内部类,可以在任何地方被访问

内部类完整的类名应该是OuterClass.InnerClass。如果外部类有包名,则还应该增加包名前缀。

非静态内部类的对象必须寄生在外部类的对象里,因此创建非静态内部类对象前,必须创建其外部类对象。语法如下:

OuterInstance.new InnerConstructor()   如:

Out.In in = new Out().new In(“测试信息”);

 

补充知识:

非静态可以直接访问静态;
静态不可以直接访问非静态;
因为静态函数可以直接通过 类::函数 中方式调用,不用通过对象来调用函数,而非静态函数必须通过对象来调用,这里面还涉及到实例化对象时候的内存分配。

 

局部内部类:

如果把一个内部类放在方法里定义,则这个内部类就是一个局部内部类,局部内部类仅在该方法里有效。由于局部内部类不能在外部类以外的地方使用,因此内部类也不能使用访问控制符和static修饰。

 

匿名类适合创建那种只需要一次使用的类(单例类适合只有一个对象的类)

内部类

标签:out   类对象   class   解释   ted   定义变量   补充   void   存在   

原文地址:http://www.cnblogs.com/yizu/p/7302457.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!