A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 罗玉宁 中级黑马   /  2013-3-9 18:08  /  1978 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 罗玉宁 于 2013-3-10 19:13 编辑

既然内部类是外部类的成员,是否可以定义外部类的子类,在子类中在定义一个内部类重写其父类中的内部类?例如一下代码,运行不通过,why?
  1. class Outer
  2. {
  3. int x = 5;

  4. class Inter
  5. {
  6. void method()
  7. {
  8. System.out.println("method"+x);
  9. }
  10. }
  11. void printInfo()
  12. {
  13. System.out.println("Outer running");
  14. }
  15. }

  16. class SonOuter extends Outer
  17. {
  18. class Inter
  19. {
  20. void method()
  21. {
  22. System.out.println("method--"+x);
  23. }
  24. }
  25. void printInfo()
  26. {
  27. System.out.println("SonOuter running");
  28. }

  29. public static void main(String[] args)
  30. {
  31. //SonOuter.Inter inout = new SonOuter().new Inter();
  32. /*注释SonOuter类中的子类 可以运行通过*/
  33. Outer.Inter inout = new SonOuter().new Inter();
  34. inout.method();

  35. Outer out = new SonOuter();
  36. out.printInfo();

  37. }
  38. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
郭孟涛 + 1 赞一个!

查看全部评分

5 个回复

倒序浏览
我的笔记应该你看了就明白了
当描述事物时,事物的内部还有事物,该事物用内部类来描述。
因为内部事务在使用外部事物的内容。
内部类由来
例如:人体   由器管组成  例如心脏你可以用函数来描述,但心脏里面属性、行为功能多(血管...),用方法难以描述完;
                心脏也在访问者人体里的其它器管,放在人体里可以直接访问外部的东西,心脏private(内部类)
                封装起来不让外部直接访问,不对外暴露
肉类类可以写在类的任意位置上,成员、局部
        局部内部类不能定义成静态的,不能被成员修饰符修饰,但没对象,没静态不能调用;
        方法中的内部类访问此方法中变量,方法中变量必须是final(最终)修饰的

评分

参与人数 1黑马币 +6 收起 理由
陈丽莉 + 6

查看全部评分

回复 使用道具 举报
本帖最后由 张豪杰 于 2013-3-9 22:34 编辑

内部类就是外部类的一个成员,只是这个成员比成员变量和成员方法更特殊,因为它本身是一个类。因此既有类的功能,又有类成员的一些特性,比如被成员修饰符修饰,但是,内部类之间不存在覆盖。因为父类与子类的内部类,都有各自的名字空间,所以不覆盖也不会发生冲突。不过,内部类之间是能相互继承的。
你对你的下面那句代码理解错了
Outer.Inter inout = new SonOuter().new Inter();//这里不是实现覆盖,而是实现多态
就是这里,必须不能编译通过。
先分析下看,你建立了一个父类的内部类的引用inout,指向了子类的内部类的实例对象。这必须不能编译通过,因为这两个内部类没有继承关系啊。没有父子关系的两个类又怎么能出现多态的用法呢?
因此只要把SonOuter里的代码改改,把子类的内部类也继承父类的内部类,这样就可以使用内部类的多态性质了
public class SonOuter extends Outer
{
class Inter extends Outer.Inter//这里要继承父类的内部类{
void method()
{
System.out.println("son--method--"+x);//这里改成son---method,方便查看结果是否形成了多态
}
}
void printInfo()
{
System.out.println("SonOuter running");
}

public static void main(String[] args)
{
SonOuter.Inter inout1 = new SonOuter().new Inter();//虽然这里能编译通过,但不能证明两个内部类之间存在重写(这点我之前也搞错了),因为内部类的名字空间不同,所以不影响Outer.Inter inout2 = new SonOuter().new Inter();//因为两个内部类现在是父子关系了,所以可以实现多态!!!
inout1.method();
inout2.method();
Outer out = new SonOuter();
out.printInfo();

}
}

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 付玉光 于 2013-3-9 21:02 编辑

class Outer
{
        int x = 5;

        class Inter{
                void method(){
                        System.out.println("method"+x);
                }
        }

        void printInfo(){
                System.out.println("Outer running");
        }
}

class SonOuter extends Outer{
        class Inter{
                void method(){
                        System.out.println("method--"+x);
                }
        }
        void printInfo(){
                System.out.println("SonOuter running");
        }

        public static void main(String[] args){

     //楼主这句有问题。!!!!
        Outer.Inter inout   = new SonOuter().new Inter();
        inout.method();

        }
}

{:soso_e100:}楼主提的问题非常好,一看这个题目,我就知道楼主很有思想。

        让我来回答,高手的这个问题!


        首先楼主提的题目中有一句是《定义一个内部类重写其父类中的内部类》,

        在这句话中,我们可以看出,楼主把多态的特征之一(可以对方法进行重写)

        用在了类上,楼主想把一个类给重写!我不禁惊叹,楼主的思想应该不会产生

        异常了吧?在我所知的java领域中,一个类是不能重写另一个类的!!


        在此,楼主对内部类生产的原因应该也不清楚吧,就让小弟我引用

        咱版主(陈丽莉)java复习大纲中的一句话:来给你阐述一下:

        原句是这样的《如果一个类A要使用B类的所有成员,并且A类不需要被除B以外的其他类访问,

        则我们可以把A定义成B的内部类 》,也就是说内部类的主要用途

        1 ,使用外部类的成员 2 ,它与除外部类之外的其它类没有任何关系。

        楼主的这句话《Outer.Inter inout = new SonOuter().new Inter();》

        意思是建立了一个Outer类中内部类为Inter的引用变量inout,

        并把这个变量的引用指向了一个

        继承自Outer类的(SonOuter类)中的一个内部类实例对象。

        由于这个变量的引用类型,与创建SonOuter类的内部类对象为不同的《类类型》,

        所以编译出错:提示类型是不兼容的。


评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1 额。。可以的话最好别出现我的名字 - - 怪.

查看全部评分

回复 使用道具 举报
本帖最后由 谢洋 于 2013-3-9 22:58 编辑

32.public static void main(String[] args)

33.{

34.SonOuter.Inter inout = new SonOuter().new Inter();//这里编译运行都通过

35./*注释SonOuter类中的子类 可以运行通过*/

36.//Outer.Inter inout = new SonOuter().new Inter();//编译不通过,这里,语法不对
//你一开始说复写,但在这里,我猜你想表达的是SonOuter.Inter(员成)继承了Outer.Inter(成员),是多态的应用(父类引用指向子类对象),为什么编译不通过?;
但首先明确这两个都是类的成员,成员之间不存继承关系
//另外,内部类的复写跟一般普通方法的复写没什么区别,也就是说,子类的内部类复盖了父类的内部类

37.inout.method();

38.

39.Outer out = new SonOuter();

40.out.printInfo();

41.

42.}
回复 使用道具 举报
如果清楚了,请将帖子分类改成【已解决】。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马