今天突然被同学问到一个小问题:Java中有两个方法,其中两个方法的名称、返回值、参数列表都相同,但有一个带有static,有一个不带,那这两个方法属于方法重载吗?遇到这个问题,我首先想到的是一个方法属于类,一个方法属于对象,而且方法重载主要看参数列表的类型或数量,所以第一印象是这两个方法不属于方法重载。但心里没底,回到实验室编写一下程序看一下,结果是不合法,无语中。。。
public class Demo02 {
public int sum(int i,int j){
int sum=0;
sum=i+j;
return sum;
}
public static int sum(int i,int j){
int sum=0;
sum=i+j;
return sum;
}
}
错误提示:Duplicate method sum(int, int) 重复定义方法sum(int,int)
首先解释一下Java中static的作用:
static表示“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,被static修饰的成员变量和成员方法独立于该类的任何对象,也就是说,它不依赖类特定的实例,被类的所有实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内找到它们。对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态变量分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问,当然也可以通过对象来访问(但是这是不推荐的)。对于实例变量,每创建一个对象,就会为实例变量分配一次内存,实例变量可以再内存中有多个拷贝,互不影响(灵活)。
所以一般在需要实现以下两个功能时使用静态变量:
1、在对象之间共享值时
2、方便访问变量时
静态方法可以直接通过类名调用,任何实例对象也都可以调用,因此静态方法中不能用this和super关键字。因为static方法独立于任何实例,因此,static和abstract不能一起使用。
下面解释一下方法重载:
方法重载表示两个方法的方法名称相同,但参数的类型或数量必须是不同的。虽然每个重载方法可以有不同的返回值类型,但返回值类型并不足以区分所使用的是哪个方法。当Java调用一个重载方法时,参数与调用参数匹配的方法被执行。方法重载是Java实现多态性的一种方法。