通常提供API函数的时候,会实现多种参数类型,比如:log4j里面获取log对象,可以传string,当然也可以更方便的传class进去自动转string
- public static Logger getLogger(String name)
- {
- return LogManager.getLogger(name);
- }
- public static Logger getLogger(Class clazz)
- {
- return LogManager.getLogger(clazz.getName());
- }
public static Logger getLogger(String name)
{
return LogManager.getLogger(name);
}
public static Logger getLogger(Class clazz)
{
return LogManager.getLogger(clazz.getName());
}
1.下面这个例子重载了参数类型为Object, 我们调用的时候传入一个String参数,既满足Object又满足String,结果会如何呢?
- public class Overload {
- public static void log(Object o) {
- System.out.println(”log -object”);
- }
- public static void log(String o) {
- System.out.println(”log -string”);
- }
- public static void main(String[] args) {
- log(”how”);
- }
- }
public class Overload {
public static void log(Object o) {
System.out.println("log -object");
}
public static void log(String o) {
System.out.println("log -string");
}
public static void main(String[] args) {
log("how");
}
}
//输出 log -string
2. 那么下面改掉调用的方法,new出一个String的Object对象来,结果如何呢?
- public static void main(String[] args) {
- Object a = new String(“xx”);
- log(a);
- }
public static void main(String[] args) {
Object a = new String("xx");
log(a);
}
//输出 log -object
3.好吧,如果不强制指定类型为Object呢?
- public static void main(String[] args) {
- log(new String(“xx”));
- }
public static void main(String[] args) {
log(new String("xx"));
}
//输出 log -string
总结:在提供Object类型重载的时候,函数还是会根据继承树从下往上找对应的重载实现。
提供Object类型参数的好处也是明显的,否则 log(Long l),log(Byte b)就全得实现一次了(当然固定类型也是推荐全部实现的,但是对于程序中自定义的类就不好办了,无法提供默认操作)
看String的valueOf函数就重载了Object参数:
- public static String valueOf(Object obj)
- {
- return obj != null ? obj.toString() : “null”;
- }
public static String valueOf(Object obj)
{
return obj != null ? obj.toString() : "null";
}