java——多态分析

来源:互联网 发布:网络信息安全问题 编辑:程序博客网 时间:2024/06/06 07:45

java的向下转型和向上转型

java默认使用的是向上转型,编译器看父类,运行期看子类;编译器只能调用父类方法,可能出现的错误是调用了子类的方法,在编译器会出现错误;在运行期会体现子类重写的方法特性;

当需要使用子类的特有方法时,此时不能够使用多态的向上转型,java的多态提供了一种向下转型,子类对象指向父类引用,也就是我们常常说的强制转换(强转),此时可以直接调用子类的方法,达到目的。

其实这是一种不必要的手段,我能想到 的直接调用子类特有方法的办法是直接new子类方法,然后调用子类特有方法,但是没有体现多态的特性,这是一个不足,暂时还没有想到其他方面的问题,后续再补充。

回到正题,什么是多态?多态发生的条件是什么?多态的特性有哪些?

多态是java的三大特性之一,但并不是java特有的属性,其他优秀的语言也具有并且应该具有这样的特性,这种特性体现了一种语言的灵活性和适应性以及健壮性。

多态是指子类所表现的特性区别于父类所体现的特性,实现了自己特有的方法。正是这种特性体现了现实世界的物种的纷繁复杂,变化多端。

首先,多态发生的条件是在父类和子类之间,其次子类要重写了父类的某个方法,这与“”重载“”相区别,这样多态的条件就产生了;

多态的特性有静态绑定和动态绑定两种区别,静态绑定就是在编译器就将类型转换写好,通俗点说就是只看代码不考虑类与类的关系;动态绑定也即运行期绑定,在运行期才会判断执行的是哪个子类的方法特性。常常需要使用instance of方法来辅助我们在代码编写时判断对象的类型。

多态的使用目的:

一是可以提升编码效率;二是可以使编写的类更符合代码编写的开放和封闭原则;

何为"开放封闭原则"?通俗点说就就是一种编写代码的规范,良好的代码编写约束,要求在逻辑改变,需要对代码进行修改时对代码要求:尽量不改变原有的代码,只是在呢个甜心的代码即可满足需求需要,这叫做对修改封闭;在对代码进行扩展时,要求代码能够很好的方便以后的功能扩展和业务增强的要求,这叫做对扩展开放。

面向接口编程的核心就是多态这种特性,总所周知,在涉及到业务逻辑的代码时,通常为了解耦的要求,需要面向接口编程,问接口中的方法是没有方法体的,都是抽象方法,就是为了能够使实现类能够很好的编写自己的特性,满足了对变化的要求,也节省了代码的编写。这很好的体现了java的多态特性。

简单的介绍这么多。以后再补充,千里之行始于足下,打好基础才能更好的扩展。

package com.beyondTest;

public class DuoTaiTest {
public static void main(String[] args) {
SiYangYuan syy=new Cat();
syy.Feed();


}

}
class SiYangYuan{
public void Feed(){

}

}
class Cat extends SiYangYuan{ //多态一定要实现继承,因为多态的发生条件是必须重写父类方法
public void Feed(){
System.out.println("给猫喂食");
}
}
class Dog extends SiYangYuan{
public void Feed(){
System.out.println("给狗喂食");
}
public void eatShit(){
System.out.println("eat shit!!!");
}
}

以上是多态的代码体现;

package com.beyondTest1;


public class SiYangYuan {

public void Feed(Animal a){
Cat cat=(Cat) new Animal();
a.eatFood();

}
public static void main(String[] args) {
T tt=new T();
Animal xx=new Dog();
// tt.test(xx);
//
Dog dog=new Dog();
dog.eatShit();

Dog dog1=(Dog)xx ;
dog1.eatShit();
}
}

class Animal{
public void eatFood(){}
public void slepp(){}
}
/* 在T类中编写test方法 将Animal绑定在(传入)方法,然后将Animal类转换成Cat类
* 这样的话在主方法中调用test方法,会将任何传入的值
*
* */
class T{
public void test(Animal a){ //静态绑定的例子 编译期就将Animal类绑定在方法test中,
Cat yyCat=(Cat)a;
yyCat.Feed();
}
}

class Cat extends Animal{ //多态一定要实现继承,因为多态的发生条件是必须重写父类方法
public void Feed(){
System.out.println("给猫喂食");
}
}

class Dog extends Animal{
public void Feed(){
System.out.println("给狗喂食");
}
public void eatShit(){
System.out.println("eat shit!!!");
}
}

以上是静态绑定的代码体现

0 0