标签: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