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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马-李嘉欣 高级黑马   /  2013-3-13 11:54  /  1640 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 黑马-李嘉欣 于 2013-3-13 13:22 编辑
  1. class Fu
  2. {        
  3.         static int num=3;
  4.         void method1()
  5.         {
  6.                 System.out.println("fu method_1");
  7.         }
  8.         void method2()
  9.         {
  10.                 System.out.println("fu method_2");
  11.         }
  12.         static void method4()
  13.         {
  14.                 System.out.println("fu method_4");
  15.         }
  16. }
  17. class Zi extends Fu

  18. {        static int num=66;//"China";
  19.         void method1()
  20.         {
  21.                 System.out.println("zi method_1");
  22.         }
  23.         void method3()
  24.         {
  25.                 System.out.println("fu method_3");
  26.         }
  27.         static void method4()
  28.         {
  29.                 System.out.println("zi method_4");
  30.         }
  31. }
  32. class DuoTaiDemo4
  33. {
  34.         public static void main(String[] args)
  35.         {
  36.                 Fu f=new Zi();
  37.                 f.method1();//结果是zi method_1,因为父类中method1被覆盖。
  38.                 f.method2();//fu method_2,因为子类继承了父类的method2方法。
  39.                 //f.method3();编译失败,父类引用不能调用子类特有方法,
  40.                 //因为此时子类对象在编译时并没有创建
  41. /*注意*/                f.method4();//结果fu method_4,因为static函数在类加载时就已经存在
  42.                                                         //而不需要对象,即不参考右边的子类对象,和子类没关系。
  43.                 System.out.println(f.NUM);
  44.         }
  45. }
复制代码
关于多态模式,子父类变量的提问:
1.父类中变量static修饰符起到了什么作用?去掉的话,不影响结果,为什么还要带着?
2.在多态中,实际存在着变量的覆盖关系吗?能说一下当中的运作过程就再好不过了。
谢谢~

评分

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

查看全部评分

4 个回复

倒序浏览
1.我觉得是因为父类中的静态方法可能会访问到父类中的变量,所以最好加一个static修饰符。
2.我没看到过说java在继承中存在变量的覆盖关系,在多态中成员变量的特点是无论编译和运行,都参考左边也就是引用型变量所属的类。
回复 使用道具 举报
因为父类中存在静态方法,而如果要调用父类中的变量,则需要加上static,不然会出现无法在静态上下文中引用非静态的变量这一编译提示.而且这个题目是为了考题而出题,因为它是想要你明白今天静态和非静态的区别,static修饰的是随着类的加载而加载,不是跟着对象走,不需要创建对象,它是在方法区中的静态区中存储,生命周期也比较长,类存在,static修饰的就存在.
记住一点就可以了,多态中只有方法可以重写,变量不存在重写.

评分

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

查看全部评分

回复 使用道具 举报
父类中变量static修饰符起到了什么作用?去掉的话,不影响结果,为什么还要带着?
解答:在你给出的这个程序中static修饰的变量确实没起到什么作用,反而占了一块静态内存。
在多态中,实际存在着变量的覆盖关系吗?
解答:因为子类其实是一种特殊的父类,因为Java允许把一个子类对象直接赋给一个父类引用变量,无须任何类型转换,或者被称为向上转型,向上转型是由系统自动完成的。Java引用变量有两个类型,一个是编译时的类型,一个是运行时的类型。
编译时的类型是由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。
果编译时类型和运行时类型不一致,就会出现所谓的多态。
通过引用变量来访问其包含的实列属性时,系统总是试图访问它编译时类所定义的属性,而不是它运行时类所定义的属性。
所以你 System.out.println(f.num);打印出的是父类总的num值。(你的代码这里NUM应该为小写的)

希望对你有所帮助!

评分

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

查看全部评分

回复 使用道具 举报
静态修饰符修饰的变量在内存中只能有一份,不会随着对象的建立而建立副本。如果不想再创建对象的时候就需要知道一些相关信息,那么就声明为static类型的,被修饰过的成员变量不属于对象,而是属于类的,静态成员变量会被该类中的所有对象共享,所以带着修饰符会在建立对象时节约内存
多态中成员函数(非静态的)的特点
1;在编译时期,参阅引用型变量所属的类中是否有调用的方法,
如果有,编译通过,如果没有,编译失败,也就是编译时看
f所属的Fu类
在运行时期:参阅对象所属的类中是否有调用的方法,
运行时看对象所属 的Zi类
可简单总结:成员函数在多态调用时,编译看左边,运行看右边。

在多态中成员变量的特点:
无论编译还是运行都是参考左边(引用型变量所属类型)
变量不存在覆盖,记住就好了

评分

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

查看全部评分

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