这句对吗,为什么很多书都是这样说
public class A{
  private String s=new String("123");
  public void out{
  System.out.print(s);
   }
public class B extends A{
  public static void main(String args[])
{
   B b=new B();
   b.out()
}
如果B没有继承A中的s,为什么又可以输出123如果B没有继承A中的s,s又存在内存的什么地方
在C++中又是怎样的

解决方案 »

  1.   

    我也是初学者,我的观点是:
    Private类型是保护的含义,就是说除了本类的对象以后其他类对象都不能直接访问的,
    除非你在基类中提供了接口访问该变量,这是允许的,对于这样的变量一般是用get和set方法来实现赋值和取值的。
      

  2.   

    对啊,在B中直接访问s是访问不到的,out()可以访问,B通过out()间接访问了s,这个有点类似c++中的单根模式。
      

  3.   

    谢谢大家了
    yuz_yuz(冲天小飞鱼)既然你说对,那B没有继承A中的s,s又存在内存的什么地方我的观点也是继承了,但不能直接访问
      

  4.   

    B b=new B();
    在执行构造方法之前,它会先初始化s.
      

  5.   

    interhanchi(艰难困苦,玉汝于成!) 你意思是说,s不存在于b这个对象中了
      

  6.   

    在java 子类继承父类的的非私有变量和方法。这句话是对的呀(它并没有说不继承私有),如果你觉得有道理,就加上
    在java 子类也继承父类的的私有变量和方法。
      

  7.   

    Java 中,继承一词的意义是有限制的。
    一个子类只能继承其父类的可访问的成员,并且该子类没有覆盖或者说隐藏父类中的那些可访问成员。
    一个类的成员就是指在这个类中所声明的属性和方法,再加上从其父类继承而来的属性和方法。在楼主所举的例子中,s 是 B 所不能访问到的,所以 B 不能从 A 继承这个属性。但是,注意了,呵呵:)
    虽然 B 类没有从 A 类继承 s 这个属性,s 仍然是 B 对象的一个属性。因为当一个对象被创建的时候,JVM 就要分配足够的空间给这个队像所有的实例变量,包括在这个对象的类以及其所有父类中定义的所有属性。所以在楼主所举的例中,实例化的 B 的对象可以输出实例变量 s 的内容。
      

  8.   

    勘误一下:JVM 就要分配足够的空间给这个 队像 所有的实例变量应为:JVM 就要分配足够的空间给这个 对象 所有的实例变量
      

  9.   

    interhanchi(艰难困苦,玉汝于成!) 你意思是说,s不存在于b这个对象中了对b来说,它根本就不知道还有s这个变量!
      

  10.   

    interhanchi(闭关修练中!) 
    我当然知道,对b来说,它根本就不知道还有s这个变量!,但我问的是s是否存在于b这个对象中,你似乎回避答这个哦,呵呵shxchenwind(秋风扫落叶) 
    这个应该没有汲及到多态吧我比较倾向于 holy_phoenix(神保佑 祂的儿女)的说法  呵呵
      

  11.   

    坐下好好学习中...
    -------------------------------------------------------------------------
    您好,网美书店全场5折-8.8折,深圳东莞所有地区送书上门(免配送费),书到付款!网美书店网址:http://www.wanme.com咨询QQ:  419777139
      

  12.   

    我的理解是:子类是不能继承父类的私有变量的。私有变量是类的自己的独有的。正如zhang21cnboy(事了抚衣去,不留身与名) 说的一样,那样完全破坏了面向对象的规则。你的例子中只是通过子类调用了父类的方法而访问了父类的私有属性。如果你的子类自己重写了out方法,那么重写的代码中是不能访问父类的私有变量的。除非你重写中 加上super.out();语句。那么你再次在子类中直接调用out()方法时 根据多态原则它将指向子类的out()方法,然后在out()再调用super.out()来访问父类的私有变量。如果子类out()中没有super.out()的话,那么就不能访问父类的私有属性了.
      

  13.   

    大家应该分清楚 Java 中 class 和 object 的区别。
      

  14.   

    我的理解是:A是B的摸板, B在A的基础上创造新的东西,在调用B的方法时,如果此方法B没有,那么它会向它的父类A去寻找,看有没有此方法,如果有就调用此方法,如果没有就报错.大家看看这样的理解对不对.
      

  15.   

    我觉得s存在与对象A的堆栈中,因为在调用out时,会实例化一个A 的对象.
      

  16.   

    zsjin0208(从零开始)向对象b发送消息out,是不会实例化A类型的对象的
      

  17.   

    to xingming9(星螟) :你的理解不对。java默认所有的方法都是多态。只要子类override了!在子类会为所有父类的变量分配内存。通过多态去访问,即可修改本实例中父类的private变量的值(已测试),当然这个值仅能在这个类中有效,从侧面也反应了多态是包含父类的变量的,或者是实例更本质一点。
      

  18.   

    首先,string s;s是对象,并不是变量,其次,子类并没有对s进行直接的引用,而是通过out方法对它的访问,所以那句话是对的
      

  19.   

    概念上不敢随便发表意见,不过使用时可以这样理解,类B的代码相当于:
    public class B{
      private String s=new String("123");
      public void out{ System.out.print(s); }
      public static void main(String args[])
    {
       B b=new B();
       b.out()
    }
    }
    其他都是OO-Language的编译和运行机理,就不要追究了
    有空可以研究其本质
      

  20.   

    在java 子类继承父类的的非私有变量和方法。这句话是对在java 子类也继承父类的的私有变量和方法。这句话就不对了
      

  21.   

    是啊,希望高手能给出个明确的答复。。
    我感觉很迷惑啊,现在有朋友在blog上解释了这个问题并测试了,不过我觉的好象不对,
    大家如果有兴趣可以去看看,地址是:
    http://blog.csdn.net/holy_phoenix/archive/2005/09/23/487931.aspx?Pending=true
      

  22.   

    啊尼陀佛
    OOP有可能比现在某些程序员还老.
    ---初学者
      

  23.   

    同意三楼greenmars2004的观点:继承是继承了,但不能直接访问,C++差不多在java编程思想第三版中146页这样说:“当创建了一个派生类的对象时,该对象包含了一个基类的子对象,这个子对象于你用基类直接创建的对象是一样的。”