1. Java 多态

多态就是同一个接口,使用不同的实例而执行不同操作.

1.1 多态存在的三个必要条件

  • 继承
  • 重写
  • 父类引用指向子类对象(Parent p = new Child();

当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。(很重要)
多态的好处:可以使程序有良好的扩展,并可以对所有类的对象进行通用处理

public class Test {public static void main(String[] args) {show(new Cat());  // 以 Cat 对象调用 show 方法show(new Dog());  // 以 Dog 对象调用 show 方法Animal a = new Cat();  // 向上转型  a.eat();               // 调用的是 Cat 的 eatCat c = (Cat)a;        // 向下转型  c.work();        // 调用的是 Cat 的 work}  public static void show(Animal a)  {a.eat();  // 类型判断if (a instanceof Cat)  {  // 猫做的事情 Cat c = (Cat)a;  c.work();  } else if (a instanceof Dog) { // 狗做的事情 Dog c = (Dog)a;  c.work();  }  }
}abstract class Animal {  abstract void eat();
}  class Cat extends Animal {  public void eat() {  System.out.println("吃鱼");  }  public void work() {  System.out.println("抓老鼠");  }
}  class Dog extends Animal {  public void eat() {  System.out.println("吃骨头");  }  public void work() {  System.out.println("看家");  }
}

执行以上程序,输出结果为:

吃鱼
抓老鼠
吃骨头
看家
吃鱼
抓老鼠

1.2 虚方法

我们已经讨论了方法的重写,也就是子类能够重写父类的方法。
当子类对象调用重写的方法时,调用的是子类的方法,而不是父类中被重写的方法。
要想调用父类中被重写的方法,则必须使用关键字super。

例子:

  • 如果实例中,实例化了两个 Salary 对象:一个使用 Salary 引用 s,另一个使用 Employee 引用 e。
  • 当调用 s.mailCheck() 时,编译器在编译时会在 Salary 类中找到 mailCheck(),执行过程 JVM 就调用 Salary 类的 mailCheck()。
  • 因为 e 是 Employee 的引用,所以调用 e 的 mailCheck() 方法时,编译器会去 Employee 类查找 mailCheck() 方法
  • 在编译的时候,编译器使用 Employee 类中的 mailCheck() 方法验证该语句, 但是在运行的时候,Java虚拟机(JVM)调用的是 Salary 类中的 mailCheck() 方法。

以上整个过程被称为虚拟方法调用,该方法被称为虚拟方法

1.3 多态的实现方式

方式一:重写:
方式二:接口

  1. 生活中的接口最具代表性的就是插座,例如一个三接头的插头都能接在三孔插座中,因为这个是每个国家都有各自规定的接口规则,有可能到国外就不行,那是因为国外自己定义的接口类型。
  2. java中的接口类似于生活中的接口,就是一些方法特征的集合,但没有方法的实现。

方式三:抽象类和抽象方法

注:类的属性变量是能重写(覆盖)

class Animal{public int age;public void move(){System.out.println("动物可以移动");}
}class Dog extends Animal{public double age;public void move(){age = 10.00;System.out.println("狗可以跑和走");}public void bark(){System.out.println("狗可以吠叫");}
}class Cat extends Animal{public void move(){super.age = 3;System.out.println("猫可以跳");}
}public class TestOverride{public static void main(String args[]){Animal a = new Animal(); // Animal 对象Animal b = new Dog(); // Dog 对象Dog c = new Dog();Cat d = new Cat();a.move();// 执行 Animal 类的方法b.move();//执行 Dog 类的方法c.move();//执行 Dog 类的方法d.move();//执行 Cat 类的方法Object aValue = a.age;Object bValue = b.age;Object cValue = c.age;System.out.println("The type of "+a.age+" is "+(aValue instanceof Double ? "double" : (aValue instanceof Integer ? "int" : "")));System.out.println("The type of "+b.age+" is "+(bValue instanceof Double ? "double" : (bValue instanceof Integer ? "int" : "")));System.out.println("The type of "+c.age+" is "+(cValue instanceof Double ? "double" : (cValue instanceof Integer ? "int" : "")));// 覆盖age属性System.out.println("The age of cat  is "+d.age);}
}

编译值:

动物可以移动
狗可以跑和走
狗可以跑和走
猫可以跳
The type of 0 is int
The type of 0 is int
The type of 10.0 is double
The age of cat  is 3

注;多态引用时,构造子类对象时的构造方法的调用顺序

1,先调用超类的构造方法,多重超类首先调用最远超类的方法;
2,然后再执行当前子类的构造方法;

调用时需要谨慎处理调用方法

2. Java 抽象类

在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。

抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。
由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定要不要设计抽象类
父类包含了子类集合的常见的方法,但是由于父类本身是抽象的,所以不能使用这些方法。
在Java中抽象类表示的是一种继承关系一个类只能继承一个抽象类,而一个类却可以实现多个接口。

2.1 抽象方法

如果你想设计这样一个类,该类包含一个特别的成员方法,该方法的具体实现由它的子类确定,那么你可以在父类中声明该方法为抽象方法。
Abstract关键字同样可以用来声明抽象方法,抽象方法只包含一个方法名,而没有方法体。
抽象方法没有定义,方法名后面直接跟一个分号,而不是花括号。

声明抽象方法会造成以下两个结果:

  • 如果一个类包含抽象方法,那么该类必须是抽象类。
  • 任何子类必须重写父类的抽象方法,或者声明自身为抽象类。

继承抽象方法的子类必须重写该方法。否则,该子类也必须声明为抽象类。最终,必须有子类实现该抽象方法,否则,从最初的父类到最终的子类都不能用来实例化对象。

抽象类总结规定:

  1. 抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。
  2. 抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类
  3. 抽象类中的抽象方法只是声明,不包含方法体,就是不给出方法的具体实现也就是方法的具体功能。
  4. 构造方法,类方法(用static修饰的方法)不能声明为抽象方法
  5. 抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。

注意:子抽象类继承父抽象类,必须显性调用父抽象类的显性构造器

摘自:
http://www.runoob.com/java/java-abstraction.html
http://www.runoob.com/java/java-polymorphism.html

Java 多态、抽象类 笔记相关推荐

  1. Java:抽象类笔记

    抽象类:类中没有包含足够的信息来描绘一个具体的对象. 为什么要创建抽象类? 为了更好的继承,以后能更好的扩展,减少类与类之间的耦合. 什么时候需要创建一个抽象类? (简单粗暴的理解)某个方法在父类中实 ...

  2. Java多态学习笔记

    面向对象三大特性:封装,继承和多态.其中,封装,继承都比较通俗易懂,唯有多态令我甚是头疼.经过仔细研究之后,终于搞懂了一点,特来做一个分享.独乐乐不如众乐乐. 何为多态?多态的本质是:一个程序中同名的 ...

  3. java读书雷_Java多态学习笔记

    java多态学习笔记 概述 多态的格式与使用 /* 代码中体现多态性:父类引用指向子类对象. */ 格式: 父类名称 对象名 = new 子类名称(); 或者 接口名称 对象名 = new 实现类名称 ...

  4. java多态可以传匿名对象吗_Java复习笔记2--匿名类和多态

    匿名类 Anonymous classes enable you to make your code more concise. They enable you to declare and inst ...

  5. 0725(016天 多态复习 java中级-抽象类01)

    0725(016天 多态复习.java中级-抽象类01) 每日一狗(田园犬西瓜瓜) 主标题 文章目录 0725(016天 多态复习.java中级-抽象类01) 主标题 1. 多态续 1.1 补充知识 ...

  6. 初始Java Java SE 包,继承,组合,多态,抽象类,接口

    目录 包 1.静态导入 2.将类放到包中 3.包的访问权限控制 继承 基本语法: 注意事项: protected 关键字 final 关键字 组合 多态 向上转型: 动态绑定 方法重写 重写的规则 : ...

  7. 笔记1——C++多态与Java多态的异同

    最近参加网易笔试遇到一个问题,考察了C++ 多态特性,自己查了相关资料学习了相关用法. 一般程序调用的函数地址是在编译期决定了,但是具有多态特性的函数调用地址是在程序运行期才决定. C++与Java多 ...

  8. Java学习笔记二十六:Java多态中的引用类型转换

    Java多态中的引用类型转换 引用类型转换: 1.向上类型转换(隐式/自动类型转换),是小类型到大类型的转换: 2.向下类型转换(强制类型转换),是大类型到小类型的转换: 3.instanceof运算 ...

  9. 当年我们一起追过的Java,Java SE 个人笔记

    目录 JDK的安装和配置运行Java程序 java基本语法 面向对象 异常 多线程l API(Application Programming Interface)各种功能的类说明 集合类 IO输入输出 ...

最新文章

  1. Centos7下安装MongoDB
  2. 第十六届全国大学生智能汽车竞赛安徽赛区赛事指南
  3. mysql数据库出现无法登录(ERROR 1045 ),预防和解决及系列问题解决方法。
  4. 一道关于回文的笔试题
  5. 用Numpy手写各种距离度量
  6. HDU3662(求三维凸包表面的多边形个数,表面三角形个数,体积,表面积,凸包重心,凸包中点到面的距离)
  7. [深度学习] 自然语言处理---Transformer 位置编码介绍
  8. JavaScript编程规范-有利于效率和可读性
  9. (算法)从10000个数中找出最大的10个
  10. Oracle 数据库入门学习
  11. 【FiddlerScript】利用FiddlerScript抓包保利威下载
  12. NCBI Genbank核苷酸序列数据库检索基因序列解读
  13. 腾讯云2022年双11云服务器配置及报价表汇总
  14. 深度学习自然语言处理模型实现大集合(精简版<100行)
  15. Android颜色对应的xml色值
  16. left join和left semi join的联系和区别
  17. android 9 8 对比,iPhone 8plus在安卓机中相当于什么层次?看看它与小米9的对比吧...
  18. After Effects Guru: Plugins You Should Know After Effects 大师教程之你必须了解的插件 Lynda课程中文字幕
  19. android 使用SAF框架操作外置sd卡
  20. 微信公众号怎么设置下载文件

热门文章

  1. OpenCV连接的组件Connected Components的实例(附完整代码)
  2. Qt Creator创建基于Qt Widget的应用程序
  3. C语言实现Trie字典树 (附完整源码)
  4. STL的forward_list链表
  5. C++内存分配方式以及区别
  6. QT实现Media Player(媒体播放器)
  7. crash工具解析_IDA反汇编静态调试Android平台C++的so文件Crash入门
  8. 2020-12-23
  9. php5.4curl报错,PHP中使用CURL报错解决方案 rip curl php curl开启 curl下
  10. sql是否包含多个字符串_工作中遇到的99%SQL优化,这里都能给你解决方案