求继承初始化问题结果?WHY?

问题描述

class Father{ private String name="FATHER"; public Father(){ whoAmI(); tellName(name); } public void whoAmI(){ System.out.println("Father says, I am " + name); } public void tellName(String name){ System.out.println("Father's name is " + name); }}class Son extends Father{ private String name="SON"; public Son(){ whoAmI(); tellName(name); } public void whoAmI(){ System.out.println("Son says, I am " + name); } public void tellName(String name){ System.out.println("Son's name is " + name); }}public class Demo29 {public static void main (String [] args){Father f = new Son();}}求运行结果??为什么会这样?

解决方案

Son says, I am nullSon's name is FATHERSon says, I am SONSon's name is SON1.执行子类构造方法之前都得先执行父类构造方法,因此当new Son()的时候,先执行Father(),再执行Son();2.当执行Father()时,它有两条语句,是调用的两个方法,子类重写了父类的这两个方法。由于主函数里Father f = new Son();是典型的父类引用指向子类对象,复合多态性质,所以执行的是重写以后的方法,即子类的方法。3.这一条最复杂,由于JAVA是动态运行的,只要当执行只才分配值,此时只是Father被new入内存,Son还没有,所以此时的状态是Father.name=FATHER,Son.name=null.其它的都简单了
解决方案二:
先执行父类的构造函数,父类构造函数中调用的两个方法被子类覆盖了,所以是调用子类中的那两个方法,输出“Son says, I am nullSon's name is FATHER ”,然后执行自己的构造方法,输出“Son says, I am SONSon's name is SON ”。
解决方案三:
类实例化的时候 是先 实例化 他的 父类不然就成了 无根之源!!! 不符合自然界的 道理啊!就这么理解就OK了! 其他专业 的术语没必要记的那么清楚!
解决方案四:
Son says, I am nullSon's name is FATHERSon says, I am SONSon's name is SON实例化一个类首先实例化它继承的类,然后初始化它的变量,然后执行构造函数内容.
解决方案五:
父亲Son says, I am nullSon's name is FATHER儿子Son says, I am SONSon's name is SON Father f = new Son(); 在创建Son的时候首先进入Father的构造函数里面.但在执行父类的方法的时候去执行Son的方法了.接着执行Son构造函数中的 whoAmI(); tellName(name);此时name有值是SON.你可以加断点,调试看看.就知道是怎么运行的.

时间: 2024-07-28 23:54:34

求继承初始化问题结果?WHY?的相关文章

java的继承初始化

我们有必要对整个初始化过程有所认识,其中包括继承,对这个过程中发生的事情有一个整体性的概念.请观察下述代码:   //: Beetle.java // The full process of initialization. class Insect { int i = 9; int j; Insect() { prt("i = " + i + ", j = " + j); j = 39; } static int x1 = prt("static Inse

抽象类继承初始化问题

问题描述 package demo1;public abstract class Super {Super(){print();}public abstract void print();}package demo1;public class Sub extends Super{private int i = 10;public void print(){System.out.println(i);}public static void main(String args[]){Sub sub =

Python中类的继承

在软件设计里,代码的复用和代码稳定性,一直是软件开发的重要目标之一,因为只有这样才能积累各种基础组件,以及维护以前做过的工作.从复用的特性来说,就是利用以前做过的工作,比如就像硬件里的IC一样,不需要知道它是怎么样实现的,只要使用它就行了.因而软件也需要有这种IC,在代码层次里的IC,以前看来只是用函数的方式复用,或者只是数据结构的复用.当迈进面向对象编程时代时,自然而然地想到就使用类来复用了,这样数据结构和函数都同时能复用上,比函数的复用更省心了一步,就是数据结构和算法都不需要关心了,只关心类

Python类继承的实现

代码: #! /usr/bin/python # Filename: inherit.py # Author: yanggang class SchoolMember: def __init__(self,name,age): self.name = name self.age = age print 'init SchoolMember: ', self.name def tell(self): print 'name:%s; age:%s' % (self.name, self.age) c

csh,tcsh,bash,sh等shell的区别_linux shell

出自bash的faq,仔细看看.顺便翻译学习一下. 复制代码 代码如下: Section C: Differences from other Unix shellsC:跟其他UNIX shells脚本的区别C1) How does bash differ from sh, the Bourne shell?C1) bash和 sh.Bourne shell的区别This is a non-comprehensive list of features that differentiate bash

spring新手--一个简单的问题(sprinf bean的销毁)

问题描述 小弟初学spring,可是在销毁bean的时候,代码如下:applicationContext.xml<beans <br="">xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.spring

c# package-Package继承层次(求代码C#)

问题描述 Package继承层次(求代码C#) 一些快递商,如FedEx.DHL和UPS,都提供多样化的服务,同时也收取不同的费用.创建一个表示各种不同包裹的继承层次.以包裹类Package作为基类,两日包裹类TwoDayPackage和连夜包裹类OvernightPackage作为派生类.基类Package应该包括含代表寄件人和收件人姓名.地址.所在城市.所在州和邮政编码等的数据成员.此外,还应包含存储包裹重量(以盎司计)和每盎司费用的数据成员.类的构造函数应初始化这些数据成员,并确保重量和每

关于继承的问题,求帮忙解答下,谢谢

问题描述 关于继承的问题,求帮忙解答下,谢谢 public class Demo { public static void main(String[] args){ new B(); } } class A { void aFunction(){ System.out.println("AFunction"); } A(){ System.out.println("A"); aFunction(); System.out.println("after A&

java继承问题求解答,急急急

问题描述 java继承问题求解答,急急急 为什么下面的代码,当子类与父类有相同成员变量时,创建子类对象子类引用出现空指针异常,求大神解答 class Cell{ int row; int col; Cell(int row,int col){ this.row=row; this.col=col; } String getCellInfo(){ return row+","+col; } } class Tetromino{ Cell[]cells; Tetromino(){ cell