多态
1. 示例
private Map<String, Map<String, String>> configMap = new HashMap<String, Map<String, String>>();
List<String> keyList = new ArrayList<String>(dataMap.keySet());
Collections.sort(keyList);
Map.Entry<String, String> entry : Map<String, String> map.entrySet()
示例2:
定义一个接口类型的引用变量 来 引用实现接口的类的实例,当这个引用调用方法时,
它会根据实际引用的类的实例来判断具体调用哪个方法。
该方法必须已经在接口中被声明,而且在接口的实现类中该实现方法的类型和参数必须与接口中所定义的精确匹配。
//定义接口InterA
interface InterA { void fun(); }
//实现接口InterA的类B
class B implements InterA { public void fun() {System.out.println(“This is B”); }
//实现接口InterA的类C
class C implements InterA { public void fun() {System.out.println(“This is C”); } }
//主类main
class Test { public static void main(String[] args) { InterA a; a= new B(); a.fun(); a = new C(); a.fun(); }}
示例
设计模式中有:“代码尽量依赖于抽象,不依赖于具体.代码依赖于抽象的好处是,代码可以方便替换。
例如,代码
List list = new ArrayList();下面通过list来操作集合。代码编写后发现集合使用的不准确,
应该使用LinkedList,那么只要修改一行代码
List list = new LinkedList();就可以,这行以后的代码不需要修改,
因为List接口保证了调用的都是接口中的方法,而ArrayList与LinkedList都实现了List接口
说明:
01.ArrayList list = new ArrayList()这种形式的话,
那么list访问到的就可能是ArrayList里独有的方法而非List接口中的方法。
这样替换成LinkedList的时候就有可能需要修改很多的代码
02.因为存放在ArrayList里的值都转换成了Object类型,
所以 使用ArrayList内部的值时,必须强制转换才行
List<String> list = new ArrayList<String>();
List<String> list = (String)new ArrayList(); 强制类型转换
Java中类型转换
Java中强制类型转换分为基本数据类型和引用数据类型两种
1.基本数据类型:
01.自动类型转换,也称隐式类型转换
02.强制类型转换,也称显式类型转换,是指必须书写代码才能完成的类型转换。
该类类型转换很可能存在精度的损失,
所以必须书写相应的代码,并且能够忍受该种损失时才进行该类型的转换
2.引用类型的强转
父类转换为子类的强制类型转换是有条件的:
父类强制转换为子类时只有当引用类型真正的身份为子类时才会强制转换成功
Father father = new Son(); 不报错
Son son = (Son)father;
Father father = new Father(); 报错-ClassCastException
Son son = (Son) father;
Father father = null ;
Son son = (Son) father;