读书人

子类会不会继承父类的私有属性跟方法?

发布时间: 2013-10-30 12:56:21 作者: rapoo

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


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.


[解决办法]
按照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


下面说的很清楚。

引用:
今天在 CSDN 论坛中见到有人问在 Java 中子类是否只继承父类的非私有变量和方法(原贴在此)。大部分跟贴都认为这句话是正确的,但是对于这个问题背后的本质理解却是错误的。

首先我们明确一下“继承”一词的概念,在 Java 中,继承一词的意义是有限制的。一个子类只能继承其父类的可访问的成员,并且该子类没有覆盖或者说隐藏父类中的那些可访问成员。所以,一个类的成员就是指在这个类中所声明的属性和……


引用:
Does subclasses inherit private fields?
引用:
http://java.sun.com/docs/books/jls/third_edition/html/names.html#6.6.8

Sun的官方文档你们都不信么????


引用:
引用:

http://java.sun.com/docs/books/jls/third_edition/html/names.html#6.6.8

Sun的官方文档你们都不信么????

支持,不会继承。能用的才能算继承。
上面有人用反射举例子,请注意,你的Class是T1,而不是T2

另外,当年,我清楚的记得TIJ(包括其他文档)里……

读书人网 >J2SE开发

热点推荐