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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 龚振 龚振 龚振 中级黑马   /  2012-4-9 21:24  /  2478 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

子类继承父类,子类可以覆写其方法,那成员变量呢,一下情况可以么,会有什么问题吗?没理解清楚
class fu{
static int num =1
method(){}
}
class zi extends fu{
int num =2//第一种
static int num =2//第二种
static int num = 2//第三种,当fu中为int num=1
method(){}
}

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

7 个回复

倒序浏览
本帖最后由 曾晓文 于 2012-4-9 21:40 编辑

会报错,成员变量时不能覆盖和重载的,只要你的子类存在与父类名称相同的成员变量,编译就会报错。

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

回复 使用道具 举报
子类中的成员变量可以继承父类的成员变量,也可以自己定义变量。
子类访问本类中的成员变量,用this。
子类访问父类中的成员变量,用super。
this代表的是本类对象的引用,
super代表的是父类对象的引用。

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

回复 使用道具 举报
子类可以继承父类的成员变量,子类的成员变量包括从父类继承的成员变量(包括从祖先类中继承的成员变量)以及子类中重新定义的成员变量。
1、可以继承的成员变量
可以继承的成员变量与成员变量的访问控制类型有关,成员变量的访问控制类型包括public、protected、缺省的和private。子类继承父类之后,可以继承父类的public和protected类型的成员变量
2、覆盖父类的成员变量
假设父类中定义了成员变量a并且能够被子类继承,子类中又定义了成员变量a,这样子类中会有两个名字为a的成员变量。

注意:
1)从父类继承的成员变量,其访问控制符仍然相同。
2)子类定义与父类同名的成员变量,并没有覆盖父类的成员变量,而是两个成员变量共存。





评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

回复 使用道具 举报
1.static 修饰的变量存在于数据区来共享。该类所有的对象享有同一份资源。你new 一个对象,就在数据区存在。没被static修饰的属性,new 对象时,属性存在于你在堆空间new 出来的内存空间中。
2.当你创建子类的实例对象的时候,系统会对应的创建一个父类对象。
3.查找你的num属性时,首先查找该方法中是否有num的局部变量
                     然后查找当前子类中是否有num属性
                     再查找父类是否有num属性,这样一直向上知道 Object ,如果还没找到,才会编译报错。
所以,第一种,如果要操作num ,他会在子类中查找,所以此时你操作的num= 2.
         第二种,子类的num 用static修饰,与父类中的num同处于 数据区(data),这时你操作num,会首先对子类自己的num建立引用关系,如果需要调用父类的,就需要super.num 或者 fu.num。
         第三种,父类没有被static修饰,存在于父类new出来的堆空间内存中,子类中的num属性存在于数据区。

我这样理解的。。。

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

回复 使用道具 举报
class Fu
{
       
    public String name="fu";
        public void show()
        {
                System.out.println("funame="+name);
        }
}

class Zi
{
       
        public String name="zi";
        public void show()
        {
                System.out.println("ziname="+name);
        }
       
}




程序修改以后
class Fu
{
       
    public String name="fu";
        public void show()
        {
                System.out.println("funame="+name);
        }
}

class Zi
{
       
        public String name;
        public void show()
        {
                System.out.println("ziname="+name);
        }
       
}

显示结果为




这说明了,成员变量时不存在继承的。这可以看成成员变量在一个类内为局部变量,这只是一个值,不可继承的。保守的解释

2.JPG (15.13 KB, 下载次数: 133)

2.JPG

3.JPG (17.38 KB, 下载次数: 119)

3.JPG

点评

你找name属性的时候,子类中存在,但是没有给初始值,因为是String,所以就null了。 要看是否继承,不需要在子类中定义,直接在方法中输出就行。  发表于 2012-4-9 23:01

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

回复 使用道具 举报
子类可以继承父类的成员变量,和方法。方法可以覆盖重写,而成员变量不存在着覆盖重写。因此不管事static,就是你所说的三种情况,都是一样的。

class Fu
{
         int num =1;

       
}
class Zi extends Fu
{
         int num =2;
        public static void main(String[] args)
        {
                Zi z = new Zi();
                System.out.println(z.num);//调用的是子类的num
                                Fu z = new Zi();
                                 System.out.println(z.num)//调用的是父类的num
        }

}

评分

参与人数 1技术分 +1 收起 理由
岳民喜 + 1

查看全部评分

回复 使用道具 举报
白刚 注册黑马 2012-4-11 22:08:47
8#
个人觉得二楼的回答的很好!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马