子类会不会继承父类的私有属性和方法??
子类一般情况下不能调用父类的私有方法,但到底是继承了而没有访问权限,还是因为根本没有继承,反射调用的时候也只是通过父类调用?
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?
[解决办法]
按照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
Members of a class that are declared private are not inherited by subclasses of that class. Only members of a class that are declared protected or public are inherited by subclasses declared in a package other than the one in which the class is declared
下面说的很清楚。