JAVA多态的汇总
来源:互联网 发布:计算机编程前景 编辑:程序博客网 时间:2024/05/18 22:39
多态:可以理解为事物存在的多种体现形态。
-----------------------------------
1,多态的体现
父类的引用指向了自己的子类对象。
//动物 x = new 猫();
----------------------------------
2,多态的前提
1) 必须是类与类之间有关系。要么继承(extends),要么实现(implements)。
2) 通常还有一个前提:存在覆盖(重写)。
3)父类引用指向自己的子类对象
----------------------------------
3,多态的好处
预先定义的程序可以运行后期程序的内容。
多态的出现大大的提高程序的扩展性。
----------------------------------
4,多态的弊端:
虽然可以预先使用,但是只能访问父类中已有的功能,运行的是后期子类的功能内容。不能预先使用子类中定义的特有功能。
----------------------------------
5,多态的应用
在多态中成员函数的特点:
1)对于成员函数:// class Fu{} class Zi extends Fu{} Fu f = new Zi(); f.method();
编译时期:看左边。
运行时期:看右边。
在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。
在运行时期:参阅对象所属的类中是否有调用的方法。
2) 对于成员变量(静态成员变量)的特点:
无论编译和运行,都参考左边(引用型变量所属的类)。
public class DuoTai { public static void main(String[] args) {// TODO Auto-generated method stubFu f = new Zi();System.out.println("num="+f.num+",num1="+f.num1);} }class Fu{ int num = 6; static int num1 = 7;} class Zi extends Fu{ int num = 88; static int num1 = 99;}
3)静态函数:java的静态函数和对象无关,只和声明的类有关,静态函数由类直接引用。
class Fu{void method1(){System.out.println("fu method_1");}void method2(){System.out.println("fu method_2");}static void method4(){System.out.println("fu method_4");}} class Zi extends Fu{void method1(){System.out.println("zi method_1");}void method3(){System.out.println("zi method_3");} static void method4(){System.out.println("zi method_4");}}class DuoTaiDemo4{public static void main(String[] args) {//Fu f = new Zi();////System.out.println(f.num);////Zi z = new Zi(); //f.method1();//f.method2();//f.method3(); Fu f = new Zi();f.method4(); Zi z = new Zi();z.method4();}}
4)向下转型
class Fu{} class Zi extends Fu{}Fu fu= new Zi(); //Zi向上转型为了Fu。向上转型,一般多态都采用这种。 Zi zi = (Zi)fu; //将代表Zi对象的父类引用fu强制转换成了Zi类型。向下转型。
----------------------------------
例子1:(抽象类实现多态,有分析过程):
abstract class Animal{abstract void eat(); } class Cat extends Animal{public void eat(){System.out.println("吃鱼");}public void catchMouse(){System.out.println("抓老鼠");}} class Dog extends Animal{public void eat(){System.out.println("吃骨头");}public void kanJia(){System.out.println("看家");}} class DuoTaiDemo1 {public static void main(String[] args) {//Animal a = new Cat();//类型提升。 向上转型。//a.eat(); //如果想要调用猫的特有方法时,如何操作?//强制将父类的引用。转成子类类型。向下转型。///Cat c = (Cat)a;//c.catchMouse();//千万不要出现这样的操作,就是将父类对象转成子类类型。//我们能转换的是父类应用指向了自己的子类对象时,该应用可以被提升,也可以被强制转换。//多态自始至终都是子类对象在做着变化。//Animal a = new Animal();//Cat c = (Cat)a;function(new Dog());function(new Cat()); } public static void function(Animal a)//Animal a = new Cat();{a.eat();if(a instanceof Cat){Cat c = (Cat)a;c.catchMouse();}else if(a instanceof Dog){Dog c = (Dog)a;c.kanJia();} /*instanceof : 用于判断对象的类型。 对象 intanceof 类型(类类型 接口类型) */} }
----------------------------------
例子2:(利用抽象类实现多态):
/*基础班学生:学习,睡觉。高级班学生:学习,睡觉。 可以将这两类事物进行抽取。 */ abstract class Student{public abstract void study();public void sleep(){System.out.println("躺着睡");}} class DoStudent{public void doSome(Student stu){stu.study();stu.sleep();}} class BaseStudent extends Student{public void study(){System.out.println("base study");}public void sleep(){ System.out.println("坐着睡");}} class AdvStudent extends Student{public void study(){System.out.println(" adv study");}} class DuoTaiDemo2{public static void main(String[] args) { DoStudent ds = new DoStudent();ds.doSome(new BaseStudent());ds.doSome(new AdvStudent()); //BaseStudent bs = new BaseStudent();//bs.study();//bs.sleep();//AdvStudent as = new AdvStudent();//as.study();//as.sleep();} }
----------------------------------
例子3:(利用接口实现多态):
/*需求:电脑运行实例,电脑运行基于主板。*/ interface PCI{public void open();public void close();} class MainBoard{public void run(){System.out.println("mainboard run ");}public void usePCI(PCI p)//PCI p = new NetCard()//接口型引用指向自己的子类对象。{if(p!=null){p.open();p.close();}}} class NetCard implements PCI{public void open(){System.out.println("netcard open");}public void close(){System.out.println("netcard close");method();}} class SoundCard implements PCI{public void open(){System.out.println("SoundCard open");}public void close(){System.out.println("SoundCard close");}} class DuoTaiDemo3 {public static void main(String[] args) {MainBoard mb = new MainBoard();mb.run();mb.usePCI(null);mb.usePCI(new NetCard());mb.usePCI(new SoundCard());}}
- JAVA多态的汇总
- Java的一些汇总
- Java的一些汇总
- Java学习资料的汇总
- 常用的Java代码汇总
- 常用的Java代码汇总
- 常用的Java代码汇总
- 常用的Java代码汇总
- 常用的Java代码汇总
- 常用的Java代码汇总
- 常用的Java代码汇总
- 常用的Java代码汇总
- 常用的Java代码汇总
- 常用的Java代码汇总
- 常用的Java代码汇总
- 汇总常见的JAVA错误
- 常用的Java代码汇总
- 好的Java博客汇总
- Android系统移植(一)
- JS操作JSON总结
- nginx日志无法记录带有下划线“_”的请求头
- 使用特定的方法操作SQLite数据库
- 经典.net面试题目及答案(11~30)
- JAVA多态的汇总
- Closeable
- Spring的XML配置的bean调用注解方式的bean
- curlPost
- 236,HTTP
- 黑马程序员——数组
- IOS平台各种解析XML库的优缺点分析
- 信息流聚合类系统(如RSS阅读器)中数据同步的架构设计
- (转)UEFI系统的启动过程