我们知道static是静态修饰符,在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的,而被static修饰的代码会在编译时就被分配内存,程序退出时才会释放其内存,也就是说,只要程序还在运行内存就一直存在。为什么Java中的函数方法都需要static来修饰才能直接调用呢?
public class s917 {
public static void main(String[] args) {
System.out.println("the square of integer 7 is"+square(7));
System.out.println("\nThe square of double 7.1 is "+square(7.1));
}
public static int square(int x) {
return x*x;
}
public static double square(double y) {
return y*y;
}
}
以上代码在编译运行时是正确的,但当我们把两个square函数方法的修饰符static删除时,编译器会给我们报错:不能对类型 s917(主类名) 中的非静态方法 square(double)进行静态引用。
于是我上csdn社区搜索了“Java中static的作用”
从中筛选到了一条这样的信息“在Java程序里面,所有的东西都是对象,而对象的抽象就是类,对于一个类而言,如果要使用他的成员,那么普通情况下必须先实例化对象后,通过对象的引用才能够访问这些成员,但是有种情况例外,就是该成员是用static声明的(在这里所讲排除了类的访问控制)”
于是我想到,主类不也是类的一种吗?我在删除static的基础上做了一些小小的更改,即实例化s917的对象,就有了以下代码:
public class s917 {
public static void main(String[] args) {
s917 num=new s917();
Scanner sr=new Scanner(System.in);
Random r=new Random();
System.out.println("the square of integer 7 is"+num.square(7));
System.out.println("\nThe square of double 7.1 is "+num.square(7.1));
}
public int square(int x) {
return x*x;
}
public double square(double y) {
return y*y;
}
}
这回运行的结果与初版的结果完全一致,印证了我的思考。在Java中所有的都是类,我们不能下意识忽略主类也是类的特性,static的修饰让类中的成员可以通过成员名进行直接调用,而省去实例化的繁杂过程。没有static的修饰,那我们在调用类方法和类变量的时候就需要先对对应的类进行实例化,在通过对象来调用所需的代码。