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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 毕博 中级黑马   /  2012-6-22 20:02  /  2047 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


public class OverrideDemo003{
        public static void main(String[] args){
                Child c=new Child();       
                c.test();
        }
}
//从往上找,不是向下找
class Parent{       
        void test01(){
                System.out.println("parent test01。。。。");
        }
        void test(){
                this.test01();//子类
                this.add(1.0f,2.0); //没有重写,找适合的方法
                this.add(1.0f); //父类
                //this.printNew(); //子类新增方法,无法调用
        }
        int add(int a,int b){
                return a+b;
        }
        //类型必须一致
        double add(double a,double b){
                System.out.println("parent  add(double a,double b)");
                return a+b;
        }
       
        //不构成重写形式参数的类型必须一致
        int add(double a){
                System.out.println("parent   add(float a)");
                return 1;
        }
}

class Child extends Parent{               
        void test01(){
                System.out.println("child   test01。。。。");
        }
        //重写形式参数的名称与重写没有任何的关系
        int add(int b,int a){
                return b+a;
        }       
        //类型必须一致,只是定义了新方法而已
        double add(float a,double b){
                System.out.println("child     add(double a,double b)");
                return a+b;
        }
        //不构成重写,形式参数的类型必须一致,只是定义了新方法而已
        int add(float a){
                System.out.println("child add(float a)");
                return 1;
        }
       
        }

请问为什么结果调用的都是父类的方法 子类虽然没有重写 但是子类也有满足条件的方法啊   为什么不运行     请详细解释下 谢了


12 个回复

倒序浏览
你没调用子类里面的方法啊。值调用了个test 方法还是父类的
回复 使用道具 举报
子类不是继承了test方法了吗 ?说明他也有这个方法啊  。还有像你说的那样 这时的this.add中this指的是父类的对象还是子类的对象?  还是不太明白
回复 使用道具 举报
毕博 发表于 2012-6-22 20:14
子类不是继承了test方法了吗 ?说明他也有这个方法啊  。还有像你说的那样 这时的this.add中this指的是父类 ...

听我来给你分析,首先c.test();调用子类的test方法,子类没有重写test方法,只是继承了,程序运行到父类中的
void test(){
                this.test01();//子类
                this.add(1.0f,2.0); //没有重写,找适合的方法
                this.add(1.0f); //父类
                //this.printNew(); //子类新增方法,无法调用
        }

执行第一条语句, this.test01();这句中this指针调用,this指针是谁调用它就指向谁,所以调用子类中的
void test01(){
                System.out.println("child   test01。。。。");
        }
输出child   test01。。。。
接着,执行this.add(1.0f,2.0); 这个子类中没有相对应的方法,执行父类的函数,输出parent  add(double a,double b)
再接着  this.add(1.0f);   依旧调用父类方法输出parent   add(float a)
至此,程序运行完成。
关于楼主问的 子类有满足条件的方法,何为满足,首先是方法得重写,方法重写不是说子类中方法和父类方法同名就行,还要参数类型、返回值类型完全一样才可以。
//this.printNew(); //子类新增方法,无法调用,关于这个,请楼主明白一点,子类是继承的父类,所以子类调用父类的方法和数据是无可厚非的,反过来却是不可以的,这是不可逆的。举个例子,富翁的儿子继承了他老爸的财产,这笔财产,富翁可以用,这个儿子也可以用;儿子手里还有一笔是自己赚的钱,而这笔钱的所有权是属于儿子所有的,富翁无法使用。

评分

参与人数 1技术分 +1 收起 理由
职业规划-刘倩老师 + 1 赞一个!

查看全部评分

回复 使用道具 举报
this 是当前对象,谁调那个方法,就是谁。你可以打印以下。这里是子类对象。

不知道这样理解对不对:
  
   在加载类时,并不知道this 就是子类对象应该默认其是父类对象。所以加载的的方法都应该是父类方法。
   当程序执行时,由子类进行了调用,this对象变为子类对象,这时加载的方法并没有边,他会去子类寻找对应方法,当找不到时就会调用父类的方法。对于 test01()子类中有这个方法就执行;对于add(1.of,2.0)y应该是在一开始加载时数据被转换成了 double ,去子类寻找add(double,double) 时没有找到,所以调用了父类方法。

你这里的folat 恰好可以转换成double, 如果把 子类中重写 改成 String ,
看看还能不能再父类写个类似的 this.add("nihao",1.1)  了,肯定不能……

有点晕了,不知道我想的对不对…………
回复 使用道具 举报
李文龙 发表于 2012-6-22 20:38
听我来给你分析,首先c.test();调用子类的test方法,子类没有重写test方法,只是继承了,程序运行到父类 ...

this.add(1.0f,2.0) 和this.add(1.0f)   不正好满足子类的double add(float a,double b) 和int add(float a)为什么还要用父类的方法  你不是说this指的是子类的对象吗  那不正好吗    还是要些疑惑?
                                                  
回复 使用道具 举报
毕博 发表于 2012-6-22 21:08
this.add(1.0f,2.0) 和this.add(1.0f)   不正好满足子类的double add(float a,double b) 和int add(float ...

当程序运行在父类中执行的时候,会优先执行父类中的程序,它会觉得你子类有重写,是根据父类来的,你的程序中子类没有重写这个方法,我刚说了,方法的重写必须参数类型、个数、返回值类型、方法名完全一样。假如你没重写,这个子类的方法是可不调用的,程序你,在父类有满足条件的方法,虽说1.0f是float型的,但是他会自动转换成double型,与父类中的方法进行匹配。无论你这里将参数改什么类型,它都将调用父类,但是你将子类的double add(float a,double b)改为double add(double a,double b),它就会调用子类了,输出child     add(double a,double b)
回复 使用道具 举报
毕博 中级黑马 2012-6-22 21:41:23
8#
李文龙 发表于 2012-6-22 21:25
当程序运行在父类中执行的时候,会优先执行父类中的程序,它会觉得你子类有重写,是根据父类来的,你的程 ...

再问一下 此时的 this.add() 方法  this指的是谁的对象?  不是谁调用方法 this就指向谁
回复 使用道具 举报
毕博 发表于 2012-6-22 21:41
再问一下 此时的 this.add() 方法  this指的是谁的对象?  不是谁调用方法 this就指向谁  ...

你要是this.add()方法,程序会报错,因为子类和父类中都没有无参的add()方法
回复 使用道具 举报
毕博 发表于 2012-6-22 21:41
再问一下 此时的 this.add() 方法  this指的是谁的对象?  不是谁调用方法 this就指向谁  ...

this谁调用就指向谁,这没错。但是方法必须是重写的才会调用子类,否则会在父类中调用相对应的方法,要是没找到,就会编译报错了
回复 使用道具 举报
李文龙 发表于 2012-6-22 21:44
你要是this.add()方法,程序会报错,因为子类和父类中都没有无参的add()方法 ...

不是 我是想说  此时this指的是父类的对象吗 因为谁调用方法 他就指向谁
回复 使用道具 举报
毕博 发表于 2012-6-22 21:47
不是 我是想说  此时this指的是父类的对象吗 因为谁调用方法 他就指向谁

不是指的父类对象,它指向的是子类的对象,因为最开始 c.test()这个对象的子类的,由始而终都是指向子类的对象的,至于你所不懂的为何调用父类方法,是因为程序运行进入了父类的函数中,在这里面,this指针只能访问子类中重写的父类方法和父类中相对应的方法,至于子类中的其他方法,一概无法访问
回复 使用道具 举报
李文龙 发表于 2012-6-22 21:57
不是指的父类对象,它指向的是子类的对象,因为最开始 c.test()这个对象的子类的,由始而终都是指向子类 ...

ok  哥们谢谢你了   谢谢你耐心的解答
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马