运行 TestInherits.java 程序:
基类构造在前截图:
基类构造在后:
在运行子类对象时,基类的构造函数要在子类构造函数的首位。
为什么子类的构造方法在运行之前,必须调用父类的构造方法?能不能反过来?为什么不能反过来?
构造方法的目的是初始化成员,基类都没有初始化,子类继承肯定不会初始化,会报错。
address程序执行结果
神奇的+号
执行结果不是“ff”而是和建立的f对象中的方法连接。 在“+”运算中,当任何一个对象与一个String对象,连接时,会隐式地调用其toString()方法,默认情况下,此方法返回“类名 @ + hashCode”。为了返回有意义的信息,子类可以重写toString()方法。
类型转换
不能运行的代码:
d=m;
d=c;
c=(Cat)m;
原因:
1.子类对象可以被视为是其父类的一个对象
2.父类对象不能被当作是某一个子类的对象。
3.如果一个方法的形式参数定义的是父类对象,那么调用这个方法时,可以使用子类对象作为实际参数。
4.如果父类对象与引用指向的实际是一个子类对象,那么这个父类对象的引用可以用强制类型转换转化成子类对象的引用。
c=(Cat)m中不显示错误,会抛出异常,相当于“子=(子)父”,。如果父类变量引用的是正确的子类型(即父类对象要想造型转换后赋给子类对象,其本身引用的是子类型的内存空间),赋值将执行。如果父类变量引用的是不相关的子类型,将会生成class castException异常。
1.类型转换必须在继承层次类转换,即超类与子类之间.
2.兄弟类之间不存在继承,因此也不存在类型转换.
故狗的不能给猫。
在实践中理解把握复杂的知识-1
个人想法:
第一个结果:100
第二个结果:200
第三个结果:200
第四个结果:201
第五个结果:201
第一第二个结果很明显,直接调用自己的方法就是100,200第三个,把儿子给父亲是合法的,所以是200,第四个想的是201,第五个为把父亲强制转换为儿子执行儿子的方法是201.
实验截图
总结
对象是子类型的,它就调用子类型的方法,是父类型的,它就调用父类型的方法。
如果子类与父类有相同的字段,则子类中的字段会代替或隐藏父类的字段,子类方法中访问的是子类中的字段(而不是父类中的字段)。如果子类方法确实想访问父类中被隐藏的同名字段,可以用super关键字来访问它。 如果子类被当作父类使用,则通过子类访问的字段是父类的!