A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘张朋 中级黑马   /  2013-8-25 00:51  /  1456 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 刘张朋 于 2013-8-25 01:07 编辑

我在练习反射看继承部分的时候,毕老师有句话说子类持有了父类的私有内容,但是不能直接访问;但是老师的列子是用“super.属性”不能直接进行访问。那子类到底有没继承父类的私有内容呢?
但是我在用如下代码验证的时候发现了一点问

评分

参与人数 1黑马币 +3 收起 理由
潘才新 + 3

查看全部评分

6 个回复

倒序浏览
代码呢?
子类持有父类的私有方法属性,但是不能直接访问,也就是不能继承的意思.但是可以使用反射间接访问.
1,首先子类获取父类的Class对象(通过getSuperclass()方法)
2,在通过父类的Class对象的getDeclaredMethods()获取父类全部方法的Method数组,到这里就可以访问了.
回复 使用道具 举报
straw 发表于 2013-8-25 02:34
代码呢?
子类持有父类的私有方法属性,但是不能直接访问,也就是不能继承的意思.但是可以使用反射间接访问.
1 ...

不知道怎么回事,代码好像在修改保存的时候可能没保存上。自己也没注意,保存了就睡觉了

我问一下子类继承父类的属性时直接复制一份过来呢还是说哪个属性是父类的,自己需要的时候去拿过来用,而自己根本不必拥有哪个属性
因为我用下面语句是

  1. <P>package extendstest;</P>
  2. <P>class Fu {
  3.         int x = 2;
  4.         public Fu(int x){
  5.                 this.x = x;
  6.         }
  7. }</P>
  8. <P> </P>
  9. <P>class Zi extends Fu{</P>
  10. <P>        public Zi(int y){//new对象时传的是1
  11.                 super(3);
  12.                 System.out.println(x);//这里输出是3
  13.                 this.x = y;
  14.                 System.out.println(x);//这里输出是1
  15.                 System.out.println(super.x);//这里输出是1,但是我super(3)传的是3,super.x引用的是父类的x,那是不是可以理解成子类跟父类实际上用的是同一个x,}

  16.         public static void main(String[] args) {</P>
  17. <P>                new Zi(1);
  18.         }</P>
  19. <P>}</P>
复制代码

评分

参与人数 1技术分 +1 收起 理由
夜默 + 1

查看全部评分

回复 使用道具 举报
straw 发表于 2013-8-25 02:34
代码呢?
子类持有父类的私有方法属性,但是不能直接访问,也就是不能继承的意思.但是可以使用反射间接访问.
1 ...

package reflecttest;
import java.lang.reflect.Field;
public class PrivateExtendsTest extends ReflectPoint {
//ReflectPoint有两个私有属性和构造方法ReflectPoint(int x,int ,y){。。。}
         public PrivateExtendsTest(int x, int y) {
                    super(x, y);
          }

          void show(){
                    System.out.println(this.getX());//子类既然没继承父类的x,那么子类如何用get方法访问到自己new对象时传的x,难道new对象时是给父类的x初始化了,get方法也是拿到的父类x,这是不是也验证了子类不必拥有父类的属性,而是需要时直接拿来用
          }
          public static void main(String[] args)  {
                    PrivateExtendsTest test = new PrivateExtendsTest(1,4);
                    System.out.println(test.getX());
                    test.show();
  
                  /*  try {
                              Field field = PrivateExtendsTest.class.getField("x");//这里会报错
                              field.setAccessible(true);
                              System.out.println(field.get(test));
   
                    } catch (SecurityException e) {
                           e.printStackTrace();
                    } catch (Exception e) {
                              e.printStackTrace();
                    }*/
          }
}
回复 使用道具 举报
刘张朋 发表于 2013-8-25 12:05
不知道怎么回事,代码好像在修改保存的时候可能没保存上。自己也没注意,保存了就睡觉了

我问一下子类继 ...

对子类没有备份一份重父类继承下来的成员,继承表示拥有访问的能力,实际上访问的还是父类对象本身的成员.
回复 使用道具 举报
刘张朋 发表于 2013-8-25 12:17
package reflecttest;
import java.lang.reflect.Field;
public class PrivateExtendsTest extends Refle ...

子类是不会重新备份一份父类继承下来的成员的,原因是这样太消耗内存.其次是这样违反了面向对象的原则性.加入子类在继承过程中自己备份的父类的成员,那么this.x和super.x完全不能相互约束的两个变量,那么继承就没有意义了,因为这个会造成子类对象要去访问父类的成员时实际上却是访问子类本身的那份成员.
至于你上面代码:    Field field = PrivateExtendsTest.class.getField("x");//这里会报错
是因为x是父类的成员变量,所以你在子类的字节码中是没有找到x的Field对象的,所以最终会报错!

评分

参与人数 1技术分 +1 收起 理由
夜默 + 1

查看全部评分

回复 使用道具 举报
straw 发表于 2013-8-25 13:19
子类是不会重新备份一份父类继承下来的成员的,原因是这样太消耗内存.其次是这样违反了面向对象的原则性. ...

恩,谢谢啦
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马