JAVA基础(七)-----多态,instanceof运算符
多态
1.定义:
多态:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)
实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。
作用:消除类型之间的耦合关系。
多态存在的三个必要条件:
①、要有继承;
②、要有重写;
③、父类引用指向子类对象。
class A { public String show(D obj)...{ return ("A and D"); } public String show(A obj)...{ return ("A and A"); } } class B extends A { public String show(B obj)...{ return ("B and B"); } public String show(A obj)...{ return ("B and A"); } } class C extends B{} class D extends B{} class E { public static void main(String [] args) { A a1 = new A(); A a2 = new B(); B b = new B(); C c = new C(); D d = new D(); System.out.println(a1.show(b)); //①在A中没有含有B类参数的方法,但是含有A类参数的方法,根据子类对象父类可用的原则 A and A System.out.println(a1.show(c)); //②C类是B类的子类,而B类又是A类的子类,所以C类对象可以当制作A类对象使用。结果同上。 System.out.println(a1.show(d)); //③根据参数类型直接调用A中的方法。 A adn D System.out.println(a2.show(b)); //④a2本来是一个B对象,但是将其赋给了A类变量,所以a2只保留了与父类A同名的属性和方法。
a2.show(b)调用B类中的保留的与父类同名同参方法 B and A
System.out.println(a2.show(c)); //⑤B类的保留方法中没有C类参数方法,但是有含有C的父类B的父类A的参数方法,B and A System.out.println(a2.show(d)); // ⑥调用A类的方法 A and D System.out.println(b.show(b)); //⑦调用B类的方法 B and B System.out.println(b.show(c)); //⑧B类中没有C类参数的方法,但是有B类参数的方法,B and B System.out.println(b.show(d)); //⑨同上 B and B } }
与方法不同的是,对象的实例变量则不具备多态性。多态的弊端,就是:不能使用子类特有的成员属性和子类特有的成员方法。
instanceof运算符
编写Java程序时,引用变量只能调用它编译时类型的方法,而不能调用它运行时类型的方法,即使它实际所引用的对象确实包含该方法。如果需要让这个引用变量调用它运行时类型的方法,则必须把它强制类型转换成运行时类型,强制类型转换需要借助于类型转换运算符instanceof。
引用类型之间的转换条件:
①两个类型具有继承关系,否则编译时出错
②如果试图把一个父类实例转换成子类类型,则这个对象必须实际上是子类实例才行(即编译时类型为父类,运行时类型为子类),否则运行时出错
考虑到进行强制类型转换时可能出现异常,因此进行类型转换之前应先通过instanceof运算符来判断是否可以成功转换
//object判断的是其运行时类型 result = object instanceof class
instanceof在Java的编译状态和运行状态是有区别的:
在编译状态中,class可以是object对象的父类,自身类,子类。在这三种情况下Java编译时不会报错。
在运行转态中,class可以是object对象的父类(接口),自身类,不能是子类。在前两种情况下result的结果为true,最后一种为false。但是class为子类时编译不会报错。运行结果为false。
浙公网安备 33010602011771号