java多态和接口_java 多态与接口

向上转型

定义:把某个对象的引用视为对其基类类型的引用的做法被称为向上转型

方法调用绑定

将一个方法调用同一个方法主体关联起来被称作绑定。

前期绑定:程序执行前进行的绑定叫做前期绑定,前期绑定也是java中默认的绑定方式

后期绑定(动态绑定或运行时绑定):在运行时根据对象的类型进行绑定。在java中除了static方法和final方法之外,其他所有的方法都是后期绑定,也就是说,通常情况下,我们不用判断是否应该进行后期绑定,它会自动发生。

构造器和多态

构造器调用顺序:

(1) 调用基类构造器,此步骤会不断反复递归下去,首先是构造这种层次结构的根,然后是下一层导出类,一直到最低层的导出类

(2) 按声明顺序调用成员的初始化方法。

(3) 调用导出类构造器的主体

父类(静态变量、静态初始化块)>子类(静态变量、静态初始化块)>

父类(变量、初始化块)>父类构造器>子类(变量、初始化块)>子类构造器。(变量和初始化块按定义顺序初始化)

构造器内部的多态方法的行为

构造器调用的层次结构带来一个有趣的两难问题,如果在一个构造器的内部调用正在构造的对象的某个动态绑定方法,会发生什么情况呢?众所周知,在一般的方法内部,动态绑定的调用是在运行时才决定的,因为对象无法知道它是属于方法所在的类,还是属于那个类的导出类。如果调用构造器内部的一个动态绑定方法,就要用到那个方法的被覆盖后的定义。这个调用的效果相当难预料,因为被覆盖的方法在对象被完全构造之前就会被调用,这可能会造成一些难于发现的错误。

1 public classTest {2

3 public static voidmain(String[] args) {4 new RoundGlyph(5);5 }6 }7 classGlyph{8 void draw(){ System.out.println("Glyph.draw()"); }9 Glyph(){10 System.out.println("Glyph before draw()");11 draw();12 System.out.println("Glyph after draw()");13 }14 }15 class RoundGlyph extendsGlyph{16 private int radius = 1;17 RoundGlyph(intr){18 radius =r;19 System.out.println("RoundGlyph.RoundGlyph(), radius = " +radius);20 }21 void draw(){ System.out.println("RoundGlyph.draw(), radius = " +radius); }22 }

代码运行结果:

c0cd125456b3a2c7f87896740e470d5d.png

结果是不是和你预想的结果不太一样,嘿嘿,不用急,我们来分析一下代码是怎么变成这样的。首先在main方法中new了一个RoundGlyph类,然后类加载器发现它继承了Glyph类,这时就会去加载Glyph类,运行Glyph类的构造方法,并在构造方法中调用draw()方法,但是这个方法在导出类中被覆盖了,所以此时会调用子类的draw()方法,注意!关键来了,代码运行到这的时候只是加载了子类,并没有给子类中的radius变量进行初始化,现在radius的值只是java默认分配的一个初始值,当父类运行draw()方法时,它的值只是初始值,所以这个时候会输出0。

因此我们得出一个惊喜的结论:当我们在基类的构造器内调用了某个方法,并且该方法被导出类所覆盖,此时调用的是导出类内的方法而不是基类本身的方法。

对于前面的初始化顺序我们应该更正一下:

(1) 在其他任何事物发生之前,将分配给对象的存储空间初始化成二进制的零

(2) 调用基类构造器

(3) 按照声明的顺序调用成员的初始化方法

(4) 调用导出类的构造器主体

最后: 编写构造器有一条有效的准则:用尽可能简单的方法使对象进入正常状态,如果可以的话,避免调用其他方法。

抽象类和抽象方法

抽象类:通用接口建立起一种基本形式,以此表示所有导出类的共同部分

抽象方法:仅有声明而没有方法体的方法。

包含抽象方法的类叫做抽象类,如果一个类包含一个或者多个抽象方法,那么该类必须被限定为抽象的。

接口:interface关键字使抽象的概念更向前迈进了一步,abstract关键字允许人们在类中创建一个或多个没有任何定义的方法,但是没有提供任何相应的具体实现,这些实现是由此类的继承者创建的。interface关键字产生一个完全抽象的类,它根本没有提供任何具体实现,接口只提供了形式,不提供任何具体实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值