黑马程序员技术交流社区

标题: 成员变量的继承问题 [打印本页]

作者: 郭阳    时间: 2012-9-8 22:24
标题: 成员变量的继承问题
本帖最后由 郭阳 于 2012-9-8 23:47 编辑

继承的时候成员变量是可以继承的
如果父类定义一个  private int x=1;
在子类中覆写  int x =2;
那么x在子类中就不是私有的了对吗
——————————————————————————————
  1. class A
  2. {
  3. int x=0;
  4. void get(int x){this.x =x;}
  5. }


  6. class B extends A
  7. {
  8. int x=1;
  9. }


  10. class Demo
  11. {
  12. public static void main (String[] args)
  13. {

  14. B b=new B();
  15. b.get(2);
  16. System.out.println(b.x);
  17. }
  18. }
复制代码
再有就是以上代码为什么运行结果是1,求解

作者: 黄基焜    时间: 2012-9-8 22:43
本帖最后由 黄基焜 于 2012-9-8 22:53 编辑

子类和父类拥有同名成员变量的时候,优先子类的,就这样而已。
还有变量是没有覆写的,只有函数才有。
而且你的get函数操作的是父类的成员变量,并不是子类的成员变量。

class A
{
int x=0;
void set(int x)
{
  this.x =x;
}
void get()
{
  System.out.println(x);
}
}

class B extends A
{
int x=1;
}

class Demo1
{
public static void main (String[] args)
{
  B b=new B();
  b.set(2);
  b.get();
  System.out.println(b.x);
}
}


作者: 杨习平    时间: 2012-9-8 22:54
继承(重点)
        (1)把很多类的相同特征和行为进行抽取,用一个类来描述。让多个类和这个类产生一个关系。
           这样的话,多个类就可以省略很多代码。这个关系就是继承。java中用extends关键字表示。
        (2)继承的概述
                A:被继承的类称为超类,父类,基类。
                B:继承父类的类被称为子类,派生类。
                C:格式
                        class Demo extends FuDemo
                        {
                       
                        }
        (3)继承的体系结构
                A:多个具体的对象,不断的向上抽取共享的内容,最终形成了一个体系。这个体系叫做继承体系。
                B:继承体系的学习和使用原则
                        **学习顶层的内容。因为他是整个体系的共性内容。
                        **创建子类使用。也就是使用底层的具体对象。
        (4)继承的特点:
                A:java中只能单继承,没有多继承。
                B:java可以有多重(层)继承。 爷爷--父亲--儿子--孙子
        (5)继承的代码体现。
                class Fu
                {
                 
                }

                class Zi extends Fu
                {
               
                }

                Zi z = new Zi();
                用z对象操作。
        (6)子父类中的成员关系
                A:成员变量
                        在子类方法中使用一个变量时:
                        首先,在方法的局部变量中找这个变量,有则使用。
                        否则,在本类中找成员变量,有则使用。
                        否则,在父类中找成员变量,有则使用。
                        否则,报错。               
                     B:成员方法
                        用子类对象使用一个方法时。
                        首先,在子类中找这个方法,有则使用。
                        否则,在父类中找这个方法,有则使用。
                        否则,报错。

                        当子父类中的方法名相同时的现象被称为重写。

                                             
                        重写和重载的区别?
                        重载:在同一类中。方法名相同,参数列表不同。

                        重写:在不同类中(子父类中)。
                              方法声明相同(返回类型,方法名,参数列表)。

                        重载可以改变返回类型。

                        重写需要注意:
                                **子类方法的访问权限要大于等于父类方法的访问权限。
                                **静态只能重写静态。一般不会出现。
                C:构造方法
                        **子类的实例化过程
                                ***子类创建对象时,会先去创建父类的对象。
                                    默认是去调用父类的无参构造方法。
                                ***子类构造方法中,第一行默认是super()
                                ***为什么子类中第一行会默认有super()
                                        因为他继承父类的成员使用,使用前这些成员必须初始化,
                                        而他们是父类的成员,所以,必须通过父类进行初始化。
                                        所以,会先创建一个父类的对象。
                        **当父类没有无参构造方法时
                                必须使用this或者super调用其他的构造方法。

作者: 杨新文    时间: 2012-9-8 22:54
1、子类中的int x = 2;并没有覆写父类中的x,因为子类只能继承到父类的非私有成员
2、b.get(2);实际上调用的是父类的get方法,而方法体中的this.x就是本类中的x,即是父类中的x,它的值的改变跟子类没有关系,所以最后打印子类x时其值还是1。



作者: 蓝迪    时间: 2012-9-8 23:15
第一个问题

当你在父类定义一个 private int x=1; 之后,你的子类继承父类的时候,就继承不了x的值
因为x是父类私有的,他不允许子类使用
而在子类中再写 int x =2; 这已经是一个新的子类中的变量x了,与父类的x没有任何关系,所以x不是私有的

第二个问题

b.get(2) 这个方法调用的是父类的方法

void get(int x){this.x =x;}

在父类中,this.x代表的是父类的x,所以b.get(2) 的作用是把父类的x的值改变成2
而子类中的x没变

当System.out.println(b.x);语句执行时,输出的是b中的x,所以输出为1
作者: 郭阳    时间: 2012-9-8 23:45
已解决谢谢
作者: 王德升    时间: 2012-9-8 23:51
杨习平 发表于 2012-9-8 22:54
继承(重点)
        (1)把很多类的相同特征和行为进行抽取,用一个类来描述。让多个类和这个类产生一个关系。
            ...

哥们 我看你的帖子感觉你基础还是不错的,但是请你不要每次就复制这些文字,谢谢合作!




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