多态
来源:互联网 发布:淘宝卖家注册流程 编辑:程序博客网 时间:2024/04/30 05:03
一、概念:多种形态。
二、定义:父类的引用或者接口的引用指向子类或者实现类的对象。
三、三大步骤:
1、new关键字:代表对象的实际类型不会发生变化。
2、编译时多态:编译时看主观类型或者说是引用类型。
3、运行时多态:运行时看实际类型。
四、一些术语:
1、向上转型/向下转型:子类的引用赋值给父类的引用/父类的引用指向子类的引用。
五、局限性:
1、只适合普通方法的调用
2、不能调用属性
3、静态方法不支持多态
4、方法修饰符是private,不支持多态
六、多态的强转(接口的特殊性):
1、父类的引用可以强转为子类的引用
2、接口引用可以强转为任何类型的引用
3、任何类型可以强转为接口的引用
4、强转往往会骗过编译器,在运行时才会抛出异常
补充理解(应用):
前提条件:一个动物的父类 猫狗猴蛇虎等子类。
Class Animal{
public void eat(){}
}
class Dog extends Animal{
public void eat(){}
public void eatBone(){}
}
例子:
1、Animal animal = new Dog();//实际类型是Dog
2、Dog dog = (Dog)animal;//强制类型转换
3、Cat cat = (Dog)dog;//ClassCastException编译转换异常。
4、animal虽然实际类型是dog,但在调用animal.eatBone()时,编译是不通过的,animal是主观类型,编译器指挥找到animal中的方法,实际方法是运行时才会找到的,换句话说,编译器要求在代码编写阶段,代码调用的是主观类型的方法,不能调用实际类型特有的方法。
5、instanceOf、==、getClass()和equals()的区别
(1)Dog insanceOf Animal 要求Dog所在的引用 是Animal所在引用的同类或者子类
(2)BeforeDog == AfterDog 要求BeforeDog和AfterDog的引用指向的是同一个对象
(3)BeforeDog.getClass() == AfterDog.getClass() 要求BeforeDog的类对象和AfterDog的类对象是一样的。常用来判别两个对象是否是同类。
(3)BeforeDog.equlas(AfterDog)要求BeforeDog引用对象的内容和AfterDog引用对象的内容一致。
6、屏蔽子类之间的差异(应用参数表和返回值)和子类统一调用
//写些例子、加个链接
二、定义:父类的引用或者接口的引用指向子类或者实现类的对象。
三、三大步骤:
1、new关键字:代表对象的实际类型不会发生变化。
2、编译时多态:编译时看主观类型或者说是引用类型。
3、运行时多态:运行时看实际类型。
四、一些术语:
1、向上转型/向下转型:子类的引用赋值给父类的引用/父类的引用指向子类的引用。
五、局限性:
1、只适合普通方法的调用
2、不能调用属性
3、静态方法不支持多态
4、方法修饰符是private,不支持多态
六、多态的强转(接口的特殊性):
1、父类的引用可以强转为子类的引用
2、接口引用可以强转为任何类型的引用
3、任何类型可以强转为接口的引用
4、强转往往会骗过编译器,在运行时才会抛出异常
补充理解(应用):
前提条件:一个动物的父类 猫狗猴蛇虎等子类。
Class Animal{
public void eat(){}
}
class Dog extends Animal{
public void eat(){}
public void eatBone(){}
}
例子:
1、Animal animal = new Dog();//实际类型是Dog
2、Dog dog = (Dog)animal;//强制类型转换
3、Cat cat = (Dog)dog;//ClassCastException编译转换异常。
4、animal虽然实际类型是dog,但在调用animal.eatBone()时,编译是不通过的,animal是主观类型,编译器指挥找到animal中的方法,实际方法是运行时才会找到的,换句话说,编译器要求在代码编写阶段,代码调用的是主观类型的方法,不能调用实际类型特有的方法。
5、instanceOf、==、getClass()和equals()的区别
(1)Dog insanceOf Animal 要求Dog所在的引用 是Animal所在引用的同类或者子类
(2)BeforeDog == AfterDog 要求BeforeDog和AfterDog的引用指向的是同一个对象
(3)BeforeDog.getClass() == AfterDog.getClass() 要求BeforeDog的类对象和AfterDog的类对象是一样的。常用来判别两个对象是否是同类。
(3)BeforeDog.equlas(AfterDog)要求BeforeDog引用对象的内容和AfterDog引用对象的内容一致。
6、屏蔽子类之间的差异(应用参数表和返回值)和子类统一调用
//写些例子、加个链接
0 0