Java____多态之上下转型与重写、重载概念复习
2015-08-17 17:25
531 查看
override->重写(=覆盖)、overload->重载、polymorphism -> 多态o
verride是重写(覆盖)了一个方法,以实现不同的功能。一般是用于子类在继承父类时,重写(重新实现)父类中的方法。 重写(覆盖)的规则: 1、重写方法的参数列表必须完全与被重写的方法的相同,否则不能称其为重写而是重载. 2、重写方法的访问修饰符一定要大于被重写方法的访问修饰符(public>protected>default>private)。 3、重写的方法的返回值必须和被重写的方法的返回一致; 4、重写的方法所抛出的异常必须和被重写方法的所抛出的异常一致,或者是其子类; 5、被重写的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行重写。
6、静态方法不能被重写为非静态的方法(会编译出错)。
overload是重载,一般是用于在一个类内实现若干重载的方法,这些方法的名称相同而参数形式不同。 重载的规则: 1、在使用重载时只能通过相同的方法名、不同的参数形式实现。不同的参数类型可以是不同的参数类型,不同的参数个数,不同的参数顺序(参数类型必须不一样); 2、不能通过访问权限、返回类型、抛出的异常进行重载; 3、方法的异常类型和数目不会对重载造成影响;
多态的概念比较复杂,有多种意义的多态,一个有趣但不严谨的说法是:继承是子类使用父类的方法,而多态则是父类使用子类的方法。 一般,我们使用多态是为了避免在父类里大量重载引起代码臃肿且难于维护。
package com.jikexueyuan; class A{ public void tell1(){ System.out.println("A----1"); } public void tell2(){ System.out.println("A----2"); } } class B extends A{ public void tell1(){ System.out.println("B----1"); } public void tell3(){ System.out.println("B----3"); } } public class pol { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub // B b=new B(); // A a=b; // a.tell1(); // a.tell2(); A a=new B(); B b=new B(); b=(B)a; b.tell1(); b.tell2(); b.tell3(); } }
第一部分输出结果:
B----1
A----2
第二部分输出结果:
B----1
A----1
B----3
tip:
#向上转型 只能调用父类中有的方法,若父类中的某些方法(tell1)已经被重写,则输出子类中tell1方法的结果。
#向下转型 必须A a=new B(); 如果new A(); 向下转型时会报错,没有明确类型。同时还要使用“(B)”进行强转。可调用子类所有方法及继承自父类的方法。
应用:
public class pol { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub //向上转型 // // A a=new B(); // a.tell1(); // a.tell2(); //多态应用 say(new B());
//相当于上面的向上转型 这样在主类中多次调用say方法 传入任何子类参数都可以调用子类中重写的tell1方法或者父类中tell1方法而不用此外写针对不同参数类型的say方法 } public static void say(A a){ a.tell1(); } }
instanceof关键字:
public static void main(String[] args) { A a=new A(); System.out.println(a instanceof B);//false System.out.println(a instanceof A);//true A a1=new B(); System.out.println(a1 instanceof B);//true System.out.println(a1 instanceof A);//true B b=new B(); System.out.println(b instanceof B);//true System.out.println(b instanceof A);//true }
相关文章推荐
- java递归删除文件及文件夹
- jdk1.8.0_45源码解读——LinkedList的实现
- IntelliJ IDEA 快捷键-Java开发者你们都会吗?
- Maven学习总结(七)——eclipse中使用Maven创建Web项目
- java内存管理:深入Java内存区域
- java 之代理模式
- 批量(bulkload)载入数据到hbase
- Servlet实现文件上传的几种方法
- Spring Data Jpa 学习笔记
- Java开发纯接口的动态代理
- 移动平均数最简洁的算法
- 【转】Java 类的生命周期详解
- Java多线程-线程的同步与锁
- Java常用23种设计模式详解
- java中hashcode()和equals()详解
- JAVA中REPLACE和REPLACEALL的区别
- [Java] 继承,隐藏,覆盖,重载,多态,抽象类,接口
- Java基础10 接口的继承与抽象类
- struts2 struts.xml文件<constant>标签说明
- java中的map其实就是以键值对形式的存放数据的容器,其常用的实现类主要是哈希map