JAVA继承到底有没有继承父类的私有属性

0o涛涛o0 发布于 2017/09/02 18:13
阅读 599
收藏 2

父类声明私有属性,子类继承,子类继承了父类的私有属性,但是无法访问,请问我这种理解是否正确

加载中
0
0o涛涛o0
0o涛涛o0

均继承了下来,可以通过HSDB工具查看运行中的对象,会发现子类属性和父类全部属性均在其中,只是无法访问

0
tcxu
tcxu

既然父类声明了某些属性是私有的,就是说,只归他本人所有,那子类就无法继承这类属性。子类只能继承父类的非私有的属性。

tcxu
tcxu
回复 @钟元 : 所言极是。
tcxu
tcxu
回复 @钟元 :
钟元
钟元
回复 @笑笑虎Hello : 反射要加上setAccessible(true)才能访问私有属性
笑笑虎Hello
笑笑虎Hello
我试过反射,没反射出来啊,你是不是弄错了啊,我的JDK1.8
0o涛涛o0
0o涛涛o0
那如果这样,单独对这个类进行反射,为何会反射出父类私有属性
0
old_big
old_big
继承了,用反射得到父类的Field 读取值,传递的参数是子类对象,调用read(子类对象)方法,是可以读到这个值的!
old_big
old_big
回复 @笑笑虎Hello : 代码在下边呢,另一个回复中。
笑笑虎Hello
笑笑虎Hello
回复 @old_big : 把你代码贴出来看看吧
old_big
old_big
回复 @笑笑虎Hello : 兄台差矣!实例 Field,静态Field,静态方法 皆不多态, 只有非private实例方法多态
笑笑虎Hello
笑笑虎Hello
你这个应该是多态的原因吧,向上转型了
0
tcxu
tcxu

零度的博客 java反射:获取父类中的所有属性和方法工具类

http://blog.csdn.net/zmx729618/article/details/51320688

演示,子类 如何利用  import java.lang.reflect.*;得以读取 从新设置 父类的私有属性的值。

0
f
freezingsky

肯定是继承了。只不过,通过访问修饰符限制了访问级别罢了。

0
tcxu
tcxu

引用来自“tcxu”的评论

零度的博客 java反射:获取父类中的所有属性和方法工具类

http://blog.csdn.net/zmx729618/article/details/51320688

演示,子类 如何利用  import java.lang.reflect.*;得以读取 从新设置 父类的私有属性的值。

用 反射的途径,子类才得以读取 或 从新设置 父类的私有属性的值, 这是因为上了手段。对这个手段,似乎还要核实以下两点:

  1. 鉴于 笑笑虎 用 jdk 1.8 试过反射,没反射出来, 我想, " 零度的博客 java反射:获取父类中的所有属性和方法工具类 " 也必须用 jdk 1.8 试一试,看看是否仍然反射得出来。jdk 1.8 增添了一些新特点
  2. 把子类的定义,放到另一个文件夹里,看看是否能反射得出来。 
0
开源中国首席罗纳尔多
开源中国首席罗纳尔多

继承了,但是调用还是调用父类的

0
old_big
old_big

完整的例子:

public class Son extends Father
{
    public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException
    {
        Field fatherField = Father.class.getDeclaredField("name");
        fatherField.setAccessible(true);
        Son son = new Son();
        Object value = fatherField.get(son);
        System.out.println(value);// 输出father
    }
}

class Father
{
    private String name = "father";
}

0o涛涛o0
0o涛涛o0
隐约记得,反编译的话,private属性是显示不出来的。
笑笑虎Hello
笑笑虎Hello
回复 @old_big : 我反编译了一下子类,什么东西都没有,或许继承可以理解成子类获取到了父类的属性和方法的使用权,私有方法时没有访问权的,所以不能使用,当再反射中设置setAccessible(true)时,就不在检查访问权限,而子类就相应获得了使用权
old_big
old_big
我解释一下原因啊。这里有切仅有一个对象,就是son,根本没有father对象,也没有类型转换(认为对象在堆里可以类型转换的思想是错误的)。仅有一个son对象,如果name属性没有继承来,我怎么读取到的?实际上是继承来了,只是不可见而已。
0
old_big
old_big
能继承,但不可见,这种继承其实是链接,使用javap 查看字节码你也见不到Object 里的属性,甚至父类里public 属性也看不到,你能说public 属性不能继承?所以使用javap 查看不能研究这个问题。
返回顶部
顶部