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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 唐巍 黑马帝   /  2012-3-2 01:12  /  2291 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 唐巍 于 2012-3-2 01:12 编辑

问题代码:
class Fu
{
        void method1()
        {
                System.out.println("fu method_1");
        }
        void method2()
        {
                System.out.println("fu method_2");
        }
       
}
class Zi extends Fu
{
        void method1()
        {
                System.out.println("zi method_1");
        }
        void method3()
        {
                System.out.println("zi method_3");
        }
       
}
class DuoTaiDemo
{
        public static void main(String[] args)
        {
                Fu f=new Zi();
                f.method1();
                f.method2();
                f.method3();//这里提示找不到method3()。可是子类中有method3();为什么?
        }
}

9 个回复

倒序浏览
你应该是编译不过吧?编译器编译的时候检查的是语法,语法上,你跟一个Fu说:去3一下。当然不行。
当然另外你把一个父类对象强转成子类,访问子类的方法,虽然编译可能通过,但是运行还是会报错,同样的道理。
向上向下都不是做手术。
还有如果使用集合存放的话,只要一放进去,你就忘记了对象的类型(除非你使用一个自己定义的有型别意识的集合类),
所以取出的时候要强转,从Object返回原型,否则也会出现和你上面一样的问题,经常会是Object的equals()方法比较的是reference,而你需要比较的是内容。
回复 使用道具 举报
存在2个转型的问题  第一个是向上转型,如果想输入子类特有的方法就是向下转型必须强制手写下
回复 使用道具 举报
这是在编辑 时的问题,属于语法问题, 当父类 指向 子类的时候,子类中不能有父类没有的 方法,这样就会报错。 记住了就好。
回复 使用道具 举报
这是一个多态问题,编译看左,运行看右。
Fu f=new Zi();
   f.method1();
运行时子类对象当作父类对象来使用
父类没有子类特有方法method3();
也就无法运行
回复 使用道具 举报
Fu f=new Zi();这个是定义一个父类,只能用父类的方法,父类没有这个方法所以就不能用了
回复 使用道具 举报
王杰 黑马帝 2012-3-2 15:20:36
7#
当然会出错了。这是多态的一个特点。
多态的体现就是:父类引用指向子类对象。
method3()是子类中的方法。父类中没有定义!
你定义的对象f的类型是父类的!
既然如此你怎么能调用method3()呢?
至于method1()会运行子类的方法。那是因为发生了复写。
你只要记住多态时。
你可以调用所用父类的方法。但是如果子类对某个父类进行了复写。那么就得执行子类的方法体!
回复 使用道具 举报
Fu f=new Zi();
对象f的类型是父类的,父类里没有method3
回复 使用道具 举报
因为你是Fu f=new Zi();,父类对象使用子类对象的引用,
当你使用f对象调用方法时,如果父类对象中存在该方法,
并且子类对象也存在该方法,子类中的方法会覆盖父类方法
如果父类中没有该方法,子类中存储该方法,父类在堆内存中
找不到该方法就不能通过编译,除非 是Zi zi = new Zi();
实例子类对象 ,自己的理解 多多指教{:soso_e181:}
回复 使用道具 举报
本帖最后由 舞动的心弦 于 2012-3-2 18:36 编辑

额,看了你的问题啦!首先我要说的是你得理解多态的概念啦

   一. 多态性是指在一个程序中相同的名字可以表示不同的实现。
   Java语言的多态性表现在利用重载可在一个类中定义多个名字相同实现不同的方法;
还表现在不同类之间子类对父类的覆盖。
概括地讲,在运用父类引用指向子类对象的情况下,基本上就用到了多态了


  二 .多态有两种表现形式:重载和覆盖首先说重载(overload),是发生在同一类中。与什么父类子类、继承毫无关系。     标识一个函数除了函数名外,还有函数的参数(个数和类型)。也就是说,一个类中可以有两个或更多的函数,叫同一个名字而他们的参数不同。他们之间毫无关系,是不同的函数,只是可能他们的功能类似,所以才命名一样,增加可读性,仅此而已!  

    再说覆盖(override),是发生在子类中!也就是说必须有继承的情况下才有覆盖发生。  我们知道继承一个类,也就有了父类了全部方法,如果你感到哪个方法不爽,功能要变,那就把那个函数在子类中重新实现一遍。  
这样再调用这个方法的时候,就是执行子类中的过程了。父类中的函数就被覆盖了。
(当然,覆盖的时候函数名和参数要和父类中完全一样,不然你的方法对父类中的方法就不起任何作用,因为两者是两个函数,毫不关系)

   不知道我说了这么多,楼主明白点不?

   很明显嘛,你这缺少啥列?是不是缺少重载呀!所以你当然访问不到啦!我想只有你明白了这些概念才能很好的应用啦!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马