Java: static的使用
Posted 一只敲码的猫
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java: static的使用相关的知识,希望对你有一定的参考价值。
static表示“静态”或者“全局”的意思,但在Java中不能在所有类之外定义全局变量,只能通过在一个类中定义公用、静态的变量来实现一个全局变量。
一、静态变量
1. Java中存在两种变量,一种是static修饰的静态变量,又称为类变量。另一种是没有被static修饰的变量,称为实例变量。
2. 被static修饰的成员变量或成员方法独立于该类的任何对象(实例),被所有类对象共享。如果一个实例对象对静态成员变量做了修改,其他实例对象访问该静态成员变量也会受到影响。
1 package com.huiAlex; 2 3 public class Cat { 4 private String name; 5 private static int age; 6 private String color; 7 8 public static void main(String[] args) { 9 Cat cat1 = new Cat(); 10 Cat cat2 = new Cat(); 11 12 cat1.color = "white"; 13 cat1.name = "小花"; 14 cat1.age = 4; 15 16 cat2.color = "black"; 17 cat2.name = "小黑"; 18 19 System.out.println("小黑的年龄是: "+cat2.age); 20 } 21 }
以上代码中,cat1对静态变量age进行了修改,cat2访问age时,age已经被修改过了。在实际应用中,一定要小心使用静态变量。虽然可以达到共享成员变量的目的,但是也使得成员变量难以控制,可能带来意想不到的问题。
3. 对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。
对于实例变量,每创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)
二、静态方法
1. 静态方法可以直接通过类名进行调用,也可以通过任何实例对象进行调用(不推荐)
1 package com.huiAlex; 2 3 public class Cat { 4 private String name; 5 private static int age; 6 private String color; 7 8 public static void main(String[] args) { 9 Cat cat1 = new Cat(); 10 11 System.out.println(Cat.Meow()); 12 System.out.println(cat1.Meow()); 13 } 14 15 public static String Meow(){ 16 return "猫都会喵喵叫~"; 17 } 18 }
2. 静态方法必须被实现,不能是abstract类型
3. 静态方法中不能使用this和super关键字
4. 静态方法中只能直接访问静态变量和其他静态方法,如果需要访问其他非静态成员变量或成员方法,必须先实例化一个对象,再通过对象进行访问。
1 package com.huiAlex; 2 3 public class Cat { 4 private String name; 5 private static int age; 6 private String color; 7 8 public static void main(String[] args) { 9 System.out.println(Cat.Meow()); 10 } 11 12 public String likeWarm(){ 13 return "猫都喜欢暖和的地方"; 14 } 15 16 public static String likeFish(){ 17 return "猫都喜欢吃鱼"; 18 } 19 20 public static String Meow(){ 21 Cat.age = 8; // 直接访问静态成员变量 22 Cat cat2 = new Cat(); 23 cat2.name = "小花"; // 通过实例化后的对象访问非静态成员变量 24 System.out.println("这只猫叫 "+cat2.name); 25 System.out.println(Cat.likeFish()); // 直接访问静态方法 26 System.out.println(cat2.likeWarm()); //通过实例化后的对象访问非静态方法 27 28 return "猫都会喵喵叫~"; 29 } 30 }
三、static代码块
1. static代码块也叫静态代码块,是在类中独立于类成员的static语句块
2. 可以存在多个静态代码块,不能放在任何的方法体内
3. JVM加载类时会执行这些静态的代码块
4. 如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。
1 public class Cat { 2 private String name; 3 private static int age; 4 private String color; 5 6 static{ 7 Cat.age = 2; 8 System.out.println(age); 9 Cat cat = new Cat(); 10 System.out.println(cat.likeWarm()); 11 } 12 13 public static void main(String[] args) { 14 15 } 16 17 public String likeWarm(){ 18 return "猫都喜欢暖和的地方"; 19 } 20 21 static{ 22 Cat.age = 4; 23 System.out.println(age); 24 Cat cat1= new Cat(); 25 cat1.name = "小花"; 26 System.out.println(cat1.name); 27 } 28 }
运行结果:
以上是关于Java: static的使用的主要内容,如果未能解决你的问题,请参考以下文章
LockSupport.java 中的 FIFO 互斥代码片段