标签:
------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流!
面向对象—有关static(静态)的知识
可以使用static关键字声明与类而是不与实例相关的变量,方法或代码块。
静态变量:
在编写一个类的时候,实际上就是在描述其对象的行为和属性,只有通过new关键字,系统才会分配内存空间给对象,对象才能被创建。
然而有时用户可能不希望不管有无对象,某些特定的数据就只有一份值,即可以被类而不是对象直接访问。
这样的特定数据即是静态变量。用static修饰的变量叫静态变量,也叫静态成员或叫类的属性。
静态变量有如下注意事项:
1,类中的静态变量属于类,而不属于某个特定的对象。
2,类的静态成员可以与类的名称一起使用,而无须创建类的对象。
3,静态变量或方法也称为类的变量或方法。
4,不管创建了类的多少实例,整个类中静态变量的副本只有一个。
5,引用静态变量时建议使用类名来调用。
6,声明为static的变量实质上就是全局变量
1 class Chinese { 2 3 static String country = "china"; 4 5 String name; 6 7 int age; 8 9 10 11 void singOurCuntry() { 12 13 System.out.println("My dear"+country); 14 15 } 16 17 } 18 19 20 21 public class TestChinese { 22 23 public static void main(String[] args) { 24 25 //通过类名来访问静态变量 26 27 System.out.println(Chinese.country); 28 29 30 31 Chinese ch1 = new Chinese(); 32 33 //通过对象来访问静态变量,不建议这种做法 34 35 System.out.println(ch1.country); 36 37 ch1.singOurCuntry(); 38 39 } 40 41 } 42 43
静态方法:
有时候,用户也希望能创建这样的一些方法,不通过对象既可以调用这些方法,如:main方法。
像main方法那样被static修饰的方法,叫静态方法。目的是使该方法独立于类的实例,使用类去访问,而不是用类的实例,所以也叫类方法。
静态方法有如下特征:
1,类的静态方法只能访问其他的静态成员,不能访问非静态的成员。
2,静态方法中没有this关键字。
3,静态方法不能被覆盖(重写)为非静态方法。
1 class StaticFun { 2 3 static int i = 10; //静态变量 4 5 int j; 6 7 8 9 static void setValue(int x){ //静态方法 10 11 j = x; //编译出错 12 13 System.out.println(" "+i); 14 15 } 16 17 }
说明:静态方法除了局部变量,静态属性及其参数外,无法访问其他任何变量。如果试图访问非静态属性时,会导致编译错误。
静态代码块:
所谓静态代码块,是由static与{}组成的代码片段,
语法为:
1 static{ 2 3 //静态代码块 4 5 }
静态代码块使用时有如下注意事项:
1,如果需要通过计算机来初始化静态变量,可以声明一个静态块
2,静态块仅在该类被加载时执行一次。
3,只能初始化的静态数据成员。
4,如果类包含多个静态块,则以在类中出现的顺序分别执行。
例:通过定义一个静态代码块来随机生成10个数给一个数元素赋值
1 class TryInitialization { 2 3 static int[] values = new int[10]; 4 5 static{ //静态语句块 6 7 for(int i = 0;i<values.length;i++){ 8 9 values[i] = (int)(100.0*Math.random()); 10 11 } 12 13 } 14 15 } 16 17
静态语句可以初始化静态变量,而构造方法也是用来初始化成员变量,在创建对象时,谁的优先级高呢?
1 public class TestStatic { 2 3 static{ 4 5 System.out.println("我是语句块输出"); 6 7 } 8 9 public TestStatic(){ 10 11 System.out.println("我是构造器"); 12 13 } 14 15 public static void main(String[] args) { 16 17 System.out.println("构造器调用前"); 18 19 TestStatic tc = new TestStatic(); 20 21 System.out.println("构造器调用后"); 22 23 } 24 25 }
输出结果:
我是语句块输出
构造器调用前
我是构造器
构造器调用后
静态导入:
如果访问类的静态成员,则必须限定类的引用。
自java SE5.0以后,java语言提供了静态导入功能,用户可以对静态成员进行无限定访问,而无须使用限定类名。
例:要使用Math类中的方法求平方根的值,以前的写法;
1 import java.lang.Math; 2 3 public class CalDemo { 4 5 public void say(){ 6 7 System.out.println("sqrt"+Math.sqrt(5.18)); 8 9 } 10 11 }
用static import的写法:
1 import static java.lang.Math;; 2 3 public class CalDemo { 4 5 public void say(){ 6 7 System.out.println("sqrt"+sqrt(5.18)); 8 9 } 10 }
不过用户如果在代码中方使用次数较少,则不建议使用新用法。如此例,容易引起误解,以为用户定义了一个sqrt()方法。
注意:要有节制的使用静态导入,否则会令程序难以理解和维护,破坏所导入的所有静态成员的命名空间,并破坏程序的可读性
-----------android培训、java培训、java学习型技术博客、期待与您交流!------------
黑马程序员——Java基础---有关static(静态)的知识
标签:
原文地址:http://www.cnblogs.com/hmchengxuyuan/p/4983803.html