static关键字的使用场景:某些特定的数据在内存空间里只有一份
1.static:静态的;
2.static:可以修饰类的结构 :属性、方法 代码块 内部类
3.使用static修饰属性:静态变量(类变量);
属性:按是否使用static修饰,又分为静态属性和非静态属性(实例变量);
实例变量:我们创建了类的多个对象,每个对象都有独立的一套类中非静态属性;当修改其中一个对象中的非今天属性时,不会导致其他对象中的属性的修改;
静态变量(类变量):我们创建了类的多个对象,每个对象都共享一个静态变量,当通过某一个对象修改静态变量时,会导致其他对象调用此静态变量,是修改过了;
看以下代码:
1 public class Day14Static5 { 2 public static void main(String[] args) { 3 Chinese c1 = new Chinese(); 4 c1.name = "姚明"; 5 c1.age = 40; 6 c1.nation = "CHN"; 7 Chinese c2 = new Chinese(); 8 c2.name = "马龙"; 9 c2.age = 30; 10 System.out.println(c2.nation); 11 Chinese.show(); 12 c1.eat(); 13 14 15 Circle cir1 = new Circle(); 16 Circle cir2 = new Circle(); 17 System.out.println(cir1.getId()+","+cir2.getId()+",创建圆的个数:"+Circle.getTotal()); 18 } 19 20 } 21 class Chinese{ 22 String name; 23 int age; 24 static String nation; 25 public String getName() { 26 return name; 27 } 28 public void setName(String name) { 29 this.name = name; 30 } 31 public int getAge() { 32 return age; 33 } 34 public void setAge(int age) { 35 this.age = age; 36 } 37 public void eat() { 38 39 } 40 public static void show() { 41 42 } 43 } 44 class Circle{ 45 private double redius; 46 private int id; 47 private static int total; 48 private static int init = 1001; 49 public double findArea() { 50 return 3.14 * redius *redius; 51 } 52 53 public double getRedius() { 54 return redius; 55 } 56 57 public void setRedius(double redius) { 58 this.redius = redius; 59 } 60 61 public int getId() { 62 return id; 63 } 64 65 public void setId(int id) { 66 this.id = id; 67 } 68 69 public static int getTotal() { 70 return total; 71 } 72 73 public static void setTotal(int total) { 74 Circle.total = total; 75 } 76 77 public static int getInit() { 78 return init; 79 } 80 81 public static void setInit(int init) { 82 Circle.init = init; 83 } 84 85 public Circle() { 86 super(); 87 id = init++; 88 total++; 89 } 90 91 public Circle(double redius) { 92 super(); 93 this.redius = redius; 94 id = init++; 95 total++; 96 } 97 98 }
Chinese c1 = new Chinese();
c1.name = "姚明";
c1.age = 40;
c1.nation = "CHN";
Chinese c2 = new Chinese();
c2.name = "马龙";
c2.age = 30;
System.out.println(c2.nation);
Chinese.show();
c1.eat();
c1.nation赋值"CHN"以后,System.out.println(c2.nation);的结构也是"CHN";
原因就是Chinese 中的nation是一个静态属性,所以他在内存空间中只存了一分数据,当创建多个对象时,每个对象的nation属性都共享一个数据。
static修饰属性的其他说明:
a.静态变量随着类的加载而加载;可以通过“类.静态变量”的方式进行调用
b.实例变量,随着实例的加载而加载,也就是对象创建时加载的;
c.静态变量的加载要早于类的创建;
d.类就只加载一次,所以,static变量也就只加载一次,在内存中也只会存一份;存在方法区的静态域;
看一个例子,统计一个类(这里是圆)被实例化多少次,并且id值默认值是1001,这个递增。
private double redius;
private int id;
private static int total;
private static int init = 1001;
这里用static 设置 init的初始值,total 计算该类总共被实例化的次数;当通过空参构造器实例化对象时,total就累加,因为total是静态变量,在内存中只有一份数据,创建新的实例时,新实例的total和已创建的实例的total共用一个数据,所以total的累加就是实例创建的个数,同理,init也累加并且赋值给id,这样可以确保id是以1001为基数逐个增长的;
这里输出的结果就是:1001,1002,创建圆的个数:2
类变量 实例变量
类 yes no
对象 yes yes
静态属性举例:System.out;Math.PI;
4.使用static修饰方法:静态方法;随着类的加载而加载,“类.静态方法”的方式进行调用
类方法 实例方法
类 yes no
对象 yes yes
静态方法中,只能调用静态的方法,或者静态属性;
非静态的方法,即可以调用静态的方法或属性,也可以调用非静态的方法和属性;
5.static方法注意点:
在静态方法内,不能使用this,super关键字 ,不可以非静态属性,不可以调用非静态的方法;可以条用静态的结构;
构造器中一般不添加 赋值操作;
6。开发中,如何确定属性是否要声明static?属性时可以被多个对象共享的,不会随着对象的不同而不同;或者常量;
如何确定方法是否声明static?操作静态属性的方法,通常设置为static,或者是工具栏的方法,习惯上声明static