五(十一)static

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 }
View Code

    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

原文地址:https://www.cnblogs.com/lixiuming521125/p/13374697.html