我正在学习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
的值将丢失。
有人可以澄清一下这里的问题是什么吗?
答案 0 :(得分:0)
superob
和subob
是不同的实例。设置i
的{{1}}和j
成员不会更改superob
的{{1}}和i
的值(保留为0, int)的默认值。
为什么子类不能查看这些值(我假设0表示这意味着)。
子类可以查看这些值(因为您没有将j
和subob
定义为私有)。否则,代码将无法编译。
答案 1 :(得分:0)
superob
和subob
是完全不同的实例。如果您想查看您正在描述的行为,则需要在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 |
--------