日期:2014-05-20  浏览次数:20899 次

子类会不会继承父类的私有属性和方法??
子类一般情况下不能调用父类的私有方法,但到底是继承了而没有访问权限,还是因为根本没有继承,反射调用的时候也只是通过父类调用?

Java code

public class Test {
    public static void main(String[] args) {
        T2 t = new T2();
        t.ff();
    }
}

class T1 {
    
    private int f() {
        return 1;
    }
}

class T2 extends T1 {
    
    public void ff() {
        try {
            Class c = Class.forName("T1");
            Method[] m = c.getDeclaredMethods();
            m[0].setAccessible(true);
            Object i = m[0].invoke(this, null);  //这里调用私有方法时,参数不是父类对象也可以。
            System.out.println(i);
        } catch (ClassNotFoundException e) {
            
            e.printStackTrace();
        } catch (IllegalArgumentException e) {
            
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            
            e.printStackTrace();
        }
    }
}




------解决方案--------------------
子类 继承 超类的一切,只不过看不到private修饰的内容
------解决方案--------------------
没有继承。
Java code

            Class c = Class.forName("T1");
            Method[] m = c.getDeclaredMethods();
            m[0].setAccessible(true);
            Object i = m[0].invoke(this, null);  //这里调用私有方法时,参数不是父类对象也可以。
            System.out.println(i);

------解决方案--------------------
拜托六楼好看看api文档的用法
getDeclaredMethods返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。

再引用<<thinking in java>>127页的一句话:
“当这么做时,会自动得到基类中所有的域和方法。”
楼主这下满意了吧
------解决方案--------------------
子类当然继承了父类的所有私有属性和方法,只是没有访问权限,只能通过方法间接访问,
就像即使是父类自己,在外部也是访问不了自己的私有属性的
------解决方案--------------------
final加在方法上意思是不可覆盖,而不是不可继承。
private方法由于子类无法直接访问到,肯定不可覆盖,所以相当于是private final,如果你自己在private 方法上加了final没有什么意义。
这个问题到后来又扯到什么是“继承”上面了,那姑且认定每个人对"继承"的语义有不同的理解,有一个事实是正确的:
"extends声明了子类拥有基类中所有的域和方法"
楼主想的答案这句话自然也可以给出。

------解决方案--------------------
引用 Java Language Specification 3的原话:
A private class member or constructor is accessible only within the body of the top level class (§7.6) that encloses the declaration of the member or constructor. It is not inherited by subclasses.

------解决方案--------------------
是继承了,但是没有权限访问
用反射就不一样了,因为执行了setAccessible(true),就可以访问了
------解决方案--------------------
对啊,是继承,把继承来的私有函数公有化就可以用了.
------解决方案--------------------
Does subclasses inherit private fields?
引用OBJECTS of subclasses contain private fields of their superclasses. The subclass itself has NO NOTION of private fields of its superclass.

------解决方案--------------------
按照java认证程序员考试指南上的说法是子类没有继承父类的私有成员。

"When a member is declared private, a subclass can't inherit it."

 - <<Sun Certified Programmer for Java 5 Study Guide : SCJP Exam 310-055>> 英文版 第一章第三十页
------解决方案--------------------
不会继承

补充30楼的:
As the JLS states:http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.2