Java三大特性之多型
目录- Java三大特性之多型
- 多型概述
- 背景知识
- 强制型别转换(cast)
- 向上转型(upcasting)and 向下转型(downcasting)
- 知识点详述(实体)
- 多型-使用场景
- 访问方式
- 多型的优点
- 小结
多型概述
? 那么什么是多型呢?所谓多型就是指程序中定义的参考变量所指向的具体型别和通过该参考变量发出的方法呼叫在编程时并不确定,而是在程序运行期间才确定,即一个参考变量倒底会指向哪个类的实体物件,该参考变量发出的方法呼叫到底是哪个类中实作的方法,必须在由程序运行期间才能决定,
? 因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让参考变量系结到各种不同的类实作上,从而导致该参考呼叫的具体方法随之改变,即不修改程序代码就可以改变程序运行时所系结的具体代码,让程序可以选择多个运行状态,这就是多型性,
? 简单来说就是根据不同情况呼叫不同的方法,
背景知识
在了解多型之前,让我们先了解一下型别转换,因为多型本身是一种向上转型,
强制型别转换(cast)
double Steve_speed = 233.33;
int now_Steve_speed = (int) Steve_speed;
向上转型(upcasting)and 向下转型(downcasting)
public class Minecraft {
public void sleep() {
System.out.println("Set time night.");
}
public static void main(String[] args) {
Steve m = new Steve();
m.sleep();
Minecraft h = new Steve();// (1)向上转型
h.sleep(); // (2)动态系结
// h.speak(); // (3)此方法不能编译,报错说Minecraft类没有此方法
// // [1]向下转型
// Steve m2 = new Steve();
// Minecraft h2 = m2;
// m2 = (Steve) h2;
// m2.speak();
//
// // [2]向下转型:失败
// Minecraft h3 = new Minecraft();
// Steve m3 = (Steve)h3;
// m3.speak(); //此时会出现运行时错误,所以可以用instanceOF判断
//
// // [3]向下转型:型别防护
// Minecraft h4 = new Minecraft();
// if (h4 instanceof Steve){ // 因为h4不是Steve的实体,所以不执行if内部代码
// Steve m4 = (Steve)h4;
// m4.speak();
// }
}
}
class Steve extends Minecraft {
@Override
public void sleep() {
System.out.println("Steve sleep.");
}
public void speak() {
System.out.println("I am Steve.");
}
}
class Alex extends Minecraft {
@Override
public void sleep() {
System.out.println("Alex sleep.");
}
public void speak() {
System.out.println("I am Alex.");
}
}
- 这里要注意:
- 向上转型不要强制转型
- 父类参考指向的或者呼叫的方法是子类的方法,这个叫动态系结
- 向上转型后父类参考不能呼叫子类自己的方法
知识点详述(实体)
? 在搜索资料的程序中,发现有人说 :多载也是一种多型,不过是一种特殊的多型,是编译时决定的静态多型,但网上又有人说多载是多型的静态系结,重写是多型的动态系结,
? 其实java里方法被封装后也可以是物件,多型的必要条件虽然可以理解是继承和重写,但多型分为行为(方法)多型和物件多型,行为多型是重写和多载,物件多型是向上下转型, 简单的说,重写是父类与子类之间多型性的体现,而多载是一个类的行为的多型性的体现,
而我们平常讲的Java的三大特性之多型多指多型的动态系结,有三个必要条件:
- 继承
- 重写
- 父类参考指向子类物件(向上转型)
public class Minecraft {
public static void main(String[] args) {
Mineral p = new Iron();
p.mine();
// 呼叫特有的方法
Iron s = (Iron) p;
s.broked();
// ((Iron) p).broked();
}
}
class Mineral {
public void mine() {
System.out.println("矿物");
}
}
class Iron extends Mineral {
@Override
public void mine() {
System.out.println("铁矿");
}
public void broked() {
System.out.println("石镐可以破坏它");
}
}
class Diamond extends Mineral {
@Override
public void mine() {
System.out.println("鉆石");
}
public void what() {
System.out.println("掉落鉆石");
}
}
-
输出:
-
铁矿 石镐可以破坏它
多型-使用场景
访问方式
- 回圈呼叫基类物件,访问不同派生类方法
- 自定义函式,实参是派生类,行参是基类
多型的优点
- 消除型别之间的耦合关系
- 可替换性
- 可扩充性
- 界面性
- 灵活性
- 简化性
小结
? 多型虽然有点难以理解,但其特性动态系结在实际项目中非常有用,能减少很多繁杂的代码,减轻作业量的同时,其灵活性也大大提高了代码的扩展性,
0 评论