我可以创建内部静态类的实例吗?

时间:2013-07-25 05:53:02

标签: android nested-class

如果我使用代码1

Utility.DetailsInfo myInfo=new Utility.DetailsInfo()导致错误,为什么?

No enclosing instance of type Utility is accessible. Must qualify the allocation with an enclosing instance of type Utility (例如x.new A(),其中x是Utility的实例)。

所以我必须使用代码2
我可以创建一个内部静态类的实例吗?
谢谢!

代码1

public class Utility {

    class DetailsInfo {
        String title;
        String path;
        String size;
        Bitmap thumbnails;
    }

    public static void GetPhotoDetailsByID(Context mycontext,String id,DetailsInfo myInfo ){
             Cursor cur = mycontext.getContentResolver().query(
                     MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                     null,
                     MediaStore.Images.Media._ID+"=?", 
                     new String[]{id},
                     "" );
             if (cur.moveToFirst()){
                 myInfo.title= cur.getString(cur.getColumnIndex(MediaStore.Images.Media.TITLE));
                 myInfo.path = cur.getString(cur.getColumnIndex(MediaStore.Images.Media.DATA));
                 myInfo.size=cur.getString(cur.getColumnIndex(MediaStore.Images.Media.SIZE));

                 myInfo.thumbnails = MediaStore.Images.Thumbnails.getThumbnail(
                                   mycontext.getContentResolver(), 
                                   Integer.parseInt(id),
                                   MediaStore.Images.Thumbnails.MICRO_KIND, 
                                   null);

             }
             cur.close();
        }       
}

代码2

public class Utility {    
    public static class DetailsInfo {
        String title;
        String path;
        String size;
        Bitmap thumbnails;
    }

    public static void GetPhotoDetailsByID(Context mycontext,String id,DetailsInfo myInfo ){
             Cursor cur = mycontext.getContentResolver().query(
                     MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                     null,
                     MediaStore.Images.Media._ID+"=?", 
                     new String[]{id},
                     "" );
             if (cur.moveToFirst()){
                 myInfo.title= cur.getString(cur.getColumnIndex(MediaStore.Images.Media.TITLE));
                 myInfo.path = cur.getString(cur.getColumnIndex(MediaStore.Images.Media.DATA));
                 myInfo.size=cur.getString(cur.getColumnIndex(MediaStore.Images.Media.SIZE));

                 myInfo.thumbnails = MediaStore.Images.Thumbnails.getThumbnail(
                                   mycontext.getContentResolver(), 
                                   Integer.parseInt(id),
                                   MediaStore.Images.Thumbnails.MICRO_KIND, 
                                   null);

             }
             cur.close();
        }       
}

3 个答案:

答案 0 :(得分:1)

第一个代码实例中的问题是你的内部类不是静态的。这意味着为了使实例化Utility.DetailsInfo的实例,您需要执行以下操作:

Utility foo = new Utility();
Utility.DetailsInfo bar = foo.new DetailsInfo();

在第二种情况下,Utility.DetailsInfo是静态的,因此您可以直接实例化Utility.DetailsInfo的版本,而无需实例化Utility类。有关嵌套类check the docs

的更多阅读和信息

答案 1 :(得分:1)

这可以帮助你..

此行将导致错误,因为您必须使用其父类的对象调用内部类..

Utility.DetailsInfo myInfo=new Utility.DetailsInfo();

只有子类对象不是静态的,才能引用它的父类对象。

<强>像:

Utility utility = new Utility();
Utility.DetailsInfo myInfo= new utility.DetailsInfo(); 

是的,您可以直接将内部类静态的实例设为静态..

答案 2 :(得分:0)

在代码1中,由于Utility.DetailsInfo不是静态的,因此无法在不实例化的情况下使用它。因此,首先实例化Utility的对象,然后尝试访问它的内部类DetailsInfo

Utility utility = new Utility();
Utility.DetailsInfo myInfo= utility.new DetailsInfo();

但是在代码2中,由于DetailsInfo被定义为静态类,因此可以直接实例化它。

Utility.DetailsInfo myInfo = new Utility.DetailsInfo();

理想情况下,只有在仅对外部类有用的情况下,才能将类嵌入到另一个类中。在这种情况下,嵌套“辅助类”使得它们的包更加简化,或者试图避免它们。