前言
第一次看到在Java中可以通过类实例调用静态方法,当然不推荐这么做,避免出现意想不到的问题,接下来会讲到,但是在C#中通过类实例调用静态方法在编译时就不会通过,这里做下记录。
类实例调用静态方法
首先我们来看一个简单的例子说明为何不能通过类实例调用静态方法,我们知道未实例化的对象去调用对应方法或者字段时会抛出空指针异常,比如如下:
public static void main(String[] args) { Object o = null; System.out.println(o.toString()); }
但是若将其应用到静态方法上则会出现意想不到的问题,比如如下例子:
public class Player { public static final String type = "Human"; private int age; public static String getType() { return type; } public int getAge() { return age; } }
public static void main(String[] args) { Player player = null; System.out.println(player.getType()); System.out.println(player.getAge()); }
上述对象并未实例化,但是调用其变量的静态方法却不会抛出异常并能打印出结果,当然答案也很简单,因为静态方法是属于类而非类实例,所以上述调用 player.getType() 本质上肯定是调用 Player.getType() 。
总结
在Java中通过类实例可以调用静态方法可能是在最初设计时所产生的缺陷,当然,这只是我个人的揣测,没有再过多深究,看到居然编译不出错而且可以正常运行,认为这一点和C#有很大的区别,故此记录总结下。