欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java之面向对象之多态

程序员文章站 2022-07-12 13:09:23
...

多态

多态呢就是一种事物的多种形态或者状态。
多态的前提
1.类与类之间有关联(继承关系)
2.必须要有方法的重写
3.父类的引用指向子类空间

举个栗子:

// 先创建两个类 一个动物类 一个猫类继承动物类
class Animal{
	public void eat() {
		System.out.println("恰");
	}
}
class Cat extends Animal{
	@Override
	public void eat() {
		System.out.println("猫恰鱼");
	}
}
// 然后再main方法中调用,父类的引用指向子类的空间
Animal animal = new Cat();

上面就是一个简单的多态的栗子

当使用多态形式创建对象时,
访问成员变量
编译时:需要看父类当中有没有改变量没有就报错
运行时:最终访问到的成员变量 是父类中的成员变量

访问成员方法
编译时: 需要看父类中有没有该方法 没有就报错
运行时: 最终运行时 入栈执行是子类中重写的方法
下面就是多态在jvm中的大概运行了
java之面向对象之多态

静态绑定和动态绑定的区别
在Java中,当你调用一个方法时,可能会在编译时期(compile time)解析(resolve),也可能实在运行时期(runtime)解析,这全取决于到底是一个静态方法(static method)还是一个虚方法(virtual method)。如果是在编译时期解析,那么就称之为静态绑定(static binding),如果方法的调用是在运行时期解析,那就是动态绑定(dynamic binding)或者延迟绑定(late binding)。Java是一门面向对象的编程语言,优势就在于支持多态(Polymorphism)。多态使得父类型的引用变量可以引用子类型的对象。如果调用子类型对象的一个虚方法(非private,final or static),编译器将无法找到真正需要调用的方法,因为它可能是定义在父类型中的方法,也可能是在子类型中被重写(override)的方法,这种情形,只能在运行时进行解析,因为只有在运行时期,才能明确具体的对象到底是什么。这也是我们俗称的运行时或动态绑定(runtime or dynamic binding)。另一方面,private static和final方法将在编译时解析,因为编译器知道它们不能被重写,所有可能的方法都被定义在了一个类中,这些方法只能通过此类的引用变量进行调用。这叫做静态绑定或编译时绑定(static or compile time binding)。所有的private,static和final方法都通过静态绑定进行解析。这两个概念的关系,与“方法重载”(overloading,静态绑定)和“方法重写”(overriding,动态绑定)类似。动态绑定只有在重写可能存在时才会用到,而重载的方法在编译时期即可确定(这是因为它们总是定义在同一个类里面)
总而言之,其区别如下:
①静态绑定在编译时期,动态绑定在运行时期。
②静态绑定只用到类型信息,方法的解析根据引用变量的类型决定,而动态绑定则根据实际引用的的对象决定
③在java中,private static 和 final 方法都是静态绑定,只有虚方法才是动态绑定
④多态是通过动态绑定实现的。
[引用自圣哥的技术狗窝 ]

相关标签: 多态