DAY11------面向对象 小结

来源:互联网 发布:nginx http1.1配置 编辑:程序博客网 时间:2024/04/28 05:44

---------------------- 拖走FM----期待与您交流! --------

收音机,电台,网上电台,广播,在线广播,网络广播,广播电台,网络电台,在线电台,电台在线收听,广播电台在线收听,网络电台在线收听,在线收听电台,fm收音机,网络收音机,广播下载,在线收音机,收音机软件下载,电台软件下载,网络收音机下载--------------

---------------------- 拖走FM----期待与您交流! --------


面向对象——多态

多态:是指同一个实体同时具有多种形式

   比如水有多种形态

编译时的类型由声明该变量时使用的类型决定,运行时的类型由实际赋给变量的对象决定。

如果编译时的类型和运行时类型不同,就会出现多态。

EG 

Student extends Person://前提是继承


Person p=new Person();

Person s=new Student();

Person p=new Student();//多态


引用关系:父类变量指向子类的实例对象,而程序调用的方法在运行期才动态绑定。

就是引用变量所指向的真正实例对象的方法,也就是内存里正在运行的那个对象方法,而不是引用变量的类型重定义的方法。

多态的作用:

把不同的子类对象都当做父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的程序,以适应需求的不断变化

只修改方法的实现,不必修改方法的声明。

分类

编译时多态 方法的重载

运行时多态 方法的覆写

package com.itheima;//先构造一个父类抽象出 dog的共同特点 采用class Dog{void eat(){System.out.println("一般的狗吃一般的狗粮!");}}class HashDog extends Dog{void eat(){System.out.println("哈士奇吃哈士奇的狗粮!");}}class ZangAoDog extends Dog{//多态是建立在继承之上的 继承dog的父类 然后覆写(同名同参不同方法)void eat(){System.out.println("藏獒吃藏獒的狗粮!");}}//构造完成 通过主函数进入//定义一个动物园喂的方法class Zoo{//初始化一个动物园类void feed(Dog d){//定义一个feed方法 参数为dog dd.eat();}}//主函数的入口public class Test9910 {public static void main(String[] args) {Dog hd = new HashDog();//创建一个Dog对象Dog zd = new ZangAoDog();Zoo z = new Zoo();//创建一个Zoo 对象z.feed(hd);//调用z对象的feed方法 参数为hdSystem.out.println(" ");z.feed(zd);}}引用型变量类型转换向上转型(子类——>父类):(自动完成)父类名称 父类对象=子类实例;向下转型(父类——>子类):(强制完成)子类名称 子类对象=(子类名称) 父类实例对象名 instanceof 类判定指定的变量名此时引用的真正类型是不是当前给出的类或子类;对象的类型补习有继承关系编写java程序时,引用变量只能调用它编译时类型的方法,而不能调用它运行时类型的方法,即使它实际所引用对象确实包含该方法。引用类型之间的转换只能把一个父类变量转换成子类类型。如果试图把一个父类实例转换成子类类型,则必须这个对象实际上是子类实例才行(即编译时类型为父类类型,运行时为子类类型),否则会发生ClassCastException异常。public class Test {     public static void main(String[] args) {         Object o1=new Object();//o1的编译类型是Object,实际类型是Object,是string的父类,所以可以强制转换成string类         String o2=new String();             //o2的编译类型是String,实际类型是String         Object o3=new String();            //o3的编译类型是Object,实际类型是String         o2=(String)o1;                          //编译时没错,运行时有错(o2和o1的实际类型不一样)        o2=(String)o3;                           //编译时没错,运行时没错(o2和o3的实际类型一样)        o3=(String)o1;                          //编译时没错,运行时有错(o1和o3的实际类型不一样)        o3=o1;                                     //编译时没错,运行时也没错     }}在强制转换之前可以先用instanceof来判断是否可以成功转换,instanceof 的前一个操作数通常是引用类型变量,后一个通常是类。它用于判断前面的对象是否是后面的类或其子类的实例,如果是返回true否则返回false。instanceof前面的操作数的编译类型要么与后面的类相同,要么是后面类的父类,否则会发生编译错误。Eg:class A extends B{} B b = new A();If(b instanceof A){ ...}



0 0
原创粉丝点击