• 五(十一)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

  • 相关阅读:
    Java微信分享接口开发
    lintcode 刷题 by python 部分链表题总结(2)
    基于CART的回归和分类任务
    机器学习: K-means 聚类
    python 中的堆 (heapq 模块)应用:Merge K Sorted Lists
    名人、皇家谱系
    python实现数组和链表的归并排序
    Python 正则 —— 捕获与分组
    ArcGIS中的数据连接问题——数据类型不统一
    Spring boot 搭建
  • 原文地址:https://www.cnblogs.com/lixiuming521125/p/13374697.html
Copyright © 2020-2023  润新知