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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

示例一、
--------------------------------------------------
class Fu
{
        int num = 3;
        void method1()
        {
                System.out.println("fu 1");
        }
        void method2()
        {
                System.out.println("fu  2");
        }
        static void method4()
        {
                System.out.println("fu 4");
        }
}
class Zi extends Fu
{
        int num = 5;
        void method2()
        {
                System.out.println("zi 2");
        }
        void method3()
        {
                System.out.println("zi 3");
        }
        static void method4()
        {
                System.out.println("zi 4");
        }
}
class DuoTaiDemo
{
        public static void main(String[] args)
        {
                Fu f = new Zi();
                f.method1();//fu 1
                f.method2();//zi 2 多态时,方法看对象本身的方法
                //f.method3();fu类中无method3
                f.method4();//fu 4 静态方法与类绑定
                System.out.println(f.num);//3 多态时,常量看的是对象所属类的常量
        }
}
-------------------------------------------------
实例二、
--------------------------------------------------
class Super
{
        int i=0;
        public Super(String a)
        {
                System.out.println("A");
                i=1;       
        }
        public Super()
        {
                System.out.println("B");
                i+=2;
        }
}
class Demo extends Super
{
        public Demo(String a)
        {
                //super();
                System.out.println("C");
                i=5;                               
        }
        public static void main(String[] args)
        {
                int i=4;
                Super d=new Demo("A");
                System.out.println(d.i);
        }

}
-----------------------------------------------
示例一中f.num为3,看的是父类。而示例二中d.i为什么不看父类int i = 0?求解惑


评分

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

查看全部评分

11 个回复

倒序浏览
还没学到这里 表示不怎么看得懂
回复 使用道具 举报
因为f或者d都是父类引用。
回复 使用道具 举报
Super d=new Demo("A"); 你创建子类对象时隐式调用了父类的super()方法,使父类的成员变量i=2;
d.i由于成员变量不存在重写的情况,所以看父类,父类中i=2
回复 使用道具 举报
Amu 发表于 2015-5-23 23:58
Super d=new Demo("A"); 你创建子类对象时隐式调用了父类的super()方法,使父类的成员变量i=2;
d.i由于成 ...

示例二中,d.i的结果不是2啊!
回复 使用道具 举报
Super d = new Demo("A");读Demo的构造函数,因为其第一行有隐式的super();所以去找父类的空参数构造函数,打印一个B,然后i变为2,父类就执行完了,回子类的构造函数中执行下一句代码打印一个C,i为了5,所以d.i是5.
回复 使用道具 举报
因为第二例子中,子类并没有再次定义一个变量i,子类实际上是集成了父类的变量i,跟例子1的本质区别再这里,例二中,无论把d声明为Super类型还是Demo类型,i的值都是一样的
回复 使用道具 举报
无论是实例1还是实例2中,都是父类变量引用指向了子类的对象,即使多态,在多态中,父类变量调用类中的成员变量时,无论编译还是运行都看父类,因此结果都会是父类中成员变量的值。
在实例1中, Fu f = new Zi();f.num;前一句话的运行的过程是创建子类对象的时候会先调用父类的构造函数,再调用子类的构造函数,虽然子类也继承了父类的num成员变量,但自己重新定义了一个num成员变量,对父类的成员变量实行了覆盖,因此在子类中修改num的值都是子类自己定义的num值,对父类的num成员变量没有影响,此时要改变父类的num成员变量,除非用super.num访问才能改变。
在实例2中,Super d=new Demo("A");d.num;同样是实例1过程,但是子类并没有定义自己的同名num成员变量,用的是继承父类的成员变量,因此最后在子类的构造函数中把父类的num成员变量的值变成了5.
总之在多态中,父类成员变量调用成员变量,结果都是父类成员变量的值
希望对你有帮助
回复 使用道具 举报
Animal 中级黑马 2015-5-24 13:55:35
9#
f.method2();//zi 2 多态时,方法看对象本身的方法
回复 使用道具 举报
不能颓废!不能退缩!不能懒惰~
回复 使用道具 举报
iamnoten 发表于 2015-5-24 13:46
因为第二例子中,子类并没有再次定义一个变量i,子类实际上是集成了父类的变量i,跟例子1的本质区别再这里, ...

如果把示例一中子类的int num = 5也去掉,但是结果一样还是3。示例一、二都是继承的父类的变量,为什么就是不一样?
回复 使用道具 举报
lhwinner 发表于 2015-5-24 13:52
无论是实例1还是实例2中,都是父类变量引用指向了子类的对象,即使多态,在多态中,父类变量调用类中的成员 ...

好像明白了,是不是示例二中为i = 5,而不是int i = 5,创建对象后父类中的int i = 0.已经被修改成了5了,对吧?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马