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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘勇强 中级黑马   /  2013-2-23 17:33  /  2046 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 刘勇强 于 2013-2-24 16:14 编辑
  1. class A
  2. {
  3.         int i,j;
  4.         void setIJ(int i,int j)
  5.         {
  6.                 this.i=i;
  7.                 this.j=j;
  8.         }
  9.         int multiply()
  10.         {
  11.                 return i*j;
  12.         }
  13. }

  14. class B extends A
  15. {
  16.         int i,k;
  17.         B(int i,int k)
  18.         {
  19.                 this.i=i;
  20.                 this.k=k;
  21.         }
  22.         int multiply()
  23.         {
  24.                 return i*j*k;
  25.         }
  26. }

  27. public class ABtest
  28. {
  29.         public static void main(String a[])
  30.         {
  31.                 B subO=new B(6,9);
  32.                 subO.setIJ(7,8);//调用父类方法setIJ();    疑问语句
  33.                 int m=subO.multiply();
  34.                 System.out.println("m="+m);
  35.         }
  36. }
复制代码
输出为:m=432


subO通过构造初始化,i=6   k=9
然后 subO.setIJ(7,8); 这一语句中,8被赋给了变量j . 参数7发生了什么?  因为最后的结果表明子类对象的变量i被初始化为6后,这一语句仅给j赋值了    参数7的处理细节是什么样的?


评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1

查看全部评分

4 个回复

倒序浏览

  1. <P>class A
  2. {
  3.         int i,j;
  4.         void setIJ(int i,int j)
  5.         {
  6.                 this.i=i;   
  7.                 this.j=j;
  8.         }
  9.         int multiply()
  10.         {
  11.                 return i*j;
  12.         }
  13. }</P>
  14. <P>class B extends A
  15. {
  16.         int i,k;
  17.         B(int i,int k)
  18.         {
  19.                 this.i=i;
  20.                 this.k=k;
  21.         }
  22.         int multiply()
  23.         {
  24.                 return i*j*k;
  25.         }
  26. }</P>
  27. <P>public class ABtest
  28. {
  29.         public static void main(String a[])
  30.         {
  31.                 B subO=new B(6,9);
  32.                 subO.setIJ(7,8);//调用父类方法setIJ();    疑问语句
  33. <FONT color=red>因为上面你的方法用了this关键字.你把参数传递过去.默认就赋值使用this关键字的变量.  7那个参数也用了this..所以全赋值到了父类的变量上了.</FONT>
  34.                 int m=subO.multiply();
  35.                 System.out.println("m="+m);
  36.         }
  37. }
  38. </P>
复制代码

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1

查看全部评分

回复 使用道具 举报
这认为是这样的:
1,如果子父类中都有相同的变量,父类变量会被复盖,所以B中会有三个变量:i,j,k;这跟复盖方法差不多吧。
2,因为B中的i变量复盖了A变量中的i,所以在multiply()中用到的i是子类的i;
3,要在B类中得到父类的i变量可以通过super.i得到。
class B extends A
{
        int i,k;
        B(int i,int k)
        {
                this.i=i;
                this.k=k;
        }
        int multiply()
        {
      
                return (super.i)*j*k;//这样就可以得到父类的i了
        }
}

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1

查看全部评分

回复 使用道具 举报
package Day12;
class A
{
        int i,j;
        void setIJ(int i,int j)
        {
                this.i=i;
                this.j=j;
        }
        int multiply()
        {
                return i*j;
        }
        public void printF()
        {
                System.out.println("i="+this.i);
        }
}

class B extends A
{
        int i,k;
        B(int i,int k)
        {
                this.i=i;
                this.k=k;
        }
        int multiply()
        {
                System.out.println("i="+i+":j="+j+"k="+k);
             return i*j*k;
        }
        void print()
        {
                System.out.println("i="+i+":k="+k);
        }
}

public class Demo1
{
        public static void main(String a[])
        {
                B subO=new B(1,2);
                subO.setIJ(3,4);//调用父类方法setIJ();    疑问语句
                //你的子类方法multiply()中,有父类不存在的k变量,所以.使用子类方法时,他使用的是子类的变量,
                int m=subO.multiply();//父类中没有k,没有的,他就去父类找,有的,就自己用.
                System.out.println("m="+m);
                subO.print();//出输1:2:
                subO.printF();//输出3//i的赋值是3.当你输出父类有的属性时,它就会输出父类的.子父类有方法覆盖.
        }
}

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1

查看全部评分

回复 使用道具 举报
class A
{
        int i,j;
        void setIJ(int i,int j)
        {
                this.i=i;
                this.j=j;
        }
        int multiply()
        {
                return i*j;
        }
}

class B extends A
{
        int i,k;
        B(int i,int k)
        {
                this.i=i;
                this.k=k;
        }
        int multiply()
        {
                return i*j*k;
        }
}

public class ABtest
{
        public static void main(String a[])
        {
                B subO=new B(6,9);
                subO.setIJ(7,8);//调用父类方法setIJ();
/*
如果子父类中有同名的成员变量x  子类对象调用的方法 (此方法继承于父类)访问到这个x 那么这个变量会在父类中访问的是父类的x 因为调用的父类的函数中含有的是父类对象的引用this  this.x当然是父类的                        即subO.setIJ(7,8)这句话  寻找到父类的变量i 并复制7 寻找到父类的j并复制8  而子类对象的i依然为6  由于子类的j继承于父类  所以子类中方法multiply()用到的j为父类的j
*/
          System.out.println(subO.i)//这句话打印出来一定是6
        }
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马