子类一般情况下不能调用父类的私有方法,但到底是继承了而没有访问权限,还是因为根本没有继承,反射调用的时候也只是通过父类调用?
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
------解决方案--------------------
是继承了,但是没有权限访问
用反射就不一样了,因为执行了setAccessible(true),就可以访问了
------解决方案--------------------
对啊,是继承,把继承来的私有函数公有化就可以用了.
------解决方案--------------------
Does subclasses inherit private fields?