1.多态

  先来看一个例子,其中Employee类是父类,Manager类继承了Employee类:

   public static void main(String[] args){// construct a Manager objectManager boss = new Manager("Carl Cracker", 80000, 1987, 12, 15);boss.setBonus(5000);Employee[] staff = new Employee[3];// fill the staff array with Manager and Employee objects
staff[0] = boss;staff[1] = new Employee("Harry Hacker", 50000, 1989, 10, 1);staff[2] = new Employee("Tommy Tester", 40000, 1990, 3, 15);// print out information about all Employee objectsfor (Employee e : staff)System.out.println("name=" + e.getName() + ",salary=" + e.getSalary());}

  在for循环中,尽管这里将e声明为Employee类型,但实际上e既可以引用Employee类型的对象,也可以引用Manager类型的对象。当e引用Employee对象时,e.getSalary()方法嗲用的是Employee类中的getSalary()方法;当e引用Manager对象时,e.getSalary()调用的是Manager类中的getSalary方法。

  一个对象变量(例如:e)可以指示多种实际类型的现象被称为多态(polymorphism)。在运行时能够自动地选择调用哪个方法的现象称为动态绑定。

  一个用来判断是否应该设计为继承关系的简单规则,就是“is-a”规则,它表明子类的每个对象也是父类的对象。“is-a”规则的另一种表述是置换法则。它表明程序中出现的父类对象的任何地方都可以用子类对象置换。

  在Java中,对象变量是多态的。也就是,一个对象变量既可以引用它本身的类对象,也可以引用它的任何一个子类的对象。

  2.抽象类

  父类中抽象方法可以不用实现,为了提高程序的清晰度,包含一个或多个抽象方法的类本身必须被声明为抽象的。

  除了抽象方法外,抽象类还可以包含具体数据和具体方法。

  抽象方法充当着占位的角色,它们的具体实现在子类中。扩展抽象类可以有两种选择:一种是在抽象类中定义部分抽象类方法或者不定义抽象类方法,这样就必须将子类也标记为抽象类;另一种是定义全部的抽象方法,这样一来,子类就不是抽象的了。

  类即使不含抽象方法,也可以将类声明为抽象类。

  抽象类不能被实例化。也就是说,如果一个类声明为abstract,就不能使用创造这个类的对象,但是可以创建一个具体子类的对象。同时,可以定义一个抽象类的对象变量,但是它只能引用非抽象子类的对象。

  例如:Person类是抽象类,Student是具体子类。

Person p = new Student();

  3.受保护访问protected

  在前面我们知道了,最好将类中的域标记为private,因为任何声明为private的内容对其他类都是不可见的,这对于子类来说也完全适用,即就连子类也不能访问父类的私有域。

  如果希望父类中的某些方法允许被子类访问,或允许子类的方法访问父类的某个域,可以将这些方法或域声明为protected。

  在实际应用中,要谨慎使用protected。如果需要将设计的类提供给其他程序员使用,而在这个域中设置了一些受保护域,由于其他程序员可以由这个类再派生出新类,同时可以访问其中的受保护域。在这种情况下,如果需要对这个类的实现进行修改,就必须通知所有使用这个类的程序员。这违背了OOP提倡的数据封装原则。

  4总结Java中用于控制可见性的4个访问控制符

  • private-仅对本类可见
  • public-对任何类都可见
  • protected-对本包和所有子类可见
  • 没有修饰符-对本包可见

  

  5.总结继承的设计技巧

  • 将公共操作和域放在父类
  • 不要使用受保护的域

  protected定义的实例域并不能带来更好地保护,原因主要有两点:(1)子类集合时无限制的,任何一个人都能够由某个类派生一个子类,并编写代码以直接访问protected的实例域,从而破坏了封装性。(2)在Java中,同一个包中的所有类都可以访问protected域,而不管它是否为这个类的子类。

  • 使用继承实现“is-a”关系
  • 除非所有继承的方法都有意义,否则不要使用继承
  • 在覆盖方法时,不要改变预期的行为
  • 使用多态,而非类型信息

  例如,下面这种情况就应该考虑使用多态性,如果两个action是相同的概念,就应该为这个概念定义一个方法,并将其放置在两个类的父类或接口中。

if(x是类型1)action(x);
else if (x是类型2)action(x);

  • 不要过多地使用反射

  反射是很脆弱的,即编译器很难帮助人们发现程序中的错误,因此只有在运行时才发现错误并导致异常。

转载于:https://www.cnblogs.com/BigJunOba/p/9321606.html

Java基础(五)继承和多态相关推荐

  1. Java基础篇--继承(inherit),多态(Polymorphism)

    Java基础篇--继承(inherit),多态(Polymorphism) 1. 继承概述 1.1 什么是继承 1.2 为什么要使用继承 1.3 继承的特点 1.4 继承的优点 2. 组合设计模式 2 ...

  2. Java基础:继承、多态、抽象、接口

    第一讲    继承 一.继承概述 1.多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可. 2.通过extends关键字可以实现类与类的 ...

  3. 第二十九节:Java基础知识-类,多态,Object,数组和字符串

    前言 Java基础知识-类,多态,Object,数组和字符串,回顾,继承,类的多态性,多态,向上转型和向下转型,Object,数组,多维数组,字符串,字符串比较. 回顾 类的定义格式: [类的修饰符] ...

  4. Java实验3继承、多态

    继承.多态(接口和包) 实验目的 (1) 掌握Java语言中继承和多态的相关概念 (2) 掌握Java程序设计中继承和多态机制的使用 (3) 掌握Java语言中接口和包的概念及使用 实验内容及要求 仿 ...

  5. Java中的继承 与 多态(中)

    先导: 我们在<Java中的继承 与 多态(上)>当中讲解了如下几个问题,  1.继承是什么   2.super关键字   3.特殊考点-父子类中不同代码块的实现顺序 所以现在我们对于继承 ...

  6. 第二十八节:Java基础-进阶继承,抽象类,接口

    前言 Java基础 - 进阶继承,抽象类,接口 进阶继承 class Stu {int age = 1; } class Stuo extends Stu {int agee = 2; } class ...

  7. 面渣逆袭:Java基础五十三问,快来看看有没有你不会的

    这节我们回到梦开始的地方--Java基础,其实过了萌新阶段,面试问基础就问的不多,但是保不齐突然问一下.想一下,总不能张口高并发.闭口分布式,结果什么是面向对象,说不清,那多少有点魔幻.所以赶紧来看看 ...

  8. Java回顾 封装 继承和多态

    封装 什么是封装 封装:就是隐藏对象的属性和实现细节,仅对外提供公共访问方式. 封装时的权限控制符区别如下: 封装的意义 对于封装而言,一个对象它所封装的是自己的属性和方法,所以它是不需要依赖其他对象 ...

  9. Java 基础(继承)

    继承 基础 1. 继承的特点 2. super关键字 3. 继承中变量访问特点(就近原则) 4. 继承中成员方法访问特点 5. 继承中构造访问特点 为什么子类中所有构造方法默认都会访问父类无参构造方法 ...

  10. java基础:继承的使用

    一.继承的使用 1.什么是继承 2.继承的设计规范 3.继承的内存原理 test.java package Test;public class test {public static void mai ...

最新文章

  1. 原生JS forEach()和map()遍历的区别以及兼容写法
  2. Tcl学习之--表达式
  3. 2.3 基本算法之递归变递推 放苹果 python
  4. 浅谈面试中常考的两种经典布局——圣杯与双飞翼
  5. c语言算法课件,《C语言常见算法》PPT课件.ppt
  6. 2.4、准备Spring Boot的环境 prepareEnvironment
  7. 为什要学习烹饪?学习烹饪迫在眉睫
  8. 少儿编程scratch系统介绍(附网站源码)
  9. hdu1013 (Digital Roots)
  10. angular使用jqwidgets注意事项
  11. 查询京东快递物流状态,快速筛选出代收的单号
  12. 图解传说中的HTTP协议
  13. 玲听预告 | 蚂蚁金服布局区块链的底层心法是什么?
  14. 石家庄康业软件科技有限公司
  15. 阿里实习生招聘笔试题目
  16. 二叉搜索树(平衡二叉搜索树)
  17. HiPER宽带安全网关——逍遥岛网吧应用实例(转)
  18. 操作系统MIT6.S081:P7->Interrupts
  19. c语言 找出一个大于给定整数且紧随这个整数的素数
  20. 同品酸甜苦辣,风雨同行,不离不弃

热门文章

  1. 每天一道LeetCode-----将用数组表示的整数加一,两个用字符串表示的(二进制)数相加
  2. Mysql(9)——排序的方法order by与limit的用法
  3. 计算机应用基础专科,2016电子科技大学计算机应用基础(专科)在线作业2
  4. PHP读写操作Excel
  5. VS与Matlab混合编译 - mexw64 (C++版)
  6. boost::function/bind
  7. BZOJ-2440 (莫比乌斯函数)
  8. 如何查看自己的电脑是否支持EFI引导?我的是dell 15r-488 N5010 谢谢了!
  9. 抖音上测试年龄星座的软件,抖音年龄计算器
  10. linux多线程信号总结