1、抽象类和接口的区别
接口是一组规则的集合,它规定了实现本接口的类或接口必须拥有的一组规则。体现了自然界“如果你是……则必须能……”的理念。
“面向接口编程”中的接口是一种思想层面的用于实现多态性、提高软件灵活性和可维护性的架构部件,而具体语言中的“接口”是将这种思想中的部件具体实施到代码里的手段。
如果单从具体代码来看,对这两个概念很容易模糊,甚至觉得接口就是多余的,因为单从具体功能来看,除多重继承外(C#,Java中),抽象类似乎完全能取代接口。但是,难道接口的存在是为了实现多重继承?当然不是。抽象类和接口的区别在于使用动机。使用抽象类是为了代码的复用,而使用接口的动机是为了实现多态性。所以,如果你在为某个地方该使用接口还是抽象类而犹豫不决时,那么可以想想你的动机是什么。
使用接口暴露公共的方法,使用抽象类来提供公共的实现
2、单例模式和全局静态变量(类)的区别
单例的特点:
保证某类只存在唯一实例。
该类本身完成自身的初始化。
获取该唯一实例的方式非常明确,可以通过该类本身定义的静态方法getInstance()获取该类的唯一实例引用。
单例可以被延迟初始化,静态类一般在第一次加载是初始化
静态变量定义某类的实例引用特点:
该类的实例引用的静态变量可定义在任何文档类当中。
获取该类的实例引用的静态变量,可以通过定义该静态变量的类名通过点语法进行访问该引用。
任何位置可以对该静态变量进行重新赋值。
单例模式也就是静态变量方式创建一个类的实例引用所带来的缺陷的改善
3、为什么要使用工厂设计模式
在这里,可以举出一些复杂的例子。
假设有代码包A和代码包B,
代码包B是代码包A的调用者,A向B暴露接口InterfaceA。
在A的内部结构中,实现了InterfaceA的有ClassA1,ClassA2,ClassA3,……ClassA100。
但是B并不关心这些,因为对于B来说,A的功能只有一个,就是InterfaceA。
这个时候,B想要使用一个InterfaceA的实现,想要new一个出来,
但又不想与代码包A中的复杂的构造逻辑耦合,怎么办?
只能向代码包A中传递参数,交给代码包A自己选择到底是那个ClassA1还是A100被new出来。
而这个对构造过程进行选择的逻辑,就是工厂。
当然了,我这里举的例子是InterfaceA,你也可以用AbstractClassA之类的。
工厂在这里面起的作用,就是隐藏了创建过程的复杂度,以配合InterfaceA对那一百个子类的复杂度进行隐藏,这样B只要知道上转型之后的InterfaceA即可,简单清晰。
用了工厂模式,也就是强制使用interface方法,
另外可以应对这种情况,你哪天心情好把类名改了。或者把构造函数参数改了(增加或减少参数)。而代码中又有N处new了这个类。如果你又没用工厂。一个一个找来改吧。
4、java Map及Map.Entry详解
Map是Java中的接口,Map.Entry是Map的一个内部接口。
Map提供了一些常用方法,如keySet()、entrySet()等方法,keySet()方法返回值是Map中key值的集合;entrySet()的返回值也是返回一个Set集合,此集合的类型为Map.Entry。
Map.Entry是Map声明的一个内部接口,此接口为泛型,定义为Entry<K,V>。它表示Map中的一个实体(一个key-value对)。接口中有getKey(),getValue方法。
封装:
封装是为了屏蔽实现,就是我们不需要这个功能是怎样实现的,只要我们知道它的功能,能够干什么,我们直接拿来用就可以了,private修饰成员变量,可以这样理解,就是你自己有一个年龄,而你的年龄不想让任何人都知道,如果想要知道你的名字,那么就要通过一个方法,而这个方法你可以想成是你是否认识这个人,而这个认识你的方法你不需要管它是怎去实现的。
synchronized修饰静态方法和非静态方法的区别?
多线程环境下若使用HashMap需要使用Collections.synchronizedMap()方法来获取一个线程安全的集合
2个字节,可以
官方网站寻找xml配置文件和java代码,执行即可