子类会不会继承父类的私有属性和方法??
子类一般情况下不能调用父类的私有方法,但到底是继承了而没有访问权限,还是因为根本没有继承,反射调用的时候也只是通过父类调用?
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修饰的内容
------解决方案-------------------- 没有继承。
Class c = Class.forName("T1");
Method[] m = c.getDeclaredMethods();
m[0].setAccessible(true);
Object i = m[0].invoke(this, null); //这里调用私有方法时,参数不是父类对象也可以。
System.out.println(i);
这里之所以能够输出,是因为把this当成T1类来处理了,由于T2能转为T1所以没有报错。
可以这样验证:
Class t2 = Class.forName("T2");
Method[] methods = t2.getDeclaredMethods();
System.out.println("T2's mthods: ");
for(Method e : methods)
System.out.println(e.getName());
System.out.println("-------");
Class t1 = Class.forName("T1");
Method[] m = t1.getDeclaredMethods();
System.out.println("T1's mthods: ");
for(Method e : m)
System.out.println(e.getName());
输出结果为:
T2's mthods:
ff
-------
T1's mthods:
f
从结果可以看出私有方法也是能显示的,但是T2中就没有f方法,由此可见私有方法是不能继承的。
------解决方案-------------------- 拜托六楼好看看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.
Java Language Specification 3
------解决方案-------------------- 是继承了,但是没有权限访问
用反射就不一样了,因为执行了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.