展开全部
这个问题问的有些模糊。猜测是不是想问:java中子类对象“为什么可以”作为父类对象来使用?
简单的回答:因为可以这样,所以可以这样。也就是说因为内存结构支持这样,所以才有了这种语法。
对象实际上就是方法区中的代码+堆中的变量空间,按照类装载规则,当装载子类时一并加载父类,这就意味着只要子类多的代码在内存,则父类的代码也会在内存。创建对象时,按照规则,将会在堆空间中开辟一个空间,这个空间就代表对象。包含的元素有哪些呢?一是类所包含的成员变量(非静态),二是类的超类所包含的成员变量,三是一个指向方法区中类代码的指针。
基于这种结构,不难理解通过父类引用子类的实质。不管通过什么引用,指向的还是那个内存区域,因为对象中包含父类的所有成员变量,所以可以按父类来“套”,通过父类指针访问的变量空间也是父类的变量(如果覆盖)。那么通过父类指针访问的方法呢,显然要通过对象中指向方法区的指针找方法,指向的是哪里?是子类。子类不包含方法怎么办,在找父类。
也就是说,如果发生覆盖,通过父类引用的空间是父类的,而方法是子类的。
简单回答了一下,没有仔细检查语句是否通顺。
简单的回答:因为可以这样,所以可以这样。也就是说因为内存结构支持这样,所以才有了这种语法。
对象实际上就是方法区中的代码+堆中的变量空间,按照类装载规则,当装载子类时一并加载父类,这就意味着只要子类多的代码在内存,则父类的代码也会在内存。创建对象时,按照规则,将会在堆空间中开辟一个空间,这个空间就代表对象。包含的元素有哪些呢?一是类所包含的成员变量(非静态),二是类的超类所包含的成员变量,三是一个指向方法区中类代码的指针。
基于这种结构,不难理解通过父类引用子类的实质。不管通过什么引用,指向的还是那个内存区域,因为对象中包含父类的所有成员变量,所以可以按父类来“套”,通过父类指针访问的变量空间也是父类的变量(如果覆盖)。那么通过父类指针访问的方法呢,显然要通过对象中指向方法区的指针找方法,指向的是哪里?是子类。子类不包含方法怎么办,在找父类。
也就是说,如果发生覆盖,通过父类引用的空间是父类的,而方法是子类的。
简单回答了一下,没有仔细检查语句是否通顺。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询