深入理解内部类
内部类详解
内部类一般包括静态内部类,普通成员内部类,匿名内部类,还有就是方法内部类。这是要注意的。
其实如果在Android中,使用得更多的是方法内部类。需要特别注意的是在方法内部类中,如果要使用外部中的一个变量的时候,那么这个变量必须使用final来进行修饰。方法内部类也叫做局部内部类。这是要注意的。
静态内部类详细解答:
package com.lg.test;
public class Demo03 {
/*在不相关的类中可以直接创建内部类的对象
* 静态内部类和外部类也仅仅是命名空间上的联系而已
* 也就是不需要先创建外部类对象,再创建内部类对象*/
public static void main(String[]args){
OuterClass.NestedClass nest=new OuterClass.NestedClass();
}
}
class OuterClass{
public static int i=0;
/*在外部类中可以直接创建内部类的对象*/
public void tt(){
NestedClass nest=new NestedClass();
}
/*内部类不可以使用外部类的非静态的属性和方法*/
static class NestedClass{
void t(){
System.out.println(i);
}
}
成员内部类用法详细解答:
package com.lg.test;
import java.util.Date;
/*成员内部类也叫做普通内部类。我们可以比较直观地理解为就是
* 外部类的一个普通的成员。因此在不相干的类中创建内部类的对象的时候,
* 必须先创建外部类的对象。也就是内部类的对象必须依赖外部类的对象而存在
* */
public class Demo04 {
public static void main(String[] args){
/*在不相干的类中创建内部类的对象的时候,必须依赖于内部类的对象的创建
* */
Outer outer=new Outer();
Outer.Inner inner=outer.new Inner();
}
}
class Outer {
private int i=8;
private static int j=9;
class Inner{
/*成员内部类可以访问外部类的所有的成员,包括静态的和非静态的。也包括私有的*/
void tt(){
System.out.println(j);
System.out.println(i);
}
/*在普通内部类中不可以创建静态的属性和方法*/
//private int static i =0;
//static void tt(){}
/*我们可以举一个简单的例子.如果是可以创建静态成员的话,那么我们就可以
* 通过Outer.Inner.inner来直接创建内部类的对象了。这与外部类的设计的初衷是
* 不一样的。因此是不能够使用静态的成员和方法的。这是要注意的*/
//private static Inner inner=new Inner();
/*在内部类中可以使用静态的常量,也就是使用final修饰的*/
public static final int MAX=100;
/*但是如果要用来创建对象,也是不可以的。因为对象是运行的时候才能够确定的*/
//public static final Date date=new Date();
}
}
}
那么我们是在什么时候,才会使用内部类呢?
方便内部类 使用外部类的方法和属性
内部类一般来说,都是为了外部类服务的。如果一个类需要为多个类服务的话,那么就可以设定为普通类,而不是内部类了。
方法内部类(局部内部类):
package com.lg.test;
public class Demo05 {
}
class Out{
/*方法内部类一般只局限于方法内部的使用*/
void test(){
int ab=9;
//private int i;
/*在方法内部类中,内部类不可以使用private ,public 等限定词来修饰。
* 这个和方法中中的变量不能使用private,public,protected等来进行
* 修饰是一样的。这是要注意的。*/
class In{
/*在方法内部类中,不可以使用静态的属性和方法*/
//static int i=0;
/*在新的JDK中,内部类已经可以使用外部类的局部变量的。*/
int a=ab;
void aa(){
System.out.println(ab);
}
}
}
}
在以前的JDK中,其实方法内部类是不可以适应方法中的局部的变量的。因为方法的生命周期和内部类对象的生命周期是不一样的。我们知道每一个方法在使用的时候,都会在栈中创建一个方法的栈帧。在方法内部的局部变量,当然也会在里面。但是创建的内部类的对象一般是放在堆中。这样的话,如果一个方法不使用的时候,那么就会被销毁。如果在内部类中引用了方法中的局部变量的时候,那么在方法销毁了以后,就会找不到变量的引用。这是不行的。
但是如果方法中的局部变量被final修饰了的话,那么就是一个常量,那么内部类在引用的时候,就会copy一个。那么即使方法被销毁了的话,还是可以引用得到的。这是要注意的。