如何通过子类的方法查看设置为超类成员的值?

时间:2014-08-05 17:35:57

标签: java inheritance

我正在学习Java编程,并试图立即了解继承。请在这里查看我的代码 -

package chapter8.programs;

class A
{
    int i,j;

    void showIJ()
    {
        System.out.println("i and j: "+ i +" "+ j );

    }
}

//create a subclass by extending A
class B extends A
{
    int k;
    void showK()
    {
        System.out.println("k : "+ k);
    }

    void sum()
    {
        System.out.println("i + j + k: "+ (i+j+k));
    }
}

public class SimpleInheritance {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        A superob=new A();
        B subob=new B();

        //superclass can be used by itself- 
        superob.i=10;
        superob.j=20;
        System.out.println("Contents of superOb");
        superob.showIJ();
        System.out.println();

        //subclass has access to all public members of the superclass
        subob.k=9;
        System.out.println("Contents of subOb");
        subob.showIJ();
        subob.showK();
        //subob.sum();
        System.out.println();

        System.out.println("Sum of i, j and k: ");
        subob.sum();


    }

}

我得到的输出是 -

Contents of superOb
i and j: 10 20

Contents of subOb
i and j: 0 0
k : 9

Sum of i, j and k: 
i + j + k: 9

根据我对继承的看法,我的印象是:

  

一个子类,它的所有成员和方法都可以访问所有子类   超类的公共成员。

因此,当我使用object的{​​{1}}来检查sub-class成员设置的值时,为什么super-class不是{能够查看这些值(我假设subclass意味着)。

我想如果我使用子类对象为超类的成员设置值,使用如下代码:

0

可行,但超级对象subob.i=100 and subob.j=200 设置为i and j的值将丢失。

有人可以澄清一下这里的问题是什么吗?

5 个答案:

答案 0 :(得分:0)

superobsubob是不同的实例。设置i的{​​{1}}和j成员不会更改superob的{​​{1}}和i的值(保留为0, int)的默认值。

  

为什么子类不能查看这些值(我假设0表示这意味着)。

子类可以查看这些值(因为您没有将jsubob定义为私有)。否则,代码将无法编译。

答案 1 :(得分:0)

superobsubob是完全不同的实例。如果您想查看您正在描述的行为,则需要在B的单个实例上设置这些值。

答案 2 :(得分:0)

这里有两个不同的实例。第一个是superob的实例,第二个是subob的实例。结果,它们保存的值在不同的内存中。

当您设置superob的值时,它们会存储在superob实例中。当您创建subob的新实例时,它会在superob中包含新的字段副本,但它不会共享相同的数据。它只是有那些领域。

所以:

superob.i != subob.i
superob.j != subob.j

这是所有变量的列表:

superob.i
superob.j
subob.i
subob.j
subob.k
总共有五个,它们有五个不同的值。

答案 3 :(得分:0)

好吧,为了让子类继承这些值,需要在编译之前静态定义它们。当一个类继承一个超类时,它实际上并不保存存储在该超类中的任何动态值。仅从一开始就在超类中定义的静态值。当我说static并不意味着它们确实是Static但是它们是在运行时之前定义的并且没有改变。

答案 4 :(得分:0)

subob将包含已在其超类中定义的所有内容,因此如果您为subob.i和subob.j指定了一些值,那么这些值将位于该类中并且您将会在能够从subob打印出来。

superob包含超类中定义的成员。虽然subob和superob是不同的实例,因此为superob的成员分配值并尝试从subob打印它们是行不通的。

为了使其更加明确,请查看下图。 subob和superob指向不同的内存blob,所以无论你在superob中做什么都不会影响subob,反之亦然:

subob points to memory block B:
--------
int i   |
int j   |
int k   |
--------

superob points to memory block A:
--------
int i  |
int j  |
--------