回复:null是什么数据类型

例1

码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Test2 {
  public void method(Object o) {
    System.out.println("Object Version");
  }
  
  public void method(String s) {
    System.out.println("String Version");
  }
  
    
  public static void main(String[] args) {
    Test2 test = new Test2();
    test.method(null);
  }
}

编译通过了,而且运行时也没有错误,问题是null到底是什么数据类型,或者说java如何进行转型的 
 

答  

1. String   是 Object 的子类 。所以函数在调用时优先选择作为子类的String。 运行结果是String Version。

2. 若没有返回为String 的 test 函数,则函数调用 超类 的Object 对象。 运行结果为Object Version。

例2

Q. How does Java compiler resolve the ambiguity to decide which methods to call?
A:
In the following example, four test() methods, if we pass ambiguous /b{null} to the test, which one should (will) be called? The 3 on top has super/subclass/sub-subclass relationship. The most specific one (down hierarchy) will be called. The 4th with String as a parameter, but it is a sibling of Tester. Ambiguity compile time error results.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Tester { 
  void test(Object s)    { System.out.println ("Object version");    } 
  void test(Tester s)    { System.out.println ("Tester version");    } 
  void test(SubTester s) { System.out.println ("SubTester version"); } 
 
  // Not compilable any more if you uncomment the line 
  // since String and Tester are siblings
  // void test(String s) { System.out.println ("String version"); } 
 
  public static void main (String args[]) { 
    Tester c = new Tester (); 
    // Ambiguous, the most specific one which fit will be call
    c.test (null);         // SubTester version 
    c.test (new Object()); // Object version 
  } 
} 
 
class SubTester extends Tester{ 
} 

 c.test (null);

即 test 在调用函数时优先选择作为子类的子类的 SubTester   所以运行结果是SubTester version。

例3

public class Test2 {
 
        public void method(Object o) {
                System.out.println("Object Version");
        }
        public void method(String s) {
                System.out.println("String Version");
        }
        public void method(StringBuffer s) {
                System.out.println("StringBuffer Version");
        }
               
        public static void main(String[] args) {
                Test2 test = new Test2();
                Object o = new Object();
                test.method((Object)null);
                test.method(null);
        }
} 

那么第一个method方法是会打出object version的,而第二个method则会出现编译错误,这又是怎么回事呢?

很明显,String s  与 StringBuffer s   都是Object 的子类,地位相同,所以造成冲突。

 

同理 在例2 中加入void test( String s) {System.out.println("String Version");}

也会引起冲突,造成编译错误

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值