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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 左耳的鱼 中级黑马   /  2013-6-22 23:47  /  1526 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 左耳的鱼 于 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的值

评分

参与人数 1技术分 +1 收起 理由
张勇1993 + 1 赞一个!

查看全部评分

5 个回复

倒序浏览
private 的属性和方法是不能被继承的。能继承public,default,protected 的属性和方法。所以此程序中子类继承了父类的属性i,子类中的i与父类中的i不是同一个i,但是子类中的i是从父类继承过来的,i 的值从0变成2再变成5
回复 使用道具 举报
补充一下,说的不太明白,其实子类的构造方法中隐藏了一个this关键字,就是this.i=5,谁调用的它改变的就是谁的i 的值,显然是身为Super类型的d所指的对象调用的,所以改变的是身为Super类型的d的属性i 的值,所以最后输出的是d.i,这时的d是Super类型的,所以值就为5了

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报 1 0
子类与父类中的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;
再结合楼上说的你就明白了。

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
本帖最后由 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”。--->函数执行完毕。

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
加油啊  楼主
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马