[关闭]
@liruiyi962464 2017-03-20T11:22:56.000000Z 字数 3847 阅读 468

面向对象 多态

java

多态概念

  • 父类同一个方法 不同的子类调用它 因为方法体不同 产生不同的执行结果

多态存在的三个必要条件

  • 需要存在继承和实现关系
  • 同样的方法调用而执行不同的操作、运行不同的代码(重写操作)
  • 在运行是父类或者接口的引用变量可以引用其子类的对象

多态的作用

  • 多态通过分离做什么和怎么做,从另外一个角度讲接口和实现进行分离
  • ‘多态’则消除了类型之间的耦合关系
  • 多态的存在提高了程序的扩展性和后期的可维护性

向上向下转型

  • 子类到父类是向上转型,父类到子类是向下转型
  • 向上转型比较专用类型向通用类型转换
  • 向上转型是安全的
  • 向上转型过程中 类可能会丢失方法 而不是获取方法
  • 比较安全的操作是向下转型 不安全(需要instanceof操作符)
  • 向下转换前,使用instanceof来判断一下,以免出ClassCastException(类转换错误)

父类(Anmial)

  1. public class Animal {
  2. public void run(){
  3. System.out.println("奔跑。。");
  4. }
  5. }

子类(Dog)

  1. public class Dog extends Animal{=
  2. public void run(){
  3. System.out.println("Dog 奔跑");
  4. }
  5. public void eat(){
  6. System.out.println("Dog 饿啦。。。");
  7. }
  8. }

子类(Cat)

  1. public class Cat extends Animal {
  2. public void run() {
  3. System.out.println("Cat 奔跑");
  4. }
  5. }

测试类(Test)

  1. public static void main(String[] args) {
  2. //向上转型:子类对象转换成父类对象。
  3. 。--。。------。-。-。-。--。。-。-。-
  4. Dog dog = new Dog();
  5. Cat cat = new Cat();
  6. dog.eat();
  7. //向上转型
  8. Animal animal = (Animal)cat;
  9. animal.run();
  10. //animal.eat();//向上转型中 丢失了子类中的eat()方法
  11. //向下转型:父类对象转换成子类对象
  12. if(animal instanceof Dog){//如果是Dog 就走这个方法
  13. Dog dog1 = (Dog)animal;
  14. dog1.eat();
  15. dog1.run();
  16. }else if(animal instanceof Cat){//如果是Cat 就走这个方法
  17. Cat cat1 = (Cat)animal;
  18. cat1.eat();
  19. cat1.run();
  20. }
  21. }

多态实例

MyPrint父类

  1. public class MyPrint {
  2. public void print(){
  3. System.out.println("打印机打印");
  4. }
  5. }

子类MyPrint

  1. public class ColorPrint extends MyPrint{
  2. public void print(){
  3. System.out.println("彩色打印机打印机打印出彩色纸张!!!");
  4. }
  5. }

子类MyPrint

  1. public class BlackWhitePrint extends MyPrint{
  2. public void print(){
  3. System.out.println("黑白打印机打印机打印出黑白纸张!!!");
  4. }
  5. }

操作人Printer(操作父类)

  1. public class Printer {
  2. public void startPrint(MyPrint mp){
  3. mp.print();
  4. }
  5. }

测试

  1. public class Test {
  2. public static void main(String[] args) {
  3. Printer pt = new Printer();
  4. ColorPrint cp = new ColorPrint();
  5. pt.startPrint(cp);
  6. BlackWhitePrint bwp = new BlackWhitePrint();
  7. pt.startPrint(bwp);
  8. }
  9. }

多态实例

工程师类(Engineer)(父类)

  1. public class Engineer {
  2. private String name;
  3. public Engineer() {}
  4. public Engineer(String name) {
  5. this.name = name;
  6. }
  7. public String getName() {
  8. return name;
  9. }
  10. public void setName(String name) {
  11. this.name = name;
  12. }
  13. public void work(Product p){}
  14. }

软件工程师类(SoftwareEngineer)(子类)

  1. public class SoftwareEngineer extends Engineer{
  2. public SoftwareEngineer() {}
  3. public SoftwareEngineer(String name) {
  4. super(name);
  5. }
  6. @Override
  7. public void work(Product p) {
  8. // TODO Auto-generated method stub
  9. System.out.println("软件工程师");
  10. }
  11. }

硬件工程师类(HardwareEngineer)(子类)

  1. public class HardwareEngineer extends Engineer{
  2. public HardwareEngineer() {}
  3. public HardwareEngineer(String name) {
  4. super(name);
  5. }
  6. @Override
  7. public void work(Product p) {
  8. // TODO Auto-generated method stub
  9. System.out.println("硬件工程师");
  10. }
  11. }

产品类(Product)(父类)

  1. public class Product {
  2. private String name;
  3. public Product() {}
  4. public Product(String name) {
  5. this.name = name;
  6. }
  7. public String getName() {
  8. return name;
  9. }
  10. public void setName(String name) {
  11. this.name = name;
  12. }
  13. }

软件产品(SoftwareProduct)(子类)

  1. public class SoftwareProduct extends Product{
  2. public SoftwareProduct() {}
  3. public SoftwareProduct(String name) {
  4. super(name);
  5. }
  6. }

硬件产品(HaardwareProduct)(子类)

  1. public class HaardwareProduct extends Product{
  2. public HaardwareProduct() {}
  3. public HaardwareProduct(String name) {
  4. super(name);
  5. }
  6. }

公司经理(Manager)

  1. public class Manager {
  2. private String name;
  3. public Manager() {}
  4. public Manager(String name) {
  5. this.name = name;
  6. }
  7. public void AssignWork(Engineer e,Product p){
  8. if(e instanceof SoftwareEngineer){
  9. if(p instanceof SoftwareProduct){
  10. System.out.println(this.name+"派送的"+e.getName()+"会维护"+p.getName());
  11. }else{
  12. System.out.println(this.name+"派送的"+e.getName()+"不会"+p.getName());
  13. }
  14. }else if(e instanceof HardwareEngineer){
  15. if(p instanceof HaardwareProduct){
  16. System.out.println(this.name+"派送的"+e.getName()+"会维护"+p.getName());
  17. }else{
  18. System.out.println(this.name+"派送的"+e.getName()+"不会"+p.getName());
  19. }
  20. }else{
  21. System.out.println("没有这个工程师");
  22. }
  23. }
  24. public String getName() {
  25. return name;
  26. }
  27. public void setName(String name) {
  28. this.name = name;
  29. }
  30. }

测试类(Test)

  1. public class Test {
  2. public static void main(String[] args) {
  3. //公司经理
  4. Manager manager = new Manager("洛神");
  5. //工程师
  6. Engineer se = new SoftwareEngineer("软件工程师--->lisi--->");
  7. Engineer he = new HardwareEngineer("硬件工程师--->zhangsan--->");
  8. //产品
  9. Product sp = new SoftwareProduct("ERP");
  10. Product hp = new HaardwareProduct("网卡");
  11. manager.AssignWork(se, sp);
  12. manager.AssignWork(se, hp);
  13. manager.AssignWork(he, hp);
  14. manager.AssignWork(he, sp);
  15. }
  16. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注