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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 黑马-李嘉欣 于 2013-3-13 13:46 编辑

class Fu
{        
        static int num=3;
        void method1()
        {
                System.out.println("fu method_1");
        }
   
     
}
class Zi extends Fu

{        static int num=66;//"China";
        void method1()
        {
                System.out.println("zi method_1");
        }
      
   
}
class DuoTaiDemo4
{
        public static void main(String[] args)
        {
                Fu f=new Zi();
                f.method1();//结果是zi method_1,因为父类中method1被覆盖。
              
                System.out.println(f.NUM);
        }
}
在多态中为什么成员函数可以被覆盖,为什么变量不可?在内存中的运行有什么不同吗?

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 不错;如果问题已解决,请将帖子修改为已解.

查看全部评分

5 个回复

正序浏览
袁术森 发表于 2013-3-13 13:02
嘿嘿,被斑竹打鸡血了,刚闭关出来 就有成效啦  
啦啦啦  啦啦啦

收到 :lol
回复 使用道具 举报
袁术森 发表于 2013-3-13 12:47
什么形式是多态 ,父类的引用指向子类的对象,如Fu f=new Zi();进行了向上转型。向上转型后的引用性变量f则 ...

嘿嘿,被斑竹打鸡血了,刚闭关出来 就有成效啦  
啦啦啦  啦啦啦

点评

好好加油  发表于 2013-3-13 13:28
回复 使用道具 举报
什么形式是多态 ,父类的引用指向子类的对象,如Fu f=new Zi();进行了向上转型。向上转型后的引用性变量f则只能调用父类中的方法,不能调用子类中特有的内容方法。
成员函数为什么能被覆盖,而成员变量不能,是因为覆盖本来就是是函数的特性之一,变量没有。这里调用的结果就涉及到 看左边看右边的知识点。多态的应用中,成员函数的调用,编译时看右边即引用型变量对应的父类有无该调用函数,有则通过,无则编译失败。编译通过后,看右边即子类的对象,子类中是否有该调用函数,如有,则调用的是子类自己的函数,如没有,则调用的是父类中的函数。而成员变量,则只看左边,编译和运行都看左边,若父类中无,则编译不会通过,若有,则调用的是父类的变量。

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 赞一个!

查看全部评分

回复 使用道具 举报
因为子类其实是一种特殊的父类,因为Java允许把一个子类对象直接赋给一个父类引用变量,无须任何类型转换,或者被称为向上转型,向上转型是由系统自动完成的。
Java引用变量有两个类型,一个是编译时的类型,一个是运行时的类型。
编译时的类型是由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。
如果编译时类型和运行时类型不一致,就会出现所谓的多态。
对象的属性不具备多态,对象的方法具备多态。
所以通过引用变量来访问其包含的实列属性时,系统总是试图访问它编译时类所定义的属性,而不是它运行时类所定义的属性。


希望对你有所帮助!

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 赞一个!

查看全部评分

回复 使用道具 举报
最直接简单的说法就是继承中方法存在重写,而变量不存在.
你要是能看懂这个例子基本就能了解了
孔子爹:教书("JavaSE"),40//孔子爹年龄40,教javaSE
孔子:教书("论语"),玩游戏(),20//孔子年龄20,教论语
//有人找孔子爹去教书,结果只有孔子在家,孔子化妆成爹去教
孔子爹 k爹 = new 孔子();  //向上转型 化妆,装爹。
k爹.教书(); //方法重写,孔子只会教论语,所以是论语
sop(k爹.age); //而年龄是化妆出来的,就是父类的年龄是40
//下课了
孔子 k = (孔子)k爹; //向下转型 去妆,还原本身
                孔子 k = new 孔子();
                k.教书(); //教书还是只能教论语
                sop(k.age); //卸过妆之后年龄就是20
                k.玩游戏();可以使用自己独有的方法
看懂这个例子以后遇到什么情况都往这个方向走就可以了

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马