如果我使用代码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();
}
}
答案 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();
理想情况下,只有在仅对外部类有用的情况下,才能将类嵌入到另一个类中。在这种情况下,嵌套“辅助类”使得它们的包更加简化,或者试图避免它们。