tip:以下是正文部分
一、多态的基本介绍
方法或对象具有多种形态。是面向对象的第三大特征。
多态是建立在封装和继承的基础上的
二、方法的多态
重写和重载体现多态
三、对象的多态
1.对象的编译类型和运行类型可以不一样(也可以一样)
animal ani = new animal();
animal ani = new cat();
2.对象的编译类型在定义对象是就决定了,不能改变。
3.运行类型是可以改变的。
4.编译类型看=左边,运行类型看=右边
animal ani = new cat();
//编译类型为 animal
//运行类型为 cat
四、多态的细节
多态的前提是:两个对象(类)存在继承关系
五、多态中的向上转型
1.本质: 父类的引用指向了子类的对象
2.语法: 父类类型 引用名 = new 子类类型()
3.可以调用父类中的所有成员(需遵守访问权限)
4.不能调用子类中特有成员: (因为在编译阶段,编译类型为父类,无法找到子类的方法)
5.最终运行效果看子类的具体实现 (符合继承中查找方法的规则)
六、多态中的向下转型
1.语法:子类类型 引用名 = (子类类型) 父类引用
2.只能强转父类的引用,不能强转父类的对象
相当于只能转变父类的运行类型,不能转变编译类型
3.要求父类的引用必须指向的是当前目标类型的对象
相当于需要是父类和子类的关系
4.可以调用子类类型中所有的成员
七、多态中的属性
属性没有重写之说!属性的值看编译类型
public class main {
public static void main(String[] args) {
a a = new b();
System.out.println(a.num);//10
}
}
class a{
int num = 10;
}
class b extends a{
int num = 20;
}
八、instanceOf( )
判断对象的运行类型是否为XX类型或XX类型的子类型
public class main {
public static void main(String[] args) {
a a = new b();
System.out.println(a instanceof b);//true
System.out.println(a instanceof a);//true
System.out.println(a instanceof Object);//true
}
}
class a{
int num = 10;
}
class b extends a{
int num = 20;
}
九、动态绑定机制
1.当调用对象方法的时候,该方法会和该对象的( 内存地址/运行类型 )绑定。
public class main {
public static void main(String[] args) {
a a = new b();
System.out.println(a.add()); // 30
}
}
class a{
int num = 10;
public int add(){
return getNum() + 10;
}
public int getNum() {
return num;
}
}
class b extends a{
int num = 20;
@Override
public int getNum() {
return num;
}
}
2.当调用对象属性时,没有动态绑定机制,哪里声明,哪里使用。
public class main {
public static void main(String[] args) {
a a = new b();
System.out.println(a.add()); //20
}
}
class a{
int num = 10;
public int add(){
return num + 10;
}
}
class b extends a{
int num = 20;
}