2013-07-25 124 views
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
(例如x.new A(),其中x是效用的实例)。我可以创建一个内部静态类的实例吗?

所以我必须使用代码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(); 
     }  
} 

回答

1

更多的阅读和信息May这个帮助你..

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

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

子类只能与如果它不是静态的父类对象被称为..

像:

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

是的,你可以让内部类的实例静态直接,因为它定义为静态的..

1

代码的第一个实例的问题是,你的内部类也不是一成不变的。这意味着,为了有一个新的实例化Utility.DetailsInfo的实例,你需要做到以下几点:

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

在第二种情况下,Utility.DetailsInfo是静态的,所以你可以直接实例化一个版本的Utility.DetailsInfo没有实例一类Utility。有关嵌套类check the docs

0

在码1,由于Utility.DetailsInfo也不是一成不变的,你不能使用itwithout实例化。因此,首先实例化一个Utility的对象,然后尝试访问它的内部类DetailsInfo

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

然而,在代码2,因为DetailsInfo被定义为静态类,你可以直接实例化。

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

理想情况下,只有在仅对外部类有用的情况下,才能在另一个类中嵌入类。在这种情况下,嵌套“帮助程序类”会使其程序包更加简化,或尝试避免它们。

相关问题