黑马程序员技术交流社区

标题: 关于获取子类对象变量的问题 [打印本页]

作者: 立志转行    时间: 2015-5-23 22:33
标题: 关于获取子类对象变量的问题
示例一、
--------------------------------------------------
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?求解惑



作者: 小峰Raul    时间: 2015-5-23 22:42
还没学到这里 表示不怎么看得懂
作者: Huylens    时间: 2015-5-23 23:17
因为f或者d都是父类引用。
作者: Amu    时间: 2015-5-23 23:58
Super d=new Demo("A"); 你创建子类对象时隐式调用了父类的super()方法,使父类的成员变量i=2;
d.i由于成员变量不存在重写的情况,所以看父类,父类中i=2
作者: 立志转行    时间: 2015-5-24 09:22
Amu 发表于 2015-5-23 23:58
Super d=new Demo("A"); 你创建子类对象时隐式调用了父类的super()方法,使父类的成员变量i=2;
d.i由于成 ...

示例二中,d.i的结果不是2啊!
作者: wangkai    时间: 2015-5-24 13:17
Super d = new Demo("A");读Demo的构造函数,因为其第一行有隐式的super();所以去找父类的空参数构造函数,打印一个B,然后i变为2,父类就执行完了,回子类的构造函数中执行下一句代码打印一个C,i为了5,所以d.i是5.
作者: iamnoten    时间: 2015-5-24 13:46
因为第二例子中,子类并没有再次定义一个变量i,子类实际上是集成了父类的变量i,跟例子1的本质区别再这里,例二中,无论把d声明为Super类型还是Demo类型,i的值都是一样的
作者: lhwinner    时间: 2015-5-24 13:52
无论是实例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
f.method2();//zi 2 多态时,方法看对象本身的方法
作者: !85684009ex    时间: 2015-5-24 14:23
不能颓废!不能退缩!不能懒惰~
作者: 立志转行    时间: 2015-5-24 18:53
iamnoten 发表于 2015-5-24 13:46
因为第二例子中,子类并没有再次定义一个变量i,子类实际上是集成了父类的变量i,跟例子1的本质区别再这里, ...

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

好像明白了,是不是示例二中为i = 5,而不是int i = 5,创建对象后父类中的int i = 0.已经被修改成了5了,对吧?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2