• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • YouClaw
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
风吹花落泪如雨
博客园    首页    新随笔    联系   管理    订阅  订阅

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。

 

posted @ 2018-06-06 21:04  风吹花落泪如雨  阅读(103)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3