关于Java中子类是否继承了父类的私有属性及方法

一、最近在学习Java的过程中,跟同学讨论了一个问题:

Java中子类是否继承了父类的私有属性及方法?

看课本上所描述的,子类继承父类,子类拥有父类所有的属性和方法,于是使用程序去验证,发现父类的私有属性和私有方法,子类是不能访问的,当然一些父类的私有属性可能可以通过相应的方法访问到,需要父类提供public getter或者setter方法让子类进行属性的访问,但是私有的方法似乎不能简单的访问,于是我认为,子类不能继承父类私有的属性及方法,但事实上并没有那么简单。

在文档中,提到 因此综合结论即子类继承其父级的所有公共成员和受保护成员,无论该子类位于哪个包中。如果该子类与其父级位于同一包中,则它也继承父级的包私有成员。所以继承使子类拥有父类所有的属性和方法其实可以这样理解,子类对象是拥有父类对象中所有的属性和方法,但是父类对象中的私有属性和方法,子类是无法访问到的,只是拥有,但不能使用。就像有些东西你可能拥有,但是你并不能使用。所以子类对象是绝对大于父类对象的,所谓的子类对象只能继承父类非私有的属性及方法的说法是错误的。可以继承,只是无法访问到而已。

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);

    }

}

二、小结

从语言角度上说:JDK官方文档明确说明子类不能继承父类的私有方法; 但从内存角度来说,jvm在实例化子类对象之前,会先在内存中创建一个父类对象,然后在父类对象外部放上子类独有的属性,两者合起来形成一个子类对象。所以子类确实拥有父类所有的属性和方法,但是父类中的私有方法子类无法访问。

经验分享 程序员 微信小程序 职场和发展