class A{
int name = 12;
}
class B extends A{}这时B继承了A的name作为自己的成员变量,在B类里对父类的name和自己的name操作都是一样的结果。那是否A和B共用同一个成员变量呢。

解决方案 »

  1.   

    public class Base{public int publicVarOfBase=1; //public访问级别private int privateVarOfBase=1; //private访问级别int defaultVarOfBase=1; //默认访问级别protected void methodOfBase(){} //protected访问级别}public class Sub extends Base{public void methodOfSub(){publicVarOfBase=2; //合法,可以访问Base类的public类型的变量defaultVarOfBase=2; //合法,可以访问Base类的默认访问级别的变量privateVarOfBase=2; //非法,不能访问Base类的private类型的变量methodOfBase(); //合法,可以访问Base类的protected类型的方法}
      

  2.   

    是B将A的成员变量继承过来,即B也拥有此变量,而不是共用变量。
      

  3.   

    protect static int name = 12;
    这么些不知道可不可以
      

  4.   

    类是抽象,
    protect static int name = 12; 
    这样有意义吗?
      

  5.   

    class A {
    int name;
    }class B extends A{
    void display(){
    System.out.println(name);
    System.out.println(super.name);
    }
    }我是说name和super.name 是不是同一个变量。
      

  6.   

    class A {
        int name;
    }class B extends A{
        void display(){
            System.out.println(name);
            System.out.println(super.name);
        }
    }如上这么写的话 name 就是 super.name!
      

  7.   

    两种情况:
    1.为了方便测试,我把name改为String类型了,并且为类B添加了setN和getN两个方法,通过下面的程序,我们可以看见,对象b的name没变,而对象c的name变了。所以,两个对象所引用的变量不是同一个变量。class B 
    {
        private String name = "我没变!";
    public void setN(String name)
    {
    this.name = name;
    }
    public String getN()
    {
    return name;
    }
    }public class C extends B
    {
    public static void main(String [] args)
    {
    C c = new C();
    B b = new B();
    c.setN("我变了!");
    System.out.println(b.getN() + "" + c.getN());
    }
    }2.在这一段代码中,我把name设置成了静态的。class B 
    {
    static String name = "我没变!";
    public void setN(String name)
    {
    this.name = name;
    }
    }public class C extends B
    {
    public static void main(String [] args)
    {
    System.out.println(name);//输出一次没改变以前的成员变量name;
    C c = new C();
    B b = new B();
    b.setN("我变了!");//因为name是静态的,所以在类中所有的对象共享同一个name,改变其中一个,所有对象的name都被改变。这样的话,name变是引用的同一个变量。
    System.out.println(b.name + "" + c.name);
    }
    }结论:当name被设置为静态的时候,类C和类B的对象引用的是同一个变量,当name不是静态的时候,类C和类B的对象引用的是不同的name变量。按楼主的情况,他们应该不是引用的同一个变量。(汗一个,我是新人,没想到写这么多,错了大家别丢砖头啊。)
      

  8.   

    super.name和name肯定不是一个东西啊,一个是A的对象的属性一个是B的对象的属性,不会是一个东西
      

  9.   

    11楼是否有考虑当name是static的情况类?
      

  10.   

    对,我说的是lz这种情况,谢谢ls的提醒,当name是static的时候,他就是类的属性而不是对象的属性了。
      

  11.   

    静态的或者成员变量设置为final常量就是一个,如果没有修饰符就是不同的两个变量
      

  12.   

    个人觉得就算是final的也不是一个,比如下面的代码
    *************************************************************
    package a;
    public class A{
       protected final String AA="test";
    }
    **************************************************************
    package b;
    public class B extends A{
      public static void main(String arg[]){
            System.out.println(new B().AA);//这句可以
            System.out.println(new a.A().AA);//这一句是不能通过编译的
    }
    }
    ***************************************************************
    所以这两个AA应该不是一个东西。
      

  13.   

    晕,通俗的理解,BextendsA
    那么,A就是B的父亲,他们自然有关系,那么,孩子B在很多的外在表现上都拥有父亲A的眼睛,皮肤颜色等属性,就算表示曾不一样,也只代表A父亲类与B儿子类之间的基因传递发生了变化,就是JAVA所谓的多态,这个基因也就是属性的改变可能是由父亲的父亲决定,或者是近亲或远亲中的某些属性或方法,比如SET,GET方法等决定的,但是,不要忽略他们共有的属性,那就是人类的基本属性,比如动做,思想等,这些是所有类都必须实现的方法,或者是属性,而我们程序员做的,是在这个儿子或父亲上做一些逻辑性的处理,比如吃饭怎么吃,跑步怎么跑,我们规划某个对象,以及其后代可能产生的(属性比如眼睛或方法比如看,吃,跑)变异,这个便宜可亿是比如,儿子的皮肤比父亲的黑,我们在基层设置颜色基调,比如儿子跑的比父亲快,程序员就设置这个动作的实现的时间缩短.
    恩,大概就是这些简单的意思了
      

  14.   

    首先 ,楼主的说法有点问题。子类只不过拥有父类的方法,而不是和父类共用一个变量。可以用下面的程序来加以证明:
    class A
    {
    public int name = 12;
    }class B extends A
    {
    B()
    {
    name =13;
    }
    }public class Main
    {
    public static void main(String[]args)
    {
    A a = new A();
    B b = new B();
    System.out.println((a.name==b.name)?"共用变量":"不是共用变量");
    }
    }
    输出结果是:不是共用变量
    如果是共用变量的话,子类中修改了name成员的值,那么父类对象的成员的值也应该改变。但实际上,在内存中
    A和B分配了不同的内存,所以不是共用。
      

  15.   

    我就是问,如果子类如果继承父类,那么super.name  和 name 是不是指向同意内存。
      

  16.   

    应该不是共用同一成员变量的
    两个类都不是静态的,所以在实例化一个对象时,分配内存空间,例:
    B b=new B();
    在b这个实例对象中的分配了named的内存空间。
    再实例化一个对象a,
    A a=new A();
    在对象a对应的内存空间就会有a对象的成员变量name的空间,所以说它们不是共用一成员变量的。
    如果name被定义为static的话,那在实例对象中它们就共用一内存了。
      

  17.   

    我现在只实例化B ,B的name和父类的name也就是super.name是不是同一个name。
      

  18.   

    在java中共有四种访问控制修饰符:public,protected,default(不用写),private.private   私有(只能在本类内部访问)      不能继承
    default   本类+同包可访问              同包子类可以继承,不同包子类不能继承
    protected 本类+同包+不同包子类可访问  可以继承
    public    公开                          可以继承
      

  19.   

    楼主的问题里没有没有说明是STATIC变量,所以我认为没有必要讨论STATIC这种情况。
    我认为,如果子类如果继承父类,那么super.name  和 name 指的不是同一内存,而是两个不同的内存空间。
      

  20.   

    不是同一个内存空间,那为什么修改子类的name,父类的super.name也被修改了呢。
      

  21.   

    ls的各位好像对lz的问题不是很理解
    lz的问题我也想到过,不过很难解释,
    lz自己静下心来好好思考一番应该能够
    领悟的,祝lz好运