java多态性特点总结
来源:互联网 发布:2017淘宝如何投诉盗图 编辑:程序博客网 时间:2024/06/05 10:08
1.多态通过分离做什么和怎么做,从另一个角度将接口和实现分离开来。
2.多态也叫作动态绑定、后期绑定或运行时绑定。
3.将一个方法调用同一个方法主体关联起来被称为绑定。什么叫前期(后期)绑定?C用什么绑定?
4.java中除了static方法和final方法之外,其他方法都是后期绑定,我们通常无需判定什么时候进行
后期绑定,因为它会自动发生。
enum Note{
MIDDLE_C,C_SHARP,B_FLAT;
}
class Instrument{
void play(Note n){ System.out.println("Instrument.play() "+n);}
public String toString(Object object){return "Instrument"; }
void adjust(){ System.out.println("Instrument adjust");}
}
class Guitar extends Instrument{
void play(Note n){ System.out.println("Guitar.play() "+n);}
public String toString(Object object){return "InstrumentGuitar"; }
void adjust(){ System.out.println("Guitar Adjusting ");}
}
public class MusicTest{
public static void tune(Instrument i){
//i.play(Note.C_SHARP);
i.adjust();
}
public static void main(String[] args){
Guitar g = new Guitar();
tune(g);
}
}//程序输出:Guitar Adgusting
5.将某个方法定义为final,除了防止被覆盖,更重要的是“关闭”动态绑定,让编译器不需要进行动态
绑定。这样编译器可以为final方法调用生成更有效率的代码。
6.如果某个方法是静态的,它将不具有多态性。
7.只有普通的方法(强调方法而不是成员变量)调用可以是多态的,如果直接访问某个域(即成员变量) ,这个访问就将在编译器进行解析!
/*Sub类继承了Super后,拥有了两份field(编译时分配了不同的存储空间)。
*/
class Super{
public int field = 0;
public int getField(){
return field;
}
}
class Sub extends Super {
public int field = 1;
public int getField(){
return field;
}
public int getSuperField(){
return super.field;
}
}
public class FieldAccess {
public static void main(String[] args){
Super s1 = new Sub();//upcast
System.outprintln("s1.field= "+s1.field+",s1.getField()= "+s1.getField());
Sub s2 = new Sub();
System.out.println("s2.field= "+s2.field+",s2.getField()= "+s2.getField());
System.out.println("s2.getSuperField()= "+s2.getSuperField());
}
}
8.构造器不具有多态性(它们实际上是static方法,只不过该static声明是隐式的)。
9.编写构造器的一条有效准则:“用尽可能简单的方法是对象进入正常状态;如果可以的话,避免使用 其他方法”。在构造器内唯一能够安全调用的那些方法是基类中的final方法(也适用于private方法,它们自动属于final方法)。这些方法不能被覆盖,也就不会出现运行时(多态)错误。
/*
构造器内部的方法的多态行为
*/
class Glyph{
void draw(){
System.out.println("Glyph.draw()");
}
Glyph(){
System.out.println("Glyph() before draw()");
draw();//这个方法体现了构造器内部方法的多态性。在创建RountGlyph对象时会调用RountGlyph类中的draw()方法。
System.out.println("Glyph() after draw()");
}
}
public class RountGlyph extends Glyph {
private int radius = 1;
RountGlyph(int r){
radius = r;
System.out.println("RoundGlyph.RoundGlyph.radius = "+radius);
}
void draw(){
System.out.println("RountGlyph.draw(),radius = "+radius);
}
public static void main(String[] args){
new RountGlyph(8);
}
}
/*
Output:
Glyph() before draw()
RountGlyph.draw(),radius = 0
Glyph() after draw()
RoundGlyph.RoundGlyph.radius =
*/
- java多态性特点总结
- java 多态性总结
- java多态性总结
- java多态性总结
- Java学习总结第十五天Java多态性
- java集合类特点总结
- Java中的集合特点总结
- JAVA各个版本特点总结
- java 多态性
- java 多态性
- java多态性
- Java多态性
- java 多态性
- Java多态性
- Java多态性
- java多态性
- java多态性
- java多态性
- JS过滤HTML标签
- 双bfs求树的直径
- CUDA卷积操作—使用constant memory实现高斯滤波
- Java表达式的陷阱——正则表达式的陷阱
- linux软件管理和安装(yum命令--修改yum源)
- java多态性特点总结
- lazyLoad与节流
- 【GDOI2017第四轮模拟day1】数列
- 优雅的URL(伪静态)
- 紫书第一章训练1 A
- 欢迎使用CSDN-markdown编辑器
- C#矩阵的简单操作
- 入门spring-data-JPA以及测试类的编写
- hibernate反向工程(外键约束)