package ml;
public interface Test1{
void ll();
}
//////////////////////////////////
package ml2;
import ml.Test1;
public class Hll{
  protected class Test2 implements Test1{
  public void ll(){
System.out.println("yuankdk");
}
}}
//////////////////////////////////////
package ml3;
import ml2.*;
import ml.Test1;
public class Test3 extends Hll{
Test1 jj(Test3 k){
return k.new Test2();
}

public static void main(String [] args){
Test3 w=new Test3();
Test1 e=w.jj(w);
e.ll();
}

 
thingking in java 里面的一道练习题目,大家帮忙看看怎么才能调好上面的程序

解决方案 »

  1.   

    package ml2;
    import ml.Test1;
    public class Hll{

      protected  class Test2 implements Test1{
      public void ll(){
    System.out.println("yuankdk");
    }
    }
      protected Test2 f(){
      return new Test2();
      }}////////////
    package ml3;
    import ml2.*;
    import ml.Test1;
    public class Test3 extends Hll{
    Test1 jj(Test3 k){
    return k.f();
    }

    public static void main(String [] args){
    Test3 w=new Test3();
    Test1 e=w.jj(w);
    e.ll();
    }

      

  2.   

    在Test2内部类中加上:
    public Test2(){}
      

  3.   

    或者是把Test3与Hll放入一个包中
      

  4.   

      对protected访问修饰符理解的还不是很深刻的朋友会觉得这没什么程序很正常. 程序行为都很合乎情理. 其实不然, 程序在编译的时候会报错, 错误信息为InnerClass() has protected access in com.duwei.SuperClass.InnerClass.
          这是为什么? 我的SuperClass类里的内部类InnerClass已经被定义为protected了, 而且Java保证了被protected所修饰的东西都可以在其子类中使用呀!!! 但, 请再仔细看看错误信息的内容, 原来并不是InnerClass类有什么问题, 而是InnerClass类中的InnerClass()方法出现了问题, InnerClass()这不是InnerClass类的构造函数吗!!! 看来问题找到一半了, 我们在学习Java的时候都知道, 如果一个类没定义任何形式的构造函数时, Java编译器会自动为类加上一个, 但问题就在这, 很多人不会重视这个自动被加上的构造函数的访问级别为何! 不过在此提到了可能大家也就都想起来了, 事实上这个被自动加上的构造函数的访问级别与类相同! 我们在回到刚才的问题上, 这时我们会发现原来InnerClass类在定义时并没有写构造函数, 编译时被自动加入的构造函数访问级别与类相同, 也就是protected. 这时我想大家应该明白为什么程序会出问题了吧!!!
    引于:http://blog.csdn.net/clarkdu/archive/2005/04/02/334925.aspx