Java中学习笔记------static关键字

来源:互联网 发布:行知外国语学校电话 编辑:程序博客网 时间:2024/06/05 16:58

由于是刚开始学习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,希望共同进步。