我不是大神,在看这些问题的同时我也在学习
因此说一下我的答案-----------------------------------------------------------------------------首先私有字段子类是不能继承过来的,你可以通过查看class文件去看内部(工具:http://www.oschina.net/code/snippet_12_2154)看到的字段数目应该是0,也就是说没有继承过来
但是公用方法继承过来了这里在new对象的时候,调用了super(n),那就实例化的是父类的name字段,但是这个name字段对于子类是不可见的,但是子类可以通过公用的get和set获得,这里是不是发生了向上转型?
我测试了一下
System.out.println(cat instanceof animal);
输出是true
也就是子类是父类的一个实例
name字段属于谁的,我觉得应该是子类,至于私有属性仅仅是权限控制而已,对于子类来说,name字段是隐藏的,程序员是不能够直接操作的,仅此而已坐等专业解释

解决方案 »

  1.   

    结果很明显,输出“猫”。
    楼主不要纠结这些语法细节。
    不要纠结到底是内存中哪个对象的属性
    Java设计了干吗的,不就是忽略C++那些细节吗。
      

  2.   

    如果你是初学的话还是不要在意这些,与其说是细节,不如说是牛角尖
    如果你这样学下去的话估计一年半载都入不了门再说你最好到StackOverFlow上问专业问题,那上面砖家才多,也热心,英文过得去就行,不要怕语法错误,人家不在意
      

  3.   

    一:输出的是子类的name
    二:虽然父类的变量私有了,但是在子类对象的内部还是有父类的私有的变量,这些变量不属于子类的,但是子类可以用,打个比方:你去公司上班,老板分配了一台电脑给你,虽然你没有拥有它,但是你还是可以使用它的。不知道你能理解不
      

  4.   

    输出的是父类的name吧?子类里String name=“dog”;也是输出猫
      

  5.   

    输出的是父类的name吧?子类里String name=“dog”;也是输出猫
    这个问题不好说,但是给你个代码你看看吧public class testExtends {
    public static void main(String[] args) {
    Cat c = new Cat("猫");
    System.out.println(c.getName());
    Animal a = new Animal();//没有给动物的name另外赋值
    System.out.println(a.getName());//但是拿到的值是动物而不是猫,说明创建Cat对象时并没有改变name的属性,只是Cat对象自己的name
    }
    }
    class Animal {
    private String name="动物";
    public Animal(){ }
    public Animal(String name) {
    this.name = name;
    }
    public String getName() {
    return name;
    }
    }
    class Cat extends Animal {
    String name="猫";
    public Cat(String n) {
    super(n);
    }
    public String getAnimalName(){
    return super.getName();
    }
    }
      

  6.   

    子类继承了父类,但是子类里面定义了name字段吗?很明显没定义,所以打印是父类的,构造函数调用了父类的构造函数,怎么会打印子类的呢,根本没有,如何打印?
    子类继承了私有段,从公共方法继承来看,可以调用公共方法设置父类的私有段,首先得继承,才能去操作,只是间接操作罢了,但是子类本身是不能够直接操作了为了防止破坏其封装行发生直接的安全隐患
      

  7.   

    输出的是父类的name吧?子类里String name=“dog”;也是输出猫
    这个问题不好说,但是给你个代码你看看吧public class testExtends {
    public static void main(String[] args) {
    Cat c = new Cat("猫");
    System.out.println(c.getName());
    Animal a = new Animal();//没有给动物的name另外赋值
    System.out.println(a.getName());//但是拿到的值是动物而不是猫,说明创建Cat对象时并没有改变name的属性,只是Cat对象自己的name
    }
    }
    class Animal {
    private String name="动物";
    public Animal(){ }
    public Animal(String name) {
    this.name = name;
    }
    public String getName() {
    return name;
    }
    }
    class Cat extends Animal {
    String name="猫";
    public Cat(String n) {
    super(n);
    }
    public String getAnimalName(){
    return super.getName();
    }
    }

    嗯.有道理
      

  8.   

    一、子类的name
    二、肯定能继承父类的私有成员。
      

  9.   

    对于子类,是一定要在构造方法里首先调用父类构造方法的。这是为"在子类的堆内存区域"给"子类把从父类继承过来的东西"开辟一块内存。在这块内存中是有父类的私有变量的。只是通过子类引用不能直接访问,但是可以通过公有方法来获取该私有变量。
    而如果创建父类对象,则该对象是在另一块堆内存区域,该区域与子类中为"从父类继承过来的成员开辟的堆内存"不一样。即没有关系。
    super()方法是调用父类构造方法,就是为在"子类对象内存区域那儿再给继承父类的成员开辟一块区域,这两个'区域'是连起来的",可以说同属于子类对象。只是私有成员子类不可以"直接引用",可以通过其它公有方法来获取。
      

  10.   

    java就是通过子类构造方法中必需在第一行调用父类构造方法,这个简单的机制,来实现继承关系的。因为调用了super()所以在子类的内存区域给父类的成员开辟了一块内存,这块内存子类可以通过子类引用来调用。而若直接创建的父类对象,它若占的内存与上述子类调用的父类内存不同,且无任何关系。记住调用构造方法是开辟内存,new是起到计算内存大小的作用,即告诉计算机要为该对象开辟多大内存。
      

  11.   

    弄明白这个问题需要理清几个重点:1、关于继承《Java编程思想-第四版》这样说了:当继承现有类型时,也就创建了新的类型。这个新的类型不仅包括现有类型的所有成员(尽管private成员被隐藏起来,并且并且不可访问)。这句话在第1章 1.6继承小节里。对于上面的例子也就是说Cat将Animal中所有的成员都继承过来了,但是注意了因为private成员变量是通过继承的方式复制过来的,这种方式比较特殊,所以是无法使用cat.name这种方式访问的,但是Cat类信息中确实包含了这个属性。2、创建了几个对象?Cat cat = new Cat("Tom")这句话我们都知道会创建对象,而且Cat的构造方法中通过super调用了父类Anamial的构造方法,会创建Cat的对象,这个我们都知道,但是会不会创建Animal的对象呢?答案是不会的,这里我们只是调用了构造方法,并没有new,所以不会创建Aniaml的对象。3、name的值是怎么设置的?通过上面的分析我们知道Cat类中会有name的信息,但是因为name在父类中是private的,我们继承先来之后并不能再Cat类中显示地进行设值,那上面为什么会设置得到呢,这里是通过父类间接设置的,调用了Cat的有参构造器,这个构造器会将参数传递给Animal的构造器,Animal的构造器帮我们完成了Cat对象的name设置操作。所以对于你的问题回答就是:-  输出的name值是子类的也就是Cat对象的
    -  可以继承private成员变量
      

  12.   

    这里的name应该是父类的私有属性,且并没有被子类继承.但是在父类中有一个get方法.它是公共的方法,可以说是父类对外的一个接口,通过这个接口(public的权限)任何一个类都可以获取那么属性.这里的他与是否继承毫无关系.接口是开放的,没有继承关系,也可以通过接口来获取name属性.
      接口并不一定是interface这个语法.只要是对外的一个公共方法,都可以视为接口.
      

  13.   

    通过调用父类构造函数给父的name属性赋值,通过调用父类方法访问父类属性.
      

  14.   

    个人觉得是父类的,但是我调试,cat这个对象里面确实有name字段啊,求解释???谢谢
      

  15.   

    public class testExtends {
        public static void main(String[] args) {
            Cat c = new Cat();
            System.out.println(c.getName());
            Animal a = new Animal();//没有给动物的name另外赋值
            System.out.println(a.getName());//但是拿到的值是动物而不是猫,说明创建Cat对象时并没有改变name的属性,只是Cat对象自己的name
        }
    }
    class Animal {
        private String name="动物";
        public Animal(){
     
        }
        public String getName() {
            return name;//相当于this.name,所以输出的肯定是父类的.
        }
    }
    class Cat extends Animal {
        String name="猫";
        public String getAnimalName(){
            return super.getName();
        }
    }
      

  16.   

    如果能继承过来使用,那还要这个 private 关键字有什么意义呢?
      

  17.   

    父类,子类中没有将getName方法重写,所以自动调用父类的getName方法
      

  18.   

    成员变量是私有的,子类不能直接调用,但是子类可以通过public方法也就是getName方法访问;一般成员变量都是私有,但是会提供公共获取方法