`

java多态之Override

    博客分类:
  • java
阅读更多

原文:http://skyuck.iteye.com/blog/764696

 

Override(重写)是子类与父类的一种多态性体现。 
Override允许子类改变父类的一些行为。 
为什么需要Override:当父类不满足子类的一些要求时我们就需要子类对父类的一些行为进行重写。 
例如:某公司里的员工的电话号码不允许对外公开,而销售人员(员工)的电话号码则需要对外公开。 

这时我们就可以这样做: 

Java代码  收藏代码
  1. public class Employee {  
  2.       
  3.     private String mobile;  
  4.       
  5.     public Employee(String mobile) {  
  6.         this.mobile = mobile;  
  7.     }  
  8.       
  9.     protected String showMess(){  
  10.         return "电话号码:"+mobile;  
  11.     }  
  12. }  


员工类的showMess方法是protected的,所以位于其他包的对象是访问不到的。 

然后定义一个销售人员的类(Sales),并继承Employee类 

Java代码  收藏代码
  1. public class Sales extends Employee{  
  2.       
  3.         //子类除了具有父类的一些属性,也可以有自己的一些属性  
  4.     private String msn;  
  5.   
  6.     public Sales(String mobile,String msn) {  
  7.         super(mobile);  
  8.         this.msn = msn;  
  9.     }  
  10.   
  11.     @Override  
  12.     public String showMess() {  
  13.         return super.showMess()+"==msn:"+this.msn;  
  14.     }  
  15. }  


注意这时被覆盖的showMess方法的访问级别是public,可以被任何其他对象访问到。 

关于Override有几点要注意的地方: 
1.被覆盖方法的访问控制级别可以不一样。 
例如上例父类的showMess方法的访问级别为protected的,而子类覆盖的showMess方法访问级别则为public的。 

但子类的访问级别必须要高于父类被覆盖方法的访问级别,如果父类是public的而子类是protected的则是错误的。

2.方法被定义为private或static或final的则不能被覆盖。 

3.方法的返回类型:子类的返回类型可以是更具体的对象,例如可以将Employee类的返回类型改为Object也正确。而倒过来则错误。 

4.在方法调用时先会在子类中找覆盖的方法,如果子类中没有则会在父类中去找。 

Java代码  收藏代码
  1. public class Parent {  
  2.       
  3.     private int num(int i,int j){  
  4.         return i+j;  
  5.     }  
  6.       
  7.     public static void main(String[] args) {  
  8.         Parent p = new Child();  
  9.         System.out.println(p.num(12));  
  10.     }  
  11. }  
  12. class Child extends Parent{  
  13.       
  14.     public int num(int x,int y){  
  15.         return x-y;  
  16.     }  
  17. }  


这段代码的执行结果为什么呢?如果你回答-1则错了,正确答案是3。 
为什么呢?因为父类的num方法是private的,所以不能被覆盖,所以子类的num方法不是一种Override,因此在子类找不到被覆盖的num方法就会执行父类的num方法。所以结果输出为3. 

Java代码  收藏代码
  1. public class Parent {  
  2.       
  3.     public int test(){  
  4.                 //执行子类的num方法  
  5.         return num(1,2);  
  6.     }  
  7.       
  8.     protected int num(int i,int j){  
  9.         return i+j;  
  10.     }  
  11.       
  12.     public static void main(String[] args) {  
  13.         Parent p = new Child();  
  14.         System.out.println(p.test());  
  15.     }  
  16.   
  17. }  
  18. class Child extends Parent{  
  19.       
  20.     public int num(int x,int y){  
  21.         return x-y;  
  22.     }  
  23. }  


那么这段代码的执行结果是-1,因为父类test方法调用的是子类的num方法。

分享到:
评论

相关推荐

    从虚拟机角度看Java多态->(重写override)的实现原理

    从虚拟机角度看Java多态->(重写override)的实现原理

    java 接口 类 继承 多态的简单实例

    实现重载(overload)和重写(override) 调用中用到多态,向上转换,强制转换 所有被创建的类,都各自创建两个实现接口 最底层的类中创建内部类,并在外部类中调用内部类的方法

    Java面向对象多态.pdf

    它是基于继承、重写和向上转型等特性实现的,多态是面向对象编程的三大特征之一,其他两个分别是封装和继承。 Java 多态包括以下三种方式 方法重写(Override) 子类可以对从父类继承的方法进行重写,以便根据子类的...

    Java语言中的 覆盖重载和多态

    Java语言中的覆盖重载和多态,方法的多态,类型的多态,多态的优点,覆盖(override)识别标志,方法的重载,构造函数的重载,重载的好处,重载与覆盖的比较,编译时多态和运行时多态

    C++中的多态与多重继承实现与Java的区别

    多态也即子类对父类成员函数进行了重写 (Override) 后,将一个子类指针赋值给父类,再对这个父类指针调用成员函数,会调用子类重写版本的成员函数。简单的例子: class Parent1 { public: virtual void sayHello...

    Java开发技术大全(500个源代码).

    showSomething.java 测试运行时多态 stupid.java 试图覆盖最终方法的类,它有错误 Sub.java 一个简单的子类 Super.java 一个基类 testOverload.java 测试方法的重载示例1 testOverload_1.java 测试方法的重载...

    Java复习大纲面试题.doc

    方法重写(Override/Overwrite):是指子类重写了从父类继承过来的方法。 区别:方法重载没有继承、属于一种静态联编技术。 方法重写有继承、属于动态联编技术。 10.什么是抽象类?什么是接口?抽象类与接口的区别?

    学习Java,你需要知道这些——三大特性之多态

    重写(override) 父类引用子类对象 多态的优点: 消除类型之间的耦合关系 可替换性 可扩充性 接口性 灵活性 简化性 以下面的代码为例: public class Animal { String color; String name; public void Call() {...

    Java语法基础-面试专题及答案

    11.Java 面向对象编程三大特性: 封装 继承 多态 关于继承的3点 12.String StringBuffer 和 StringBuilder 的区别是什么 String 为什么是不可变的 可变性、线程安全性的研究 13.自动装箱与拆箱 14.在一个静态方法内...

    JAVA基础课程讲义

    方法的重写(override) 74 隐藏/封装(encapsulation) 75 为什么需要封装?封装的作用和含义? 75 使用访问控制符,实现封装 76 封装的使用细节 76 多态(polymorphism) 76 为什么需要多态? 76 如何实现多态? 77 方法...

    java学习重点

    JAVA学习要点 一、关于Java ...多态性就是“一种接口,多种方法”,可以为一组相关的动作设计一个通用的接口,其实类的函数的重载就是一种多态的体现; 4 引入抽象编程的思想; 类的封装就是一种抽象思想

    java基础案例与开发详解案例源码全

    6.3.2 Java中多态的实现162 6.2.3 类型检测.向上转型.向下转型164 6.2.4 动态绑定166 6.4 访问修饰符167 6.5 static修饰符168 6.5.1 静态变量168 6.5.2 静态方法169 6.5.3 静态代码块169 6.5.4 单态模式170 6.6 ...

    Java零基础-方法覆盖.md

    内容概要: 本文介绍了...建议通过阅读相关的Java教材或搜索资料,进一步了解与方法覆盖相关的高级主题,如多态和抽象类等内容。 如有疑问,可以参考Java官方文档或向技术论坛寻求帮助,进一步加深对方法覆盖的理解。

    Java面试宝典2017.zip

    23、java中实现多态的机制是什么? 17 24、abstract class和interface有什么区别? 17 25、abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized? 18 26、什么是内部类?Static Nested ...

    java 面对对象编程.pdf.zip

    是否可被 override? 面向对象三大特征 封装 继承 多态 接口和抽象类有什么共同点和区别? 深拷贝和浅拷贝区别了解吗?什么是引用拷贝? Java 常见类 Object Object 类的常见方法有哪些? == 和 equals() 的区别 ...

    疯狂JAVA讲义

    学生提问:为什么有栈内存和堆内存之分? 93 4.6.2 基本类型数组的初始化 95 4.6.3 引用类型数组的初始化 96 4.6.4 没有多维数组 99 学生提问:我是否可以让图4.13中灰色覆盖的数组元素再次指向另一个数组?这样...

    java面试题及答案.doc

    1. 用代码示例一个多态的例子 2. java的基本数据类型包括哪些,String是基本的数据类型吗 ? 3. int 和 Integer 有什么区别 4. String 和StringBuffer的区别 5. Collection 和 Collections的区别。 6. &和&&的...

    AIC的Java课程1-6章

    第3版 机械工业出版社  教学内容和要求 知识点 重要程度 使用频度 难度 Java 入门 高 中 易 变量和运算符 高 高 中 控制结构 高 高 易 数组 高 高 中 方法 很高 高 中 封装 很高 很高 难...

    java 面试常问的问题 如何回答

    23、java中实现多态的机制是什么? 17 24、abstract class和interface有什么区别? 17 25、abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized? 18 26、什么是内部类?Static Nested ...

Global site tag (gtag.js) - Google Analytics