有下列程序
Magic.java文件中
package t04;
public interface Magic
{
  void useMagic();
  
}ActionCharacter.java文件中
package t04;
public class ActionCharacter 
{
  //构造了另一个保护类型的内部类,并继承了Magic接口
  //构造保护类型的类的目的是为了在同一包中的其他类可以访问
  protected class MagicHero implements Magic
  {
    private int mp;
    MagicHero(int mp)
    {
      this.mp=mp;
      this.useMagic();
    }
    
    public void useMagic()
    {
      System.out.println("创造出了一个mp为"+mp+"的智力型英雄,可以使用很多魔法");  
    }
  }
  
//定义一个返回MagicHero的一个方法,该方法的返回类型Magic(MagicHero的父类)
  public Magic createMagicHero(int mpValue)
  {
    return new MagicHero(mpValue);
  }
}在测试类中下如下代码
Test.java文件中
package t04;
public class Test
{
  public static void main(String args[])
  {
//运行这句话就会出错
    Magic magic_hero = new ac.createPowHero(1500);
  }
}问题:
为什么用Magic magic_hero = new ac.createPowHero(1500);来构造MagicHero的对象就会出错?
MagicHero的类型是保护类型的,那么在同一个包中是可以被访问的。为什么这样做是不行的?

解决方案 »

  1.   

    ac 是啥?
    createPowHero(int) 是在哪定义的?
      

  2.   

    public class Test {
        
        public Test() {
        }
        public static void main(String args[]) {
            ActionCharacter ac = new ActionCharacter();
            Magic magic_hero = ac.createMagicHero(1500);
        }
    }
    Resule:
    创造出了一个mp为1500的智力型英雄,可以使用很多魔法
    BUILD SUCCESSFUL (total time: 0 seconds)
      

  3.   

    他原来的那个编译通不过,我是把他的main改了以后编译运行的。
      

  4.   

    ac没有定义,createPowHero(int i)也没有定义,没定义的东西你怎么用?
      

  5.   

    protected 级别的能在同一个包里访问吗?好象只能在同一个文件里面吧
      

  6.   

    内部类当然可以外部访问
    for example:
    Point2D p=new Point2D.Float();
    Point2D p=new Point2D.Double();
      

  7.   

    main方法要改成:Magic magic_hero = new ActionCharacter().createPowHero(1500);
      

  8.   

    很简单的问题啊,你可以找《Thinking in java》看看。
    不是访问不了,是你没有建立一个外部类的对象,所以无法访问,因此你必须先建立一个外部类的对象,就像下面:
    ActionCharacter ac = new ActionCharacter();
    Magic magic_hero = new ac.createPowerHero(1500);
      

  9.   

    你的ac没有定义,当然你可能写漏了。你能发你的错误信息来看看更好。
       如果你想创建一个内部类(不是嵌套类)对象,那么你必须首先创建一个包含这个内部类的外围的类的对象,就想你的class ActionCharacter,你必须创建一个这个类的对象,ActionCharacter ac = new ActionCharacter(); 然后通过ac调用方法创建,就象你的程序那样。
       你的程序是没有定义ac。
       但是你也不能这样创建:Magic magic_hero=new ActionCharacter.MagicHero();
    这样也会错误的,因为你要创建一个内部类的对象,你必须有一个外围类的对象创建它。
      

  10.   

    其实内部类是分两种的,一种是静态内部类(它可以不用外部类的实例就可以产生实例),另一种就是内部类,要产生这个内部类的实例必须要有外部类的实例。
    Magic magic_hero = new ActionCharacter().createPowHero(1500);
    你说的那个protected和这个没有什么关联,因为你是用函数反回的引用,估计楼主把静态内部类和内部类弄混淆了
      

  11.   

    静态内部类就象静态成员一样,前面有一个static关键字
    静态内部类主要是为了信息的隐藏。
    内部类的哲学一下说不清
      

  12.   

    static
    {
    }哈哈哈哈...吖。啥人都 有
      

  13.   

    首先你必须new ActionCharacter();
    然后你调用的方法名有错误!
    再有你运行的时候必须在t04的上级目录
    然后调用java t04.Test