父类私有字段问题

问题描述

classanimal{privateStringname;publicanimal(Stringname){this.name=name;}publicStringgetName(){returnname;}}classcatextendsanimal{publiccat(Stringn){super(n);}}classtest{publicstaticvoidmain(String[]args){catc=newcat("猫");System.out.println(c.getName());//这里输出的是子类的name字段吗?有说法子类可以继承父类的私有字段,它是存在的,但不可以读取,是这样的吗?}}问题一:c.getName()输出的name字段是谁的?父类?子类?问题二:请大神就子类是否继承父类私有字段能详细说说

解决方案

解决方案二:
我不是大神,在看这些问题的同时我也在学习因此说一下我的答案-----------------------------------------------------------------------------首先私有字段子类是不能继承过来的,你可以通过查看class文件去看内部(工具:http://www.oschina.net/code/snippet_12_2154)看到的字段数目应该是0,也就是说没有继承过来但是公用方法继承过来了这里在new对象的时候,调用了super(n),那就实例化的是父类的name字段,但是这个name字段对于子类是不可见的,但是子类可以通过公用的get和set获得,这里是不是发生了向上转型?我测试了一下System.out.println(catinstanceofanimal);

输出是true也就是子类是父类的一个实例name字段属于谁的,我觉得应该是子类,至于私有属性仅仅是权限控制而已,对于子类来说,name字段是隐藏的,程序员是不能够直接操作的,仅此而已坐等专业解释
解决方案三:
貌似现在对子类是否继承父类的属性有两种说法,一种是继承,一种是不继承。(私有肯定不继承)坐等大神解答
解决方案四:
结果很明显,输出“猫”。楼主不要纠结这些语法细节。不要纠结到底是内存中哪个对象的属性Java设计了干吗的,不就是忽略C++那些细节吗。
解决方案五:
如果你是初学的话还是不要在意这些,与其说是细节,不如说是牛角尖如果你这样学下去的话估计一年半载都入不了门再说你最好到StackOverFlow上问专业问题,那上面砖家才多,也热心,英文过得去就行,不要怕语法错误,人家不在意
解决方案六:
一:输出的是子类的name二:虽然父类的变量私有了,但是在子类对象的内部还是有父类的私有的变量,这些变量不属于子类的,但是子类可以用,打个比方:你去公司上班,老板分配了一台电脑给你,虽然你没有拥有它,但是你还是可以使用它的。不知道你能理解不
解决方案七:
引用5楼u014547383的回复:

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

输出的是父类的name吧?子类里Stringname=“dog”;也是输出猫
解决方案八:
引用6楼abcwt112的回复:

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

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

这个问题不好说,但是给你个代码你看看吧publicclasstestExtends{publicstaticvoidmain(String[]args){Catc=newCat("猫");System.out.println(c.getName());Animala=newAnimal();//没有给动物的name另外赋值System.out.println(a.getName());//但是拿到的值是动物而不是猫,说明创建Cat对象时并没有改变name的属性,只是Cat对象自己的name}}classAnimal{privateStringname="动物";publicAnimal(){}publicAnimal(Stringname){this.name=name;}publicStringgetName(){returnname;}}classCatextendsAnimal{Stringname="猫";publicCat(Stringn){super(n);}publicStringgetAnimalName(){returnsuper.getName();}}

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

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

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

这个问题不好说,但是给你个代码你看看吧publicclasstestExtends{publicstaticvoidmain(String[]args){Catc=newCat("猫");System.out.println(c.getName());Animala=newAnimal();//没有给动物的name另外赋值System.out.println(a.getName());//但是拿到的值是动物而不是猫,说明创建Cat对象时并没有改变name的属性,只是Cat对象自己的name}}classAnimal{privateStringname="动物";publicAnimal(){}publicAnimal(Stringname){this.name=name;}publicStringgetName(){returnname;}}classCatextendsAnimal{Stringname="猫";publicCat(Stringn){super(n);}publicStringgetAnimalName(){returnsuper.getName();}}

嗯.有道理
解决方案十一:
好复杂啊。。。学习了。。。
解决方案十二:
一、子类的name二、肯定能继承父类的私有成员。
解决方案十三:
对于子类,是一定要在构造方法里首先调用父类构造方法的。这是为"在子类的堆内存区域"给"子类把从父类继承过来的东西"开辟一块内存。在这块内存中是有父类的私有变量的。只是通过子类引用不能直接访问,但是可以通过公有方法来获取该私有变量。而如果创建父类对象,则该对象是在另一块堆内存区域,该区域与子类中为"从父类继承过来的成员开辟的堆内存"不一样。即没有关系。super()方法是调用父类构造方法,就是为在"子类对象内存区域那儿再给继承父类的成员开辟一块区域,这两个'区域'是连起来的",可以说同属于子类对象。只是私有成员子类不可以"直接引用",可以通过其它公有方法来获取。
解决方案十四:
java就是通过子类构造方法中必需在第一行调用父类构造方法,这个简单的机制,来实现继承关系的。因为调用了super()所以在子类的内存区域给父类的成员开辟了一块内存,这块内存子类可以通过子类引用来调用。而若直接创建的父类对象,它若占的内存与上述子类调用的父类内存不同,且无任何关系。记住调用构造方法是开辟内存,new是起到计算内存大小的作用,即告诉计算机要为该对象开辟多大内存。
解决方案十五:
弄明白这个问题需要理清几个重点:1、关于继承《Java编程思想-第四版》这样说了:当继承现有类型时,也就创建了新的类型。这个新的类型不仅包括现有类型的所有成员(尽管private成员被隐藏起来,并且并且不可访问)。这句话在第1章1.6继承小节里。对于上面的例子也就是说Cat将Animal中所有的成员都继承过来了,但是注意了因为private成员变量是通过继承的方式复制过来的,这种方式比较特殊,所以是无法使用cat.name这种方式访问的,但是Cat类信息中确实包含了这个属性。2、创建了几个对象?Catcat=newCat("Tom")这句话我们都知道会创建对象,而且Cat的构造方法中通过super调用了父类Anamial的构造方法,会创建Cat的对象,这个我们都知道,但是会不会创建Animal的对象呢?答案是不会的,这里我们只是调用了构造方法,并没有new,所以不会创建Aniaml的对象。3、name的值是怎么设置的?通过上面的分析我们知道Cat类中会有name的信息,但是因为name在父类中是private的,我们继承先来之后并不能再Cat类中显示地进行设值,那上面为什么会设置得到呢,这里是通过父类间接设置的,调用了Cat的有参构造器,这个构造器会将参数传递给Animal的构造器,Animal的构造器帮我们完成了Cat对象的name设置操作。所以对于你的问题回答就是:-输出的name值是子类的也就是Cat对象的-可以继承private成员变量
解决方案:
这里的name应该是父类的私有属性,且并没有被子类继承.但是在父类中有一个get方法.它是公共的方法,可以说是父类对外的一个接口,通过这个接口(public的权限)任何一个类都可以获取那么属性.这里的他与是否继承毫无关系.接口是开放的,没有继承关系,也可以通过接口来获取name属性.接口并不一定是interface这个语法.只要是对外的一个公共方法,都可以视为接口.
解决方案:
通过调用父类构造函数给父的name属性赋值,通过调用父类方法访问父类属性.
解决方案:
个人觉得是父类的,但是我调试,cat这个对象里面确实有name字段啊,求解释???谢谢
解决方案:
publicclasstestExtends{publicstaticvoidmain(String[]args){Catc=newCat();System.out.println(c.getName());Animala=newAnimal();//没有给动物的name另外赋值System.out.println(a.getName());//但是拿到的值是动物而不是猫,说明创建Cat对象时并没有改变name的属性,只是Cat对象自己的name}}classAnimal{privateStringname="动物";publicAnimal(){}publicStringgetName(){returnname;//相当于this.name,所以输出的肯定是父类的.}}classCatextendsAnimal{Stringname="猫";publicStringgetAnimalName(){returnsuper.getName();}}

解决方案:
个人觉得,应该是父类的name
解决方案:
真正访问属性的是方法,方法是哪个类的,就是访问哪个类的属性.
解决方案:
如果能继承过来使用,那还要这个private关键字有什么意义呢?
解决方案:
父类,子类中没有将getName方法重写,所以自动调用父类的getName方法
解决方案:
成员变量是私有的,子类不能直接调用,但是子类可以通过public方法也就是getName方法访问;一般成员变量都是私有,但是会提供公共获取方法

时间: 2024-07-30 13:03:04

父类私有字段问题的相关文章

Java 反射之私有字段和方法详细介绍_java

尽管我们通常认为通过JAVA的反射机制来访问其它类的私有字段和私有方法是可行的,其实并没有那么困难. 注释:只有在单独的JAVA程序中运行该代码才有效,就像你做一些单元测试或者常规的程序.如果你尝试在JAVA APPLET内使用该方法,你需要稍稍修改SecurityManager.但是,因为你不是经常需要与它打交道,这里也就不再赘述了. 这里是本次内容的列表: 1.访问私有字段. 2.访问私有方法. 访问私有字段: 为了访问私有字段,你需要调用Class.getDeclaredField(Str

java-JAVA子类不能继承父类私有方法是么

问题描述 JAVA子类不能继承父类私有方法是么 父类都不能用他本身的私有方法,子类岂不是更不能用了,这一点是怎么证明的?举个例子 解决方案 父类本身的私有方法是可以被自己的其他方法调用的,但是这些私有方法子类是不能调用的,但是可能被间接调用. 例如下面的例子,父类的私有方法被一个公有方法调用了,那么子类继承这个公有方法后也就间接调用了父类的私有方法了.但是子类可直接访问的方法里却没有这个私有方法的. public class Parent { public void say(){ call();

可以通过构造函数给私有字段赋初值,但不能通过对象构造器给私有字段赋初值?

问题描述 问题①可以通过构造函数给私有字段赋初值,但不能通过对象构造器给私有字段赋初值?问题②在类被实例化时,可以通过对象构造器给本类的静态字段赋值吗?问题③一个非静态类里有个静态字段,在main()函数里,是不是即可以先实例化这个类,然后通过"类名.静态字段名"的方式给静态字段赋值,也可以在实例化这个类之前,用"类名.静态字段名"的方式给静态字段赋值??谢谢啊 解决方案 解决方案二:1.是的,私有的不会出现在构造器里2.可以,静态字段要公有的3.静太的不用通过实列

为什么子类能够间接调用父类的私有方法

问题描述 子类的对象是不能直接调用父类的私有方法,但是却可以间接调用,求大家解答!代码如下classFather{publicFather(){System.out.println("Father");}privatevoidhello(){System.out.println("hello");}publicvoidsayHello(){System.out.println(thisinstanceofSon);this.hello();}}publicclass

公有成员和私有成员

Flash MX 2004 的类成员里面有公有成员和私有成员的区别,那么我们应该怎样应用和区分它们呢,这里有几个简单的例子来帮助您了解. 如果不特别指定,类里所有的成员都是公有(Public)的,不用特地声明.但是私有(Private)成员则是要一定声明的. 如果成员是公有的,那么就可以被主类以及 Flash 调用.如果成员是私有的,那么则只可以通过主类来访问.我们下面看一个例子,它有一个私有方法 ShowSomething(). class Show {private function Sho

属性(Properties)和字段在C#中的关系

主题:这篇文章我来说下属性(Properties)和字段在C#中的关系.首先申明一下,这里讲的属性就是通 常说的包含get,或者是set访问器的属性,不是属性 (Attribute).我们写程序的时候大多都会用到实体 类,而生成实体类,我们都会申明一些常规属性或者是自动实现的属性.至于到底选用哪一种属性,或者 说是否可以直接用字段代替呢? 常规属性和自动实现属性的区别: 一个完整的常规属性由以下几部分构成: 1:私有字段,用来存储变量(后备存储),这个字段之所以是私有的,是为了让它只能通过属性来

javascript面向对象编程:如何定义属性字段

都知道js变量有作用域的概念,因此可以使用这个特性定义私有字段,私有字段的初始化主要是通过构造函数. 例如如下定义了一个只读字段first function ListCommon2(afirst) { var first=afirst; this.GetFirst=function ()//定义了一个访问读取字段的特权方法 { return first; } } ListCommon2.prototype.do2=function() { var field= this.GetFirst();/

通用的访问非公有字段(Field)和属性组件

在Teddy的 DynamicMethodProxyFactory组件中,提供了一种调用非公有方法的机制.本质上,通过这 个组件是可以实现任意的公有和非公有属性的读写操作(属性本质上可以通过它的get/set方法以方法的 形式访问).而且性能会比反射提高3 - 4数量级.但是如果我们希望访问某些非公有字段时,那我们还 是无法使用DynamicMethodProxyFactory组件,还是需要使用反射. 这时,NonPublicPropertyProxy就派上用场了.这个组件是我根据NBear.M

关于字段属性问题

问题描述 最近刚学c#,对于字段的属性有点不大懂:当一个私有字段属性为可读可写时,和将其设置为公有属性有什么区别呢,新手,求大神指教 解决方案 解决方案二:看下private和public的区别,就明白你的问题了.解决方案三:引用1楼lovelj2012的回复: 看下private和public的区别,就明白你的问题了. 我知道啊,private是私有,只能在类内访问,但是属性设置为get和set后,不是和public一样了吗解决方案四:privatestringfiled;privatestr