Java内部类问题

锦瑟six 2014-04-06 09:18:43
《Java编程思想》中的一道题
在第一个包中创建一个至少有一个方法的接口。然后在第二个包内创建一个类,在其中增加一个protected的内部类以实现那个接口。在第三个包中,继承这个类,并在一个方法中返回该protected内部类的对象,在返回的时候向上转型为第一个包中的接口的类型。
我的代码如下:
package packages.p1;

public interface SomeInterface{
void park();
}
----------------------------------------
package packages.p2;
import packages.p1.*;

public class SomeClass{
protected class SomeInnerClass implements SomeInterface{
public void park(){System.out.println("I'm parking.");}
}
}
---------------------------------------
package packages.p3;
import packages.p2.*;
import packages.p1.*;

public class SubClass extends SomeClass{
public SomeInterface mine(){return new SomeInnerClass();}

public static void main(String[] args){
SubClass sc = new SubClass();
SomeInterface si = sc.mine();
si.park();
}
}
不知道为什么子类不可以访问父类的内部类?
...全文
390 18 打赏 收藏 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
锦瑟six 2014-04-09
  • 打赏
  • 举报
回复
引用 13 楼 zebing007 的回复:
把子类改一下即可: package packages.p3; import packages.p2.*; import packages.p1.*; public class SubClass extends SomeClass{ public SomeInterface mine(){return this.new SomeInnerClass();} public static void main(String[] args){ SubClass sc = new SubClass(); SomeInterface si = sc.mine(); si.park(); } }
也是一样的错误信息,访问不到SomeInnerClass,确实应该如前所说,给SomeInnerClass加一个public的构造方法
锦瑟six 2014-04-09
  • 打赏
  • 举报
回复
引用 12 楼 miqi0533 的回复:
package packages.p3;
import packages.p2.*;
import packages.p1.*;

public class SubClass extends SomeClass{
    public SomeInterface mine(){return new SomeClass().new SomeInnerClass();}

    public static void main(String[] args){
SubClass sc = new SubClass();
SomeInterface si = sc.mine();
si.park();
    }
}
不对,即便改成这样也是一样的错误信息
锦瑟six 2014-04-09
  • 打赏
  • 举报
回复
引用 9 楼 javacym 的回复:
[quote=引用 7 楼 zhangyang_freedom 的回复:] [quote=引用 5 楼 javacym 的回复:] public class SomeClass{ protected class SomeInnerClass implements SomeInterface{ public SomeInnerClass (){} public void park(){System.out.println("I'm parking.");} } } 默认是这样的 public class SomeClass{ protected class SomeInnerClass implements SomeInterface{ SomeInnerClass (){} public void park(){System.out.println("I'm parking.");} } }
按照你的说法,编译确实通过了,也可以正确运行,能不能告诉我为什么?还是那个问题,既然子类可以访问父类的protected域,为什么还要写一个public的构造方法??[/quote] 你可以访问这个类,但是这个类里面的属性和方法也有自己的权限[/quote] 你说得很对,我又试了一下: package packages.simple; public class A{ protected int i = 9; } ----------------------------------- package packages.testpackage; import packages.simple.*; public class B extends A{ public static void main(String[] args){ B b = new B(); System.out.println(b.i); } } 这样可以正确输出i,但如果把i前的protected去掉就无法访问i了,谢谢。
锦瑟six 2014-04-08
  • 打赏
  • 举报
回复
引用 5 楼 javacym 的回复:
public class SomeClass{ protected class SomeInnerClass implements SomeInterface{ public SomeInnerClass (){} public void park(){System.out.println("I'm parking.");} } } 默认是这样的 public class SomeClass{ protected class SomeInnerClass implements SomeInterface{ SomeInnerClass (){} public void park(){System.out.println("I'm parking.");} } }
按照你的说法,编译确实通过了,也可以正确运行,能不能告诉我为什么?还是那个问题,既然子类可以访问父类的protected域,为什么还要写一个public的构造方法??
锦瑟six 2014-04-08
  • 打赏
  • 举报
回复
谁懂啊。。。
m529031854 2014-04-08
  • 打赏
  • 举报
回复
我也被内部类搞迷啦,学习下
tc@zen123 2014-04-08
  • 打赏
  • 举报
回复
内部类是依赖外围类的,没有外面的类的实例,那他就是不可访问的。
tc@zen123 2014-04-08
  • 打赏
  • 举报
回复
把子类改一下即可: package packages.p3; import packages.p2.*; import packages.p1.*; public class SubClass extends SomeClass{ public SomeInterface mine(){return this.new SomeInnerClass();} public static void main(String[] args){ SubClass sc = new SubClass(); SomeInterface si = sc.mine(); si.park(); } }
Euray_Kylin 2014-04-08
  • 打赏
  • 举报
回复
package packages.p3;
import packages.p2.*;
import packages.p1.*;

public class SubClass extends SomeClass{
    public SomeInterface mine(){return new SomeClass().new SomeInnerClass();}

    public static void main(String[] args){
SubClass sc = new SubClass();
SomeInterface si = sc.mine();
si.park();
    }
}
Euray_Kylin 2014-04-08
  • 打赏
  • 举报
回复
创建内部类对象格式错误。 请试试: new SomeClass().new SomInnerClass();
lliiqiang 2014-04-08
  • 打赏
  • 举报
回复
内部类也是一个单独的类。
javacym 2014-04-08
  • 打赏
  • 举报
回复
引用 7 楼 zhangyang_freedom 的回复:
[quote=引用 5 楼 javacym 的回复:] public class SomeClass{ protected class SomeInnerClass implements SomeInterface{ public SomeInnerClass (){} public void park(){System.out.println("I'm parking.");} } } 默认是这样的 public class SomeClass{ protected class SomeInnerClass implements SomeInterface{ SomeInnerClass (){} public void park(){System.out.println("I'm parking.");} } }
按照你的说法,编译确实通过了,也可以正确运行,能不能告诉我为什么?还是那个问题,既然子类可以访问父类的protected域,为什么还要写一个public的构造方法??[/quote] 你可以访问这个类,但是这个类里面的属性和方法也有自己的权限
锦瑟six 2014-04-07
  • 打赏
  • 举报
回复
引用 5 楼 javacym 的回复:
public class SomeClass{ protected class SomeInnerClass implements SomeInterface{ public SomeInnerClass (){} public void park(){System.out.println("I'm parking.");} } } 默认是这样的 public class SomeClass{ protected class SomeInnerClass implements SomeInterface{ SomeInnerClass (){} public void park(){System.out.println("I'm parking.");} } }
这是什么原理?不是说protected的域可以被子类访问的么??
javacym 2014-04-07
  • 打赏
  • 举报
回复
public class SomeClass{ protected class SomeInnerClass implements SomeInterface{ public SomeInnerClass (){} public void park(){System.out.println("I'm parking.");} } } 默认是这样的 public class SomeClass{ protected class SomeInnerClass implements SomeInterface{ SomeInnerClass (){} public void park(){System.out.println("I'm parking.");} } }
javacym 2014-04-07
  • 打赏
  • 举报
回复
public class SomeClass{ protected class SomeInnerClass implements SomeInterface{ public SomeInnerClass (){} public void park(){System.out.println("I'm parking.");} } }
锦瑟six 2014-04-07
  • 打赏
  • 举报
回复
有没有人帮忙解决一下啊 为什么子类无法访问父类的protected内部类,是不是访问方法有误?要用父类.this 这样来新建??
锦瑟six 2014-04-07
  • 打赏
  • 举报
回复
引用 2 楼 javacym 的回复:
public class SomeClass{ protected class SomeInnerClass implements SomeInterface{ public SomeInnerClass (){} public void park(){System.out.println("I'm parking.");} } }
增加一个构造方法?这个默认构造方法不是自动认会添加的么
锦瑟six 2014-04-06
  • 打赏
  • 举报
回复

这是错误信息,顺便问一下,Java内部类到底有什么用?能不能一言以蔽之,真心看了觉得陷进去了

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧