父类私有字段问题

ququ9696 2014-04-21 09:37:08
class animal
{
private String name;
public animal(String name)
{
this.name = name;
}
public String getName()
{
return name;
}
}
class cat extends animal
{
public cat(String n)
{
super(n);
}

}
class test
{
public static void main(String[] args)
{
cat c = new cat("猫");
System.out.println(c.getName());//这里输出的是子类的name字段吗?有说法子类可以继承父类的私有字段,它是存在的,但不可以读取,是这样的吗?
}
}
问题一:c.getName()输出的name字段是谁的?父类?子类?
问题二:请大神就子类是否继承父类私有字段能详细说说
...全文
830 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
NeverMore_Mr 2014-07-20
  • 打赏
  • 举报
回复
成员变量是私有的,子类不能直接调用,但是子类可以通过public方法也就是getName方法访问;一般成员变量都是私有,但是会提供公共获取方法
我是你同学123 2014-07-06
  • 打赏
  • 举报
回复
父类,子类中没有将getName方法重写,所以自动调用父类的getName方法
  • 打赏
  • 举报
回复
如果能继承过来使用,那还要这个 private 关键字有什么意义呢?
lliiqiang 2014-07-04
  • 打赏
  • 举报
回复
真正访问属性的是方法,方法是哪个类的,就是访问哪个类的属性.
Asura_X_Y_Y 2014-07-04
  • 打赏
  • 举报
回复
个人觉得,应该是父类的name
  • 打赏
  • 举报
回复
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();
    }
}
lliiqiang 2014-05-04
  • 打赏
  • 举报
回复
通过调用父类构造函数给父的name属性赋值,通过调用父类方法访问父类属性.
风铃浩 2014-05-04
  • 打赏
  • 举报
回复
这里的name应该是父类的私有属性,且并没有被子类继承.但是在父类中有一个get方法.它是公共的方法,可以说是父类对外的一个接口,通过这个接口(public的权限)任何一个类都可以获取那么属性.这里的他与是否继承毫无关系.接口是开放的,没有继承关系,也可以通过接口来获取name属性. 接口并不一定是interface这个语法.只要是对外的一个公共方法,都可以视为接口.
yuhouqingchen_2648 2014-05-04
  • 打赏
  • 举报
回复
个人觉得是父类的,但是我调试,cat这个对象里面确实有name字段啊,求解释???谢谢
  • 打赏
  • 举报
回复
对于子类,是一定要在构造方法里首先调用父类构造方法的。这是为"在子类的堆内存区域"给"子类把从父类继承过来的东西"开辟一块内存。在这块内存中是有父类的私有变量的。只是通过子类引用不能直接访问,但是可以通过公有方法来获取该私有变量。
而如果创建父类对象,则该对象是在另一块堆内存区域,该区域与子类中为"从父类继承过来的成员开辟的堆内存"不一样。即没有关系。
super()方法是调用父类构造方法,就是为在"子类对象内存区域那儿再给继承父类的成员开辟一块区域,这两个'区域'是连起来的",可以说同属于子类对象。只是私有成员子类不可以"直接引用",可以通过其它公有方法来获取。
Jin_Rocky 2014-04-30
  • 打赏
  • 举报
回复
弄明白这个问题需要理清几个重点: 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成员变量
  • 打赏
  • 举报
回复
java就是通过子类构造方法中必需在第一行调用父类构造方法,这个简单的机制,来实现继承关系的。因为调用了super()所以在子类的内存区域给父类的成员开辟了一块内存,这块内存子类可以通过子类引用来调用。而若直接创建的父类对象,它若占的内存与上述子类调用的父类内存不同,且无任何关系。记住调用构造方法是开辟内存,new是起到计算内存大小的作用,即告诉计算机要为该对象开辟多大内存。
风吹得好舒服 2014-04-29
  • 打赏
  • 举报
回复
一、子类的name 二、肯定能继承父类的私有成员。
二萌无双 2014-04-29
  • 打赏
  • 举报
回复
好复杂啊。。。学习了。。。
abcwt112 2014-04-29
  • 打赏
  • 举报
回复
引用 7 楼 u014547383 的回复:
[quote=引用 6 楼 abcwt112 的回复:] [quote=引用 5 楼 u014547383 的回复:] 一:输出的是子类的name 二:虽然父类的变量私有了,但是在子类对象的内部还是有父类的私有的变量,这些变量不属于子类的,但是子类可以用,打个比方:你去公司上班,老板分配了一台电脑给你,虽然你没有拥有它,但是你还是可以使用它的。不知道你能理解不
输出的是父类的name吧?子类里String name=“dog”;也是输出猫[/quote] 这个问题不好说,但是给你个代码你看看吧

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();
	}
}
[/quote] 嗯.有道理
xuebichongkafei 2014-04-23
  • 打赏
  • 举报
回复
子类继承了父类,但是子类里面定义了name字段吗?很明显没定义,所以打印是父类的,构造函数调用了父类的构造函数,怎么会打印子类的呢,根本没有,如何打印? 子类继承了私有段,从公共方法继承来看,可以调用公共方法设置父类的私有段,首先得继承,才能去操作,只是间接操作罢了,但是子类本身是不能够直接操作了为了防止破坏其封装行发生直接的安全隐患
abcwt112 2014-04-22
  • 打赏
  • 举报
回复
引用 5 楼 u014547383 的回复:
一:输出的是子类的name 二:虽然父类的变量私有了,但是在子类对象的内部还是有父类的私有的变量,这些变量不属于子类的,但是子类可以用,打个比方:你去公司上班,老板分配了一台电脑给你,虽然你没有拥有它,但是你还是可以使用它的。不知道你能理解不
输出的是父类的name吧?子类里String name=“dog”;也是输出猫
Z-ero 2014-04-22
  • 打赏
  • 举报
回复
引用 6 楼 abcwt112 的回复:
[quote=引用 5 楼 u014547383 的回复:] 一:输出的是子类的name 二:虽然父类的变量私有了,但是在子类对象的内部还是有父类的私有的变量,这些变量不属于子类的,但是子类可以用,打个比方:你去公司上班,老板分配了一台电脑给你,虽然你没有拥有它,但是你还是可以使用它的。不知道你能理解不
输出的是父类的name吧?子类里String name=“dog”;也是输出猫[/quote] 这个问题不好说,但是给你个代码你看看吧

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();
	}
}
Z-ero 2014-04-21
  • 打赏
  • 举报
回复
一:输出的是子类的name 二:虽然父类的变量私有了,但是在子类对象的内部还是有父类的私有的变量,这些变量不属于子类的,但是子类可以用,打个比方:你去公司上班,老板分配了一台电脑给你,虽然你没有拥有它,但是你还是可以使用它的。不知道你能理解不
俺是小王子 2014-04-21
  • 打赏
  • 举报
回复
如果你是初学的话还是不要在意这些,与其说是细节,不如说是牛角尖 如果你这样学下去的话估计一年半载都入不了门 再说你最好到StackOverFlow上问专业问题,那上面砖家才多,也热心,英文过得去就行,不要怕语法错误,人家不在意
加载更多回复(3)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧