黑马程序员技术交流社区

标题: 面向对象—有关static(静态)的知识 [打印本页]

作者: 就是我的猫    时间: 2015-11-21 14:55
标题: 面向对象—有关static(静态)的知识
                 面向对象—有关Static(静态)的知识

   可以使用static关键字声明与类而是不与实例相关的变量,方法或代码块。下面就是有关static关键字常见的用法。
 (静态变量,静态方法,静态代码,静态导入)

静态变量:
   在编写一个类的时候,实际上就是在描述其对象的行为和属性,只有通过new关键字,系统才会分配内存空间给对象,对象才能被创建。
   然而有时用户可能不希望不管有无对象,某些特定的数据就只有一份值,即可以被类而不是对象直接访问。
   这样的特定数据即是静态变量。用static修饰的变量叫静态变量,也叫静态成员或叫类的属性。

  静态变量有如下注意事项:
      1,类中的静态变量属于类,而不属于某个特定的对象。
      2,类的静态成员可以与类的名称一起使用,而无须创建类的对象。
      3,静态变量或方法也称为类的变量或方法。
      4,不管创建了类的多少实例,整个类中静态变量的副本只有一个。
      5,引用静态变量时建议使用类名来调用。
      6,声明为static的变量实质上就是全局变量

  1. class Chinese { 
  2.  static String country = "china";
  3.  String name;
  4.  int age;

  5. void singOurCuntry() {
  6. System.out.println("My dear"+country);
  7. }
  8. }

  9. public class TestChinese {
  10. public static void main(String[] args) {
  11. //通过类名来访问静态变量
  12. System.out.println(Chinese.country);
  13. Chinese ch1 = new Chinese();
  14. //通过对象来访问静态变量,不建议这种做法
  15. System.out.println(ch1.country);
  16. ch1.singOurCuntry();
  17. }
  18. }
复制代码



静态方法:
    有时候,用户也希望能创建这样的一些方法,不通过对象既可以调用这些方法,如:main方法。
     像main方法那样被static修饰的方法,叫静态方法。目的是使该方法独立于类的实例,使用类去访问,而不是用类的实例,所以也叫类方法。

   静态方法有如下特征:
      1,类的静态方法只能访问其他的静态成员,不能访问非静态的成员。
      2,静态方法中没有this关键字。
      3,静态方法不能被覆盖(重写)为非静态方法。

  1. class StaticFun {
  2.   static int i = 10; //静态变量
  3.   int j;
  4.   
  5.   static void setValue(int x){ //静态方法
  6.   j = x; //编译出错
  7.   System.out.println(" "+i);
  8.   }
  9. }
复制代码
说明:
静态方法除了局部变量,静态属性及其参数外,无法访问其他任何变量。如果试图访问非静态属性时,会导致编译错误。


静态代码块:
   所谓静态代码块,是由static{}组成的代码片段,
    语法为: 
  1. static{
  2.         //静态代码块
  3.    }
复制代码
     静态代码块使用时有如下注意事项:
     1,如果需要通过计算机来初始化静态变量,可以声明一个静态块
     2,静态块仅在该类被加载时执行一次。
     3,只能初始化的静态数据成员。
     4,如果类包含多个静态块,则以在类中出现的顺序分别执行。

例:通过定义一个静态代码块来随机生成10个数给一个数元素赋值
  1. class TryInitialization {
  2. static int[] values = new int[10];
  3. static{ //静态语句块
  4. for(int i = 0;i<values.length;i++){
  5. values[i] = (int)(100.0*Math.random());
  6. }
  7. }
  8. }

  9. 静态语句可以初始化静态变量,而构造方法也是用来初始化成员变量,在创建对象时,谁的优先级高呢?
  10. public class TestStatic {
  11. static{
  12. System.out.println("我是语句块输出");
  13. }
  14. public TestStatic(){
  15. System.out.println("我是构造器");
  16. }
  17. public static void main(String[] args) {
  18. System.out.println("构造器调用前");
  19. TestStatic tc = new TestStatic();
  20. System.out.println("构造器调用后");
  21. }
  22. }
复制代码
     输出结果:
        我是语句块输出
       构造器调用前
       我是构造器
        构造器调用后



静态导入:
  如果访问类的静态成员,则必须限定类的引用。
  自java SE5.0以后,java语言提供了静态导入功能,用户可以对静态成员进行无限定访问,而无须使用限定类名。
例:要使用Math类中的方法求平方根的值,以前的写法;
  1. import java.lang.Math;
  2. public class CalDemo {
  3. public void say(){
  4. System.out.println("sqrt"+Math.sqrt(5.18));
  5. }
  6. }
复制代码
static import的写法:
  1. import static java.lang.Math;;

  2. public class CalDemo {
  3. public void say(){
  4. System.out.println("sqrt"+sqrt(5.18));
  5. }


复制代码
不过用户如果在代码中方使用次数较少,则不建议使用新用法。如此例,容易引起误解,以为用户定义了一个sqrt()方法。

注意:要有节制的使用静态导入,否则会令程序难以理解和维护,破坏所导入的所有静态成员的命名空间,并破坏程序的可读性


作者: 哥德曼的    时间: 2015-11-30 23:52
加油啊
作者: 就是我的猫    时间: 2015-12-1 13:54
哥德曼的 发表于 2015-11-30 23:52
加油啊

谢谢
作者: 金金金小天    时间: 2015-12-1 16:06
新手报到,请多关照。
作者: 哥德曼的    时间: 2015-12-1 23:55
就是我的猫 发表于 2015-12-1 13:54
谢谢

哈哈哈哈




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2