Java的父类和子类中是否可以具有相同的数据成员?

问题是“在Java的父/基和子/派生类中我们可以有相同的数据成员”吗?

  • 是的,在Parent和Child类中可以有相同的数据成员

  • 现在,我们将看到父级和子级的能力或实力。父类引用可以保留自己的对象,子类对象也可以保留,而子类引用只能保留自己的对象。

  • 父类对象只能访问其数据,这意味着该类无权访问子类数据。

  • 借助示例,我们将看到如果在[Parent和Child]类中包含相同的数据成员,将会发生什么情况。

示例

class Base {
    //  声明和实例化数据成员  
    String str = "We are in Parent class";
}

class Derived extends Base {
    //  声明和实例化数据成员  
    String str = "We are in Child class";
}

class Main {
    public static void main(String[] args) {
        //创建一个基类对象
        Base base = new Base();
        //使用基类对象调用基类数据成员。
        System.out.println("Base class reference can access only base class member :" + " " + base.str);

        //创建一个派生类对象
        Derived derived = new Derived();

        //用派生类对象调用派生类数据成员。
        System.out.println("Derived class reference can access both Base and Derived class member : " + " " + derived.str);

        //这里的基类引用持有一个对象
        //派生类,它是完全有效的
        base = new Derived();

        //基类引用只能访问基类 
        //数据成员是否持有对象是 
        //基类或派生类。
        System.out.println("Base class reference holding an object of Derived class but it can access only Base class data member :" + " " + base.str);

        //我们不需要包含以下代码...。
        /*
        //在这里,派生类引用持有一个对象
        //基类,它完全无效
        derived = new Base();

        //的对象 
        //类,那么我们将得到编译时错误
        System.out.println("We will get compile time error");
        */
    }
}

输出结果

E:\Programs>javac Main.java

E:\Programs>java Main
Base class reference can access only base class member : We are in Parent class
Derived class reference can access both Base and Derived class member:  We are in Child class
Base class reference holding an object of Derived class but it can access only Base class data member: We are in Parent class

在以上程序中,我们有四种情况:

  1. 如果基类引用包含基类的对象,则它是完全有效的,并且我们只能访问基类数据成员。

    Base base = new Base();
  2. 如果“派生类”引用持有“派生类”的对象,则它是完全有效的,我们可以访问“基类”和“派生类”数据成员。

    Derived derived = new Derived();
  3. 如果基类引用包含派生类的对象,则它也是完全有效的,但它只能访问基类数据成员。

    Base base = new Derived();
  4. 如果派生类引用包含基类的对象,则它完全无效,在这种情况下,我们将获得编译时错误。

    Derived derived = new Derived();