Java 中子类是否只继承父类的非私有变量和方法?

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

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

虽然子类不继承父类中的私有成员,但是在父类中生命的这些私有成员仍然是子类类型对象的一部分。因为在实例化对象的时候,只初始化在当前类中所声明的属性明显是不足够的,还需要初始化其父类中所有声明的属性。在实例化的过程中,JVM 需要为对象的类及其父类中所有定义的属性分配空间,包括父类中声明的私有成员。

所以,我们可以说:子类不能从父类继承私有成员,但是子类的对象是包括子类所不能从父类中继承的私有成员的。

2 Comments

  1. 于彬:

    您好 看到了您的文章有点感悟,我写了一段代码,好像和你说的有一些冲突,能帮我解答下吗 谢谢了
    class Person
    { String name;
    private int age=30;
    public void setAge(int age)
    {this.age = age ;}
    public void setName(String name)
    { this.name = name ; }
    public int getAge ()
    { return this.age;}
    public String getName ()
    { return this.name;}
    public int getInfo()
    { return this.age; }
    }

    class Student extends Person
    { int age =20;
    String name=”你好”;
    public void print()

    { System.out.println(this.name);
    System.out.println(super.name);
    System.out.println(this.age);
    System.out.println(this.getInfo());
    }
    }

    public class Demo03

    { public static void main(String[] args)
    {
    Student s = new Student();
    s.print();
    }
    }
    结果
    你好
    null
    20
    30

  2. Patrick:

    1、因为子类和父类中都有 name 属性,所以子类中的 name 会隐藏掉父类中的同名属性。
    2、getInfo() 会优先从“最近的地方”寻找名为 age 的属性,因为 getInfo() 在 Person 类中定义的,所以 getInfo() 会返回 Person 中的 age 的值。实际上,在 Student 的实例 s 中,存在一个 Person.age 和一个 Student.age。

Leave a comment