黑马程序员技术交流社区

标题: 继承问题 [打印本页]

作者: 左耳的鱼    时间: 2013-6-22 23:47
标题: 继承问题
本帖最后由 左耳的鱼 于 2013-6-24 21:02 编辑

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);

        }

}
变量i的值是怎么变化的,子类中的i与父类中的i是指的一个变量吗,子类是不是把父类的i也继承了,可以改变i的值
作者: 傲鸽    时间: 2013-6-23 00:15
private 的属性和方法是不能被继承的。能继承public,default,protected 的属性和方法。所以此程序中子类继承了父类的属性i,子类中的i与父类中的i不是同一个i,但是子类中的i是从父类继承过来的,i 的值从0变成2再变成5
作者: 傲鸽    时间: 2013-6-23 00:33
补充一下,说的不太明白,其实子类的构造方法中隐藏了一个this关键字,就是this.i=5,谁调用的它改变的就是谁的i 的值,显然是身为Super类型的d所指的对象调用的,所以改变的是身为Super类型的d的属性i 的值,所以最后输出的是d.i,这时的d是Super类型的,所以值就为5了
作者: 王廷顺    时间: 2013-6-23 10:49
子类与父类中的i不是同一个变量,你可以在这两个地方分别加一条语句(注释部分):
public Super(){
            System.out.println("B");
            i+=2;
       //     System.out.println("i="+i);   
    }
public Demo(String a){
        super();
        System.out.println("C");
       // System.out.println(i"i="+i);
        i=5;
}
打印结果都是i = 2;
再结合楼上说的你就明白了。
作者: emos-c    时间: 2013-6-25 09:05
本帖最后由 emos-c 于 2013-6-25 09:07 编辑

        对于继承,我认为可以这样理解(只是用于理解):相当于将父类中所有非私有的成员(成员变量和成员方法)复制,并在子类中粘贴了一份。所以子类中的i与父类中的i都是各自类中的变量,指的也就不是同一个变量。子类修改的也是自己类中变量i的值(参见楼上说明,本类中变量i前省略了this关键字),如果需要访问和修改父类中i的值,可以在前面加super关键词修饰,声明访问的是父类中的变量i的值。想要知道i的值是怎么变化的,就需要知道函数的加载顺序。
        加载顺序:JVM读取主函数--->栈内存开辟空间,定义变量i,赋值4---> Super d=new Demo("A");--->加载super类,执行该类的static代码块(在这里没有)--->栈内存开辟空间,定义引用型变量d,堆内存中开辟空间,分配内存地址值--->new一个新对象,建立对象的特有属性--->进行默认初始化,显示初始化,构造代码块初始化(在这里也都没有)--->对对象进行对应的构造函数初始化,构造函数内第一句是访问了父类的空参数构造函数,所以跳转到父类该构造函数,执行打印“B”,i=2;--->父类执行完毕,回到子类构造函数中继续执行,打印“C”,i=5--->将内存地址赋给栈内存中的变量d,使d指向该对象--->Super d=new Demo("A");该语句至此执行完毕--->System.out.println(d.i);执行打印“5”。--->函数执行完毕。
作者: 袁梦希    时间: 2013-6-25 09:22
加油啊  楼主




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