由于是刚开始学习java,有些地方可能理解的不对,错误的地方希望大家留言指正,交流。
java中的static关键字使用来修饰类中的成员,包括成员变量,成员方法。
例如:
------------------------------------------------------------------------------------------------------------------
static 修饰成员变量
public static final double PI = 3.14159265358979323846; //Math类中的成员变量:π
补充一点:
final修饰符修饰的变量是常量,不可修改。
java中的常量有字面值常量,另一种就是自定义常量,这里的PI就i是自定义常量,通常要大写,多个单词用_隔开
--------------------------------------------------------------------------------------------------------------------
static 修饰成员方法
public static double sin(double a) { //Math类中的成员方法:正弦函数
return StrictMath.sin(a);
}
用static修饰的成员变量或者成员方法不需要创建对象调用,用类名可以直接调用
例如:
double r = 2.0;
double zc = 2*r*Math.PI; //这里直接用Math(类名)"."调用了PI,求圆的周长
下面用Math的sin()方法求一下30°角的正弦值
System.out.println(Math.sin((double)30/180*Math.PI));
//打印的结果是0.49999999999999994,sin30°的结果应该是0.5,这里的结果应该是PI定义的只是π的部分,所以是一个近似值,个人理解,如果不对请吊大的指正一下。这里就是直接用Math(类名)"."调用了sin(double a) 方法
当然创建对象也是可以调用静态成员变量和方法的,但用一般都用类名直接调用。
*补充:这里一定会有人去创建Math对象然后想用Math对象去调用静态成员和方法,会发现Math对象创建的时候报错,这是因为Math类是一个工具类,它的构造方法被私有化了,所以没办法实例化,java不想让你实例化Math类,你也不用实例化,用类名调用即可。
写了这些还没有写为什么要使用static关键字呢?或者说使用static关键字有什么作用?
被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。
只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。
用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它类的对象时,不生成static变量的副本,而是类的所有实例共享同一个static变量。
上面这几句话是引用了一篇博客中的,解释的比较清楚,所以直接拿过来了。博客地址:http://www.cnblogs.com/beanmoon/archive/2012/04/25/2470298.html总的来说就是static修饰的成员变量和成员方法是随着类的的加载而加载的,创建对象之前就已经加载过了,所以他是所有这个类的对象所共享的。
类的加载实在内存的方法区中的,类中又有静态区域和非静态区域,静态区域是随着类的加载就已经加载了,非静态的区域是实例化对象的时候在栈和堆中加载的,感觉讲的不太清楚这里,下面举个例子:
public class Test {
public static void main(String[] args) {Chinese.gj = "地球";
Chinese c = new Chinese();
}
}
class Chinese {
static String gj = "中国";
}
定义了一个Chinese类,类里面有一个国籍成员变量,默认初始值是中国,因为中国人的国籍都是中国,所以用static修饰,以后全球一家亲了,就把国籍改成地球,那么所有Chinese类的对象国籍就都变成地球了,这段代码在内存中是这样的
-----在方法区中加载Test类-----main方法进栈-----在内存方法区中加载Chinese类,此时国籍是中国----在Chinese类内部的静态区域将国籍修改为地球-----在栈中加载一个Chinese类型的c引用-----在堆中创建一块内存,c引用只想这块内存
由此看出修饰的成员是在创建类对象之前就已经加载好了。
静态方法
可以调用静态的成员变量
可以调用静态的成员方法
不可以调用非静态的成员变量
不可以调用非静态的成员方法
只能在静态的方法中调用静态的成员
非静态方法
可以调用静态的成员变量
之前讲了静态成员的加载过程这里就不难理解了,静态方法是不可以调用非静态的成员的,只能调用静态的成员。因为静态是在创建对象之前就已经可以使用了,而非静态的成员是要等对象创建完成之后才能使用,所以java虚拟机肯定不会让你调用的,会报错,毕竟什么事情都有个先来后到,哈哈。先写到这里把,感觉要把一个知识讲透彻好累,如果有什么问题欢迎留言,我也是才开始学习java,希望共同进步。