一.多态
多态性是面向对象程序设计的重要部分。在Java语言中,通常使用方法的重载和重写实现类的多态性。
二.接口
Java语言只支持单重继承,不支持多继承,即一个类只能有一个父类。但在实际应用中,又经常需要使用多继承来解决问题。为了解决该问题,Java语言提供了接口来实现类的多重继承功能。
1.接口的定义
使用interface来定义一个接口。接口定义与类的定义类似,也是分为接口的声明和接口体,其中接口体由变量定义和方法定义两部分组成。
定义接口的基本语法格式为:
[修饰符]interface 接口名 [extends 父接口名列表]
{
[public][static][final]变量;
[public][abstract]方法;
}
注意:Java的类文件一样,接口文件的文件名必须与接口名相同。
2.接口的实现
接口在定义后,就可以在类中实现该接口。在类中实现接口可以使用implements关键字。
基本语法格式为:
[修饰符] class<类名>[extends 父类名][implements 接口列表]
{
}
在类中实现接口时,方法名、返回值类型、参数的个数及类型必须与接口中的完全一致,并且必须实现接口中的所有方法。
在类的继承中,只能做单重继承,而实现接口时,一次则可以实现多个接口,每个接口间使用逗号“,”分隔,这时就可能出现变量或方法名冲突的情况。解决该问题时,如果变量冲突,则需要明确指定变量的接口,可以通过“接口名.变量”实现。如果出现方法冲突,则只要实现一个方法即可。
组装电脑的接口实例:
1 package org.hanqi.pn0120; 2 3 //电脑 4 public class Computer { 5 6 //品牌 7 private String pinpai; 8 9 //CPU 10 private ICPU cpu; 11 12 //显卡 13 private IDisplayCard displaycard; 14 15 16 public String getPinpai() { 17 return pinpai; 18 } 19 20 public void setPinpai(String pinpai) { 21 this.pinpai = pinpai; 22 } 23 24 public ICPU getCpu() { 25 return cpu; 26 } 27 28 public void setCpu(ICPU cpu) { 29 this.cpu = cpu; 30 } 31 32 public IDisplayCard getDisplaycard() { 33 return displaycard; 34 } 35 36 public void setDisplaycard(IDisplayCard displaycard) { 37 this.displaycard = displaycard; 38 } 39 40 //运行 41 public void run() 42 { 43 //cpu 44 this.cpu.command(); 45 //显卡 46 this.displaycard.display(); 47 48 System.out.println("我组装的"+pinpai+"电脑开始运行"); 49 } 50 51 52 public Computer(String pinpai) { 53 super(); 54 this.pinpai = pinpai; 55 } 56 57 58 59 60 61 62 public static void main(String[] args) 63 { 64 65 //组装电脑 66 Computer c1=new Computer("hp"); 67 68 //第一种 69 AMD a1=new AMD(); 70 71 //第二种 匿名类 new AMD() 72 c1.setCpu(a1); 73 74 c1.setDisplaycard(new Ati()); 75 76 c1.run(); 77 78 79 Computer c2=new Computer("华硕"); 80 81 c2.setCpu(new Intel()); 82 83 c2.setDisplaycard(new Nivdia()); 84 85 c2.run(); 86 87 88 // 89 AMD2 a2=new AMD2(); 90 91 Computer c3=new Computer("acer"); 92 93 c3.setCpu(a2); 94 95 c3.setDisplaycard(a2); 96 97 c3.run(); 98 99 System.out.println(); 100 101 AMD3 a3=new AMD3(); 102 103 Computer c4=new Computer("acer"); 104 105 c4.setCpu(a3); 106 107 c4.setDisplaycard(a3); 108 109 c4.run(); 110 111 } 112 113 114 }
1 package org.hanqi.pn0120; 2 3 //CPU接口 4 public interface ICPU { 5 6 //控制 7 public void command(); 8 9 }
1 package org.hanqi.pn0120; 2 3 public interface IDisplayCard { 4 5 //显示 6 public void display(); 7 }
1 package org.hanqi.pn0120; 2 3 public class Intel implements ICPU { 4 5 @Override 6 public void command() { 7 8 9 System.out.println("我是Intel的CPU"); 10 11 } 12 13 }
1 package org.hanqi.pn0120; 2 3 public class AMD implements ICPU { 4 5 @Override 6 public void command() { 7 8 System.out.println("我是AMD的CPU"); 9 10 11 } 12 13 }
1 package org.hanqi.pn0120; 2 3 public class Nivdia implements IDisplayCard { 4 5 @Override 6 public void display() { 7 8 9 System.out.println("我是N卡"); 10 11 } 12 13 }
1 package org.hanqi.pn0120; 2 3 public class Ati implements IDisplayCard { 4 5 @Override 6 public void display() { 7 8 9 System.out.println("我是A卡"); 10 } 11 12 }
1 package org.hanqi.pn0120; 2 3 public interface ICPU2 extends ICPU,IDisplayCard { 4 5 6 public void display(); 7 }
1 package org.hanqi.pn0120; 2 3 public class AMD2 implements ICPU, IDisplayCard { 4 5 @Override 6 public void display() { 7 8 9 System.out.println("AMD的CPU显卡"); 10 } 11 12 @Override 13 public void command() { 14 15 16 System.out.println("AMD的自带显卡的CPU"); 17 18 } 19 20 }
1 package org.hanqi.pn0120; 2 3 public class Intel2 implements ICPU2 { 4 5 @Override 6 public void command() { 7 8 9 10 } 11 12 @Override 13 public void display() { 14 15 16 17 18 } 19 20 }
1 package org.hanqi.pn0120; 2 3 public class AMD3 extends AMD implements IDisplayCard { 4 5 @Override 6 public void display() { 7 8 9 System.out.println("继承了AMD的一代CPU,增加了显卡功能"); 10 } 11 12 }
多态小结: