Java面向对象:static静态属性/方法/代码块

Java - static关键字

Static修饰类的属性或方法

  • 实例属性,是每个对象各自持有的独立内存空间(多份),对象单方面修改,不会影响其他对象。
  • 静态属性,static 修饰的实例属性,为。静态属性,是整个类共同持有的共享空间(一份),任何对象修改,都会影响其他对象。

Java中规定:不能将方法体内的局部变量声明为 static!

静态属性:类属性
静态方法:类方法
不必创建对象,可直接通过类名访问【推荐】:类名.静态成员

public class TestStaticField {
      public static void main(String[] args) {
            MyClass mc1 = new MyClass();
            mc1.a = 10;
            //mc1.b = 100;
            MyClass.b = 100;
            
            MyClass mc2 = new MyClass();
            mc2.a = 20;
            //mc2.b = 200;
            MyClass.b = 200;
            System.out.println(mc1.a + " " + mc2.a);
            System.out.println(MyClass.b + " " + MyClass.b);
            System.out.println();
            mc1.method2();
            System.out.println();
            mc2.method2();
      }
}
/**
* 类的信息:类的名字com.day16.t1_static.MyClass
* 父类是谁:java.lang.Object
* 实例属性:int a = 0
* 静态属性:int b = 0; double PI = 3.14;
* 实例方法:xxx
* 静态方法:xxx
* 类的创建时间:xxxx-xx-xx xx:xx:xx
* 类的编译JDK版本:JDK 8.xx.xx(主版本号.次版本号)
* 类的加密:MD5 checksum
*/
class MyClass {
      int a; // 实例属性
      static int b; // 静态属性
      static double PI = 3.14; // 静态属性(赋初始值)
      public static void method1() {
            System.out.println("method1()...");
      }
      
      public void method2() {
            //System.out.println(MyClass.a);
            System.out.println(MyClass.b);
            System.out.println(MyClass.PI);
            MyClass.method1();
      }
}
/* 输出:
10 20
200 200
200
3.14
method1()...
200
3.14
method1()...
*/
// 统计一个类被创建的次数
public class TestApplyStaticField {
    public static void main(String[] args) {
        Student[] stus = new Student[10];
        
        for (int i = 0; i < stus.length; i++) {
            stus[i] = new Student();
        }
        
        System.out.println("count最终值:" + Student.getCount()); //10
    }
}


class Student {
    private static int count = 0;
    
    public Student() {
        count++;
    }
    
    public static int getCount() {
        return count;
    }
}

如这几个常见的静态方法,均使用类名直接调用
Arrays.copyOf();
Arrays.sort();
Math.random();
Math.sqrt();

  • 静态方法规则:
  1. 静态方法允许直接访问静态成员(不需要this.);
  2. 静态方法不允许直接访问非静态成员;
  3. 静态方法中不允许使用this或super关键字;
  4. 静态方法可以继承,不能重写(覆盖)、没有多态;
  • static静态代码块
    在执行类时,希望先执行的初始化动作,可以使用static定义一个静态代码区域,在类加载时即会被执行仅有的一次。
    语法:
public class example {
    // 静态代码块:主要用于类执行前的一些初始化
    static {
        // do some init things.
    }
}

类加载

JVM首次使用某个类时,需通过CLASSPATH查找该类的.class文件
将.class文件中对类的描述信息加载到内存中,进行保存
如:包名、类名、父类、属性、方法、构造方法...
即:对一个类而言,加载的操作只做一次。

  • 加载时机:
  1. 创建对象
  2. 创建子类对象
  3. 访问静态属性
  4. 调用静态方法
  • 调用类加载语法
Class.forName("全限定名");
  • 类加载时:
    触发:静态属性和静态代码块的执行 - (仅1次)
    顺序:静态属性初始化之后执行静态代码块
    作用:可谓静态属性赋值,或必要的初始化行为
public class TestClassLoad {
      public static void main(String[] args) throws Exception {
            //new Super();
            //Super.method();
            //System.out.println("------------------------------------");
            //Super.method();
            //System.out.println("------------------------------------");
            //Class.forName("com.day16.t3_classloaded.Super"); // 静态属性, 静态代码块 (优先执行,且只执行1次)
            
            Class.forName("com.day16.t3_classloaded.Sub");
            System.out.println("------------------------");
            new Sub();
            System.out.println("************************");
            new Sub();
      }
}
//调用顺序: ↓↓↓
class Super {
   // 1.1静态属性(类层面:仅加载类时执行一次,归类所有,非对象所有)
   static String field2 = "父类静态属性";
   
   // 1.2静态代码块(类层面:仅加载类时执行一次,归类所有,非对象所有)
   static {
         System.out.println(field2);
         System.out.println("父类静态代码块");
   }
   // ----------------------父类执行顺序分割线--------------------------
   // 3.实例属性(创建对象时执行)
   String field1 = "父类实例属性";
   // 4.动态代码块(创建对象时执行)
   {
         System.out.println(field1);
         System.out.println("父类动态代码块");
   }
   
   // 5.无参构造方法(创建对象时执行)
   public Super() {
         super();
         System.out.println("父类无参构造方法");
   }
   // 6.类中静态方法(可被类名直接调用,可执行多次)
   public static void method() {
         System.out.println("父类类中的静态方法");
   }
}

class Sub extends Super {
   // 2.1静态属性(类层面:仅加载类时执行一次,归类所有,非对象所有)
   static String subfield2 = "子类静态属性";
   // 2.2静态代码块(类层面:仅加载类时执行一次,归类所有,非对象所有)
   static {
         System.out.println(subfield2);
         System.out.println("子类静态代码块");
   }
   // 7.实例属性(创建对象时执行)
   String subfield1 = "子类实例属性";
   // 8.动态代码块(创建对象时执行)
   {
         System.out.println(subfield1);
         System.out.println("子类动态代码块");
   }
   // 9.无参构造方法(创建对象时执行)
   public Sub() {
         super();
         System.out.println("子类无参构造方法");
   }
   // 10.类中静态方法(可被类名直接调用,可执行多次)
   public static void submethod() {
         System.out.println("子类类中的静态方法");
   }
}
/* 输出:
父类静态属性
父类静态代码块
子类静态属性
子类静态代码块
------------------------
父类实例属性
父类动态代码块
父类无参构造方法
子类实例属性
子类动态代码块
子类无参构造方法
************************
父类实例属性
父类动态代码块
父类无参构造方法
子类实例属性
子类动态代码块
子类无参构造方法
*/

static静态属性/方法/代码块进行一个小结:
(1)特点
1、static是一个修饰符,static修饰的成员变量称之为静态变量或类变量。
2、static修饰的成员被所有的对象共享。
3、static优先于对象存在,因为static的成员随着类的加载就已经存在。
4、static修饰的成员多了一种调用方式,可以直接被类名所调用(类名.静态成员)。
5、static修饰的数据是共享数据,对象中的存储的是特有的数据。
(2)成员变量和静态变量的区别
1、生命周期的不同:
成员变量随着对象的创建而存在随着对象的回收而释放。
静态变量随着类的加载而存在随着类的消失而消失。
2、调用方式不同:
成员变量只能被对象调用。
静态变量可以被对象调用,也可以用类名调用。(推荐用类名调用)
3、别名不同:
成员变量也称为实例变量。
静态变量称为类变量。
4、数据存储位置不同:
成员变量数据存储在堆内存的对象中,所以也叫对象的特有数据。
静态变量数据存储在方法区(共享数据区)的静态区,所以也叫对象的共享数据。
(3)静态使用时需要注意的事项
1、静态方法只能访问静态成员(非静态既可以访问静态,又可以访问非静态)。
2、静态方法中不可以使用this或者super关键字。
3、主函数是静态的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353