概念明确:子类也是继承了父类非私有属性和方法的
1、问题引入
近日在牛客网刷题时,刷到了有关继承的题:
在java中,下列对继承的说法,正确的是( A )
A 子类能继承父类的所有成员
B 子类继承父类的非私有方法和状态
C 子类只能继承父类的public方法和状态
D 子类只能继承父类的方法
当时第一遍学习时记得都是,继承是一子类继承了父类的非私有方法和属性,而这题说继承所有成员。那么到底子类从父类那里继承了什么?
网上和资料上也都是说A说B的都有,但验证过之后发现,确实:子类是继承了父类的非私有方法和属性的。
2、概念验证
个人理解证明此概念的思路:
我们既然可通过子类对象调用父类非私有方法操作父类私有属性或调用父类私有方法,自然就证实了子类继承了父类的私有方法和属性,只是对于子类不可见,不能直接调用,需要通过父类其他非私有方法进行使用。
其他验证方法:
验证方式1
利用反射无视封装的特点验证:通过反射技术使用子类对象执行父类私有方法。若执行成功,则表示子类确实继承了父类私有方法。
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
class Father2{
//父类私有方法
private void work(){
System.out.println("父亲的工作!");
}
}
class Child2 extends Father2{
}
public class ExtendsTest {
public static void main(String[] args) throws Exception {
//得到子类信息对象
Class c = Child2.class;
//得到父类类信息对象
Class superclass = c.getSuperclass();
//通过类信息对象获取父类中的私有方法
Method work = superclass.getDeclaredMethod("work");
//设置该(私有)方法可暴力访问
work.setAccessible(true);
//创建子类对象执行父类中的私有方法
//这里调用成功,证明子类确实继承了父类的私有方法!!!!!!
work.invoke(new Child2());
}
}
验证方式2
利用方法的修饰符的可见性是针对定义该方法的类而言的,如果被子类重写则变成对子类而言的概念前提。
所以,父类中private方法可见性是针对父类自己有效,子类对其没有可见性——>那么在父类中使用多态创建的对象就可以调用父类私有方法。
//父类
public class FFF {
//私有方法,只对父类有可见性,所以将main方法也定义在父类中,再使用多态的对象调用父类私有方法
private void show(){
System.out.println("父类私有方法");
}
//若在非FFF类中,e.show();编译不通过
public static void main(String[] args) {
FFF e = new TTT();
e.show();//这里调用成功,证明子类确实继承了父类的私有方法!!!!!!
}
}
//子类
class TTT extends ExtendsTest2{}
另外,对于构造方法:
子类从其父类继承所有成员(字段,方法和嵌套类)。 构造函数不是成员,所以它们不被子类继承,但是可以从子类调用超类的构造函数。
针对这一问题,百度了一下,众说纷纭!包括一些教材中说的也是不一的,知道看到一篇博客,彻底被讲明白了,想搞懂原理的强烈推荐,逻辑清晰,简单易懂(就是下面参考中的第一连接)
参考:
java继承关系中,父类private修饰的内容真的不能被继承吗?NO!!_ql_7256的博客-CSDN博客_父类的private能不能被继承