1

如果我使用代码 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
(例如 xnew 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();
        }       
}
4

3 回答 3

1

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

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

在第二种情况下,Utility.DetailsInfo是静态的,因此您可以直接实例化 的版本,Utility.DetailsInfo而无需实例化Utility. 有关嵌套类的更多阅读和信息,请查看文档

于 2013-07-25T06:01:20.870 回答
1

愿这能帮助你..

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

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

只有当它不是静态的时,子类才能与其父类对象一起引用。

喜欢:

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

是的,您可以直接将内部类的实例设为静态,因为它被声明为静态的。

于 2013-07-25T06:01:44.213 回答
0

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

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

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

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

理想情况下,将一个类嵌入到另一个类中是合乎逻辑的,前提是它只对外部类有用。在这种情况下,嵌套“帮助类”会使它们的包更加精简,或者尽量避免它们。

于 2013-07-25T06:57:07.550 回答