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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王桂丽 中级黑马   /  2012-7-23 21:24  /  2809 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王桂丽 于 2012-7-24 09:02 编辑

/*
需求:验证多态中“成员变量在多太中无论编译和运行,都参考左边”.
思路步骤:1、定义父类类名为Super,里面有两个函数名相同,但参数不同的函数,
        并且给i赋初值为1
     2、定义子类类名为Demo并继承父类Supper,通过分别用父类名与子类
        名接收子类建立的对象来验证。
*/
                      一、子类中没有给i 赋值,用参数d1接收new Demo(“A”),打印i的值
class Super
{
int i=1;
public Super(String a)
{
  System.out.println("A");
  i=1;
}
public Super()
{
  System.out.println("B");
  i+=2;
}
}
class  Demo extends Super
{
int i=11;
public Demo(String a)
{
  
   System.out.println("C");
  i=7;
}
public static void main(String[] args)
{
  int i=4;
    Demo d1=new Demo("A");
    System.out.println(d1.i);
}
}
结果为:B
              C
              7
二、在自变量中,定义i的初始值,并打印
class Super
{
int i=1;
public Super(String a)
{
  System.out.println("A");
  i=1;
}
public Super()
{
  System.out.println("B");
  i+=2;
}
}
class  Demo extends Super
{
int i=11;
public Demo(String a)
{
  
    System.out.println("C");
  i=7;
}
public static void main(String[] args)
{
  int i=4;
  Demo d1=new Demo("A");
  System.out.println(d1.i);
}
}


打印结果:B
                  C
                  7




疑问:1,子类中int i=4在程序中有何作用?是否被执行过?
           2,在编程二中,既然 class  Demo extends Super
                                                 {
                                                          int i=11;
                                                       public Demo(String a)
                                                       {
                                                        //既然此处隐含了一个super(),  为什么i的值调用父类中的
                                                        //super()时 i=+,  i的结果不是13,打印结果却是7?                  

                                                       System.out.println("C");
                                                           i=7;
                                                      }




未命名1.jpg (4.57 KB, 下载次数: 36)

未命名1.jpg

未命名2.jpg (4.02 KB, 下载次数: 42)

未命名2.jpg

评分

参与人数 1技术分 +1 收起 理由
田向向 + 1 赞一个!

查看全部评分

6 个回复

倒序浏览
System.out.println(d1.i); =》 System.out.println("B"); i+=2; =》

public Demo(String a)
{
  
    System.out.println("C");
  i=7;//你前面在怎么运算,这边一个赋值 前面的还有什么用?

给个全的代码可以不,我运行错误。
}
回复 使用道具 举报
本帖最后由 艾衍年 于 2012-7-23 22:26 编辑



子类继承父类,当子类new对象时,会先创建一个父类,没有父类哪儿来的子类,所以程序运行调用Super无参数的构造方法,最先输出的是B。



主函数第二句话,new子类对象d1,传入参数A,所以调用子类带参数的构造函数,所以第二句输出C,
而且此时 i = 7,主函数第三句话输出d1的i值,所以最后输出的是7.


子类中,先给i初始化为11,但在你的构造函数里改变了i的值,i = 7.

多态,子类里有和父类同样的成员变量时,就考虑子类的。

33.jpg (9.2 KB, 下载次数: 58)

33.jpg

33.jpg (9.2 KB, 下载次数: 30)

33.jpg

评分

参与人数 1技术分 +1 收起 理由
韦念欣 + 1 赞一个!

查看全部评分

回复 使用道具 举报
int i=4在主程序中被定义成局部变量,那么在主程序运行中运行了这句代码,但是主程序下面的所有语句中并没有执行到这条语句。所以这句代码只是运行了并没有执行。
class  Demo extends Super{
   int i=11;
   public Demo(String a){
      super();//此处隐式的调用父类的无参构造函数,但是并没有调用父类的全局变量i,因为子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承,所以i的结果是7,而不是13.
      system.out.println("c");
      i=7;
}  
两次输出结果都是:
b
c
7
回复 使用道具 举报
本帖最后由 艾衍年 于 2012-7-23 22:43 编辑
艾衍年 发表于 2012-7-23 22:14
子类继承父类,当子类new对象时,会先创建一个父类,没有父类哪儿来的子类,所以程序运行调用Super无参数 ...

图片33的位置应该在第3行
回复 使用道具 举报
王舜民 发表于 2012-7-23 22:14
System.out.println(d1.i); =》 System.out.println("B"); i+=2; =》

public Demo(String a)

附件“未命名4”是标题“二”所运行的代码。
并不是给i赋值7,就打印7的值。
附件“未命名5”的运行结果是“B   C   3",我也不是很明白是怎样运行的,如果清楚的话,请解释,谢谢!

未命名4.jpg (37.9 KB, 下载次数: 27)

未命名4.jpg

未命名5.jpg (31.86 KB, 下载次数: 31)

未命名5.jpg

未命名6.jpg (4.32 KB, 下载次数: 27)

未命名6.jpg

点评

艾衍年 不是回答的很好了么。  发表于 2012-7-23 23:10
回复 使用道具 举报
本帖最后由 艾衍年 于 2012-7-24 10:51 编辑
王桂丽 发表于 2012-7-23 23:08
附件“未命名4”是标题“二”所运行的代码。
并不是给i赋值7,就打印7的值。
附件“未命名5”的运行结果 ...

未命名5中的问题主要是在Super d = new Demo("A");这句话上,
这句话用到的是 多态里的转型
Super d = new Demo("A"); 这句话是向上转型。
但是d依然是父类对象!
比如 动物有eat的方法,猫继承动物,但是猫有一个独有的方法—CatchMouth。
那么我要一个小动物,你给我一只猫,行,因为猫也是动物。
但是,这个小动物不具有猫的独有方法Catchmouth。

只有再进行强制的向下转型,Demo dd = (Demo) d,才具有子类的特有数据。

所以Super d = new Demo("A"); 这句话之后d还是父类里的 i = 1,再加2,所以输出的是3.
如果是再执行一下这句话Demo dd = (Demo) d;那么输出的会是7。
回答得有点儿乱,希望有帮助,再加点儿技术分就更好啦嘿嘿
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马