深入理解内部类

来源:互联网 发布:全景视频转换软件 编辑:程序博客网 时间:2024/05/17 05:02

                            深入理解内部类

                             内部类详解


 

内部类一般包括静态内部类,普通成员内部类,匿名内部类,还有就是方法内部类。这是要注意的。

其实如果在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一个。那么即使方法被销毁了的话,还是可以引用得到的。这是要注意的。

 

 

 

 

 

0 0
原创粉丝点击