面向对象—有关Static(静态)的知识
可以使用static关键字声明与类而是不与实例相关的变量,方法或代码块。下面就是有关static关键字常见的用法。 (静态变量,静态方法,静态代码,静态导入)
静态变量: 在编写一个类的时候,实际上就是在描述其对象的行为和属性,只有通过new关键字,系统才会分配内存空间给对象,对象才能被创建。 然而有时用户可能不希望不管有无对象,某些特定的数据就只有一份值,即可以被类而不是对象直接访问。 这样的特定数据即是静态变量。用static修饰的变量叫静态变量,也叫静态成员或叫类的属性。
静态变量有如下注意事项: 1,类中的静态变量属于类,而不属于某个特定的对象。 2,类的静态成员可以与类的名称一起使用,而无须创建类的对象。 3,静态变量或方法也称为类的变量或方法。 4,不管创建了类的多少实例,整个类中静态变量的副本只有一个。 5,引用静态变量时建议使用类名来调用。 6,声明为static的变量实质上就是全局变量
- class Chinese {
- static String country = "china";
- String name;
- int age;
-
- void singOurCuntry() {
- System.out.println("My dear"+country);
- }
- }
-
- public class TestChinese {
- public static void main(String[] args) {
- //通过类名来访问静态变量
- System.out.println(Chinese.country);
- Chinese ch1 = new Chinese();
- //通过对象来访问静态变量,不建议这种做法
- System.out.println(ch1.country);
- ch1.singOurCuntry();
- }
- }
复制代码
静态方法: 有时候,用户也希望能创建这样的一些方法,不通过对象既可以调用这些方法,如:main方法。 像main方法那样被static修饰的方法,叫静态方法。目的是使该方法独立于类的实例,使用类去访问,而不是用类的实例,所以也叫类方法。
静态方法有如下特征: 1,类的静态方法只能访问其他的静态成员,不能访问非静态的成员。 2,静态方法中没有this关键字。 3,静态方法不能被覆盖(重写)为非静态方法。
- class StaticFun {
- static int i = 10; //静态变量
- int j;
-
- static void setValue(int x){ //静态方法
- j = x; //编译出错
- System.out.println(" "+i);
- }
- }
复制代码说明: 静态方法除了局部变量,静态属性及其参数外,无法访问其他任何变量。如果试图访问非静态属性时,会导致编译错误。
静态代码块: 所谓静态代码块,是由static与{}组成的代码片段, 语法为: 静态代码块使用时有如下注意事项: 1,如果需要通过计算机来初始化静态变量,可以声明一个静态块 2,静态块仅在该类被加载时执行一次。 3,只能初始化的静态数据成员。 4,如果类包含多个静态块,则以在类中出现的顺序分别执行。
例:通过定义一个静态代码块来随机生成10个数给一个数元素赋值 - class TryInitialization {
- static int[] values = new int[10];
- static{ //静态语句块
- for(int i = 0;i<values.length;i++){
- values[i] = (int)(100.0*Math.random());
- }
- }
- }
-
- 静态语句可以初始化静态变量,而构造方法也是用来初始化成员变量,在创建对象时,谁的优先级高呢?
- public class TestStatic {
- static{
- System.out.println("我是语句块输出");
- }
- public TestStatic(){
- System.out.println("我是构造器");
- }
- public static void main(String[] args) {
- System.out.println("构造器调用前");
- TestStatic tc = new TestStatic();
- System.out.println("构造器调用后");
- }
- }
复制代码 输出结果: 我是语句块输出 构造器调用前 我是构造器 构造器调用后
静态导入: 如果访问类的静态成员,则必须限定类的引用。 自java SE5.0以后,java语言提供了静态导入功能,用户可以对静态成员进行无限定访问,而无须使用限定类名。 例:要使用Math类中的方法求平方根的值,以前的写法; - import java.lang.Math;
- public class CalDemo {
- public void say(){
- System.out.println("sqrt"+Math.sqrt(5.18));
- }
- }
复制代码用static import的写法: - import static java.lang.Math;;
-
- public class CalDemo {
- public void say(){
- System.out.println("sqrt"+sqrt(5.18));
- }
-
复制代码不过用户如果在代码中方使用次数较少,则不建议使用新用法。如此例,容易引起误解,以为用户定义了一个sqrt()方法。
注意:要有节制的使用静态导入,否则会令程序难以理解和维护,破坏所导入的所有静态成员的命名空间,并破坏程序的可读性
|