一、最近在学习Java的过程中,跟同学讨论了一个问题:
Java中子类是否继承了父类的私有属性及方法?
看课本上所描述的,子类继承父类,子类拥有父类所有的属性和方法,于是使用程序去验证,发现父类的私有属性和私有方法,子类是不能访问的,当然一些父类的私有属性可能可以通过相应的方法访问到,需要父类提供public getter或者setter方法让子类进行属性的访问,但是私有的方法似乎不能简单的访问,于是我认为,子类不能继承父类私有的属性及方法,但事实上并没有那么简单。
在甲骨文JAVA官方学习文档中,提到
因此综合结论即子类继承其父级的所有公共成员和受保护成员,无论该子类位于哪个包中。如果该子类与其父级位于同一包中,则它也继承父级的包私有成员。所以继承使子类拥有父类所有的属性和方法其实可以这样理解,子类对象是拥有父类对象中所有的属性和方法,但是父类对象中的私有属性和方法,子类是无法访问到的,只是拥有,但不能使用。就像有些东西你可能拥有,但是你并不能使用。所以子类对象是绝对大于父类对象的,所谓的子类对象只能继承父类非私有的属性及方法的说法是错误的。可以继承,只是无法访问到而已。
1、关于私有成员变量
无论父类中的成员变量是私有的、共有的、还是其它类型的,子类都会拥有父类中的这些成员变量。但是父类中的私有成员变量,无法在子类中直接访问,必须通过从父类中继承得到的protected、public方法(如getter、setter方法)来访问。
2、关于静态成员变量
无论父类中的成员变量是静态的、还是非静态的,子类都会拥有父类中的这些成员变量。
3、关于被子类覆盖的成员变量
无论父类中的成员变量是否被子类覆盖,子类都会拥有父类中的这些成员变量。
代码测试:
package demo;
/**
* @author Administrator
*Description :子类继承父类测试
*Date 12/26 11:23
*/
public class Main {
public static void main(String[] args){
Student mStudent = new Student("子类");
System.out.println("Name is : " + mStudent.getName());
mStudent.setName("父类");
System.out.println("Name is : " + mStudent.getName());
}
}
class Person{
private String name;
public Person(String name){
this.name = name;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
}
class Student extends Person{
public Student(String name){
super(name);
}
}
参考文章:
oracleJava文献资料
Java中子类继承了父类的私有属性及方法吗?
继承:子类可以继承父类的私有成员变量吗??
二、小结
从语言角度上说:JDK官方文档明确说明子类不能继承父类的私有方法;
但从内存角度来说,jvm在实例化子类对象之前,会先在内存中创建一个父类对象,然后在父类对象外部放上子类独有的属性,两者合起来形成一个子类对象。所以子类确实拥有父类所有的属性和方法,但是父类中的私有方法子类无法访问。