JAVA:多态

  • 多态(Polymorphism)按字面的意思就是"多种状态",是面向对象的程序设计语言最核心的特征.
  • 从一定角度来看,封装和继承几乎都是为多态而准备的.

多态的分类

  • 1、编译时多态(设计时多态):方法重载
  • 2、运行时多态:JAVA运行时系统根据调用该方法的实例的类型来决定选择调用那个方法则被称为运行时多态
  • 平时说的多态,多指运行时多态
  • 一个应用变量到底会指向那个类的实例对象,该引用变量发出的方法调用到底是那个类中实现的方法,必须在由程序运行期间才能决定.

必要条件:

  • -满足继承关系
  • -父类引用指向子类对象
  • 向上类型转换(Upcast):将子类型转换为父类型.
      - 隐式/自动类型转换,是小类型到大类型的转换
      - 对于向上的类型转换,不需要显示指定,即不需要加上前面的小括号和父类类型名
  • 向下类型转换(Downcast):将父类型转换为子类型
      - 讲一个指向子类对象的父类引用赋值给一个子类的引用
      - 强制类型转换,是大类型到小类型
      父类型的引用必须指向转型的子类的对象,即指向谁才能转换成谁.不然也会编译出错
  • 通过instanceof运算符,来解决引用对象的类型,避免类型转换的安全性问题,提高代码的强壮型.
     
  • 注意:
    1、父类引用指向子类实例时,可以调用子类重写父类的方法以及直接继承父类的方法,无法调用子类特有的方法.
    2、静态static方法属于特殊情况,静态方法只能继承,不能重写.调用的时候用谁的引用,则调用谁的版本.
     

抽象类

  • Java中使用抽象类,限制实例化
 public abstract class Animal{
 
 }

应用场景:

  某个父类只是知道其子类应该包含怎样的方法,但无法准确知道这些子类如何实现这些方法.

抽象方法

  • abstract也可用于方法-抽象方法
      - 抽象方法没有方法体
      - 抽象方法必须在抽象类里
       - 抽象方法必须在子类中被实现,除非子类是抽象类
  public abstract void eat(){
  
  }

抽象类&抽象方法

  • 使用规则
      1.abstract定义抽象类
      2.抽象类不能直接实例化,只能被继承,可以通过向上转型完成对象实例
      3.abstract定义抽象方法,不需要具体实现
      4.包含抽象方法的类是抽象类
      5.抽象类中可以没有抽象方法
      6.子类如果没有重写父类所有的抽象方法,则也要定义抽象类
      7.abstract不能与static、final、private共存
      8.抽象方法在子类实现时访问权限必须大于等于父类方法
     

接口

  • 接口定义了某一批类所需要遵守的规范
  • 接口不关心这些类的内部数据,也不关心这些类里方法的实现细节,它只规定这些类里必须提供某些方法

语法:

  [修饰符]interface 接口名[extends 父接口 1,父接口2...]{
    零个到多个常量定义...
    零个到多个抽象方法的定义...
    零个到多个默认方法的定义...(jdk1.8新增)
    零个到多个静态方法的定义...(jdk1.8新增)
}

  • 接口及接口成员默认的访问权限为:public或默认
  • 常量默认添加static final关键字
  • 抽象方法默认添加abstract关键字
  • 只有default方法及static方法可以添加方法体
  • 实现接口的类如果不能实现所有接口中待重写的方法,则必须设置为抽象类
  • 接口可以实现多继承,即一个子接口可以同时继承多个父接口
  • 一个类可以继承一个父类,同时实现多个接口
  • 当一个类同时实现多接口,且其中同时具有相同方法时,实现类需要写该方法,否则编译报错
     

内部类

  • 在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类
  • 与之对应,包含内部类的类被称为外部类
  public class Person{
        int age;// 年龄
        public Heart getHeart(){
            return new Heart();
      }
      // 内部类:心脏
      class Heart{
          public String beat(){
              return "心脏在跳动";
          }
      }
  }
  • 内部类提供了更好的封装,可以报内部类隐藏在外部类之内,不允许同一个包中其他的类访问该类,更好的实现了信息隐藏.

内部类的分类:

  • 成员内部类
     a).内部类中最常见的就是成员内部类,也称为普通内部类
     b).内部类相当于外部类的一个成员变量,可以使用任意访问修饰符.
     c).内部类中定义的方法可以直接访问外部类中的数据,而不受访问控制符的影响.
     d).外部类不能直接使用内部类的成员和方法,需要借由内部类对象完成.
     e).需要通过外部类对象来创建内部类实例.
     f).如果外部类和内部类具有相同的成员,内部类默认优先访问自己的成员;可以通过"外部类.this.对象成员"以及"外部类.静态成员"的方式访问外部类成员.
     g)编译后产生:外部类$内部类.class
  • 静态内部类
     a).静态内部类对象可以不依赖外部类对象,直接创建.
     b).静态内部类不能直接访问外部类的非静态成员,但可以通过"外部类对象.成员"的方式访问
     c).外部类中可以通过"类名.成员名"的方式直接访问内部类中静态成员
  • 方法内部类
     a).定义在外部类方法中的内部类,也称局部内部类
     b).方法内部类只在其定义所在的方法的内部可见,即只在该方法内可以使用
     c).方法内部类不能使用访问控制符和static修饰符,但可以使用final和abstract修饰
     d).编译后产生:外部类$数字.class
  • 匿名内部类
     a)如果某个类的实例只是用一次,则可以将类的定义与类的创建,放到一起完成,或者说在定义类的同事就创建一个类.一这种方法定义的没有名字的类称为匿名内部类.
  • 适用场景:
      - 只用到类的一个实例
      - 类在定义后马上用到
      - 给类命名并不会导致代码更容易被理解
  • 使用原则:
      -不能有构造方法,可以通过构造代码块实现数据初始化.
      -不能定义任何静态成员、静态方法
      -不能使用public、protected、private、static、abstract、final修饰
      -因匿名内部类也是局部内部类,所以局部内部类的所有限制都对其生效.
      -一个匿名内部类一定是在new的后面,用其隐含实现一个接口或继承一个类,但是两者不可兼得.
      -只能创建匿名内部类的一个实例
      -匿名内部类在编译的时候由系统自动起名为Outter$1.class
      -一般来说,匿名内部类用于继承其他类或是实现接口,并不需要增加额外的方法,只是对继承方法的实现或是重写.
      -通过匿名内部类返回的是一个对象的引用,所以可以直接使用或将其复制给一个对象变量.
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352