一、static关键字

  下面我设计了一个房贷利率上浮类(用来计算房贷利率上浮多少):

 public class InterestRateGoUp
{
public InterestRateGoUp()
{
Rate = 4.9m;
} /// <summary>
/// 基准利率
/// </summary>
public decimal Rate { get; set; } /// <summary>
/// 计算上浮
/// </summary>
/// <param name="rate">当前房贷利率</param>
/// <returns>返回利率上浮结果</returns>
public decimal CalculatorGoUp(decimal rate)
{
decimal result = (rate - Rate) / Rate;
return result;
}
}
public class RealizeObject
{
public void Realize()
{
//小玄买房利率6.37
InterestRateGoUp rate1 = new InterestRateGoUp();
float result1 = rate1.CalculatorGoUp(6.37m);
//小豆买房利率6.125
InterestRateGoUp rate2 = new InterestRateGoUp();
float result2 = rate2.CalculatorGoUp(6.125m);
//房贷基准利率变成5.88,所有的对象的基准利率均需要改变
rate1.Rate = 5.88m;
rate2.Rate = 5.88m;
//如果有成百上千个这样的对象,则要修改成百上千次
}
}

上面例子的问题在于基准利率这个属性是所有房贷利率上浮对象共享的属性,而不是每个房贷利率上浮对象都拥有一个基准利率。所以要把基准利率这个属性设置成共享的需要使用static关键字,第二版房贷利率上浮类:

 public class InterestRateGoUp
{
public InterestRateGoUp()
{
Rate = 4.9m;
} /// <summary>
/// 基准利率
/// </summary>
public static decimal Rate { get; set; }
}
public class RealizeObject
{
public void Realize()
{
//房贷基准利率变成5.88,只需要修改静态属性(所有的对象都使用它),静态属性的使用如下
InterestRateGoUp.Rate = 5.88m;
//使用构造函数初始化静态属性存在一个问题,就是每次创建对象都会初始化静态属性,如下会把基准利率修改为4.9
InterestRateGoUp rate3 = new InterestRateGoUp();
}
}

静态自动属性的初始化方式有两种,第一种是静态自动属性改为静态属性(静态属性封装一个已赋值的静态私有字段),第二种是使用静态构造函数,第三版房贷利率上浮类:

 public class InterestRateGoUp
{
/// <summary>
/// 方法一:静态属性,而非静态自动属性
/// </summary>
private static decimal rate = 4.9m;
public static decimal Rate
{
get { return rate; }
set { rate = value; }
} /// <summary>
/// 方法二:静态构造函数
/// </summary>
static InterestRateGoUp()
{
Rate = 4.9m;
}
}

如果计算上浮的方法CalculatorGoUp经常被使用,可以把CalculatorGoUp设置成静态的;如果整个房贷利率上浮类都是一个专门供用户使用的工具类,则可以把类和类成员全部设置成静态的。最终版房贷利率上浮类:

 public static class InterestRateGoUp
{
static InterestRateGoUp()
{
Rate = 4.9m;
} /// <summary>
/// 基准利率
/// </summary>
public static decimal Rate { get; set; } /// <summary>
/// 计算上浮
/// </summary>
/// <param name="rate">当前房贷利率</param>
/// <returns>返回利率上浮结果</returns>
public static decimal CalculatorGoUp(decimal rate)
{
decimal result = (rate - Rate) / Rate;
return result;
}
}
public class RealizeObject
{
public void Realize()
{
//小玄买房利率6.37
float result1 = InterestRateGoUp.CalculatorGoUp(6.37m);
//小豆买房利率6.125
float result2 = InterestRateGoUp.CalculatorGoUp(6.125m);
//房贷基准利率变成5.88
InterestRateGoUp.Rate = 5.88m;
//小杰买房利率5.88
float result3 = InterestRateGoUp.CalculatorGoUp(5.88m);
}
}

总结:

1、static关键字可以修饰在类和类型成员(字段、属性、方法、构造函数等)上。

2、static关键字修饰的内容只会创建一次并且只分配一次内存,在程序结束时才被回收(不占用GC性能)。static关键字修饰的类型成员是类级别上的(它是唯一的)而不是对象级别上的,所以使用静态成员时只能通过(类名.静态成员)而不能通过(对象名.静态成员),静态类也不能使用new创建其对象。

3、实例字段/属性是每个对象独享的,每个对象都会为自己的每个实例数据分配内存空间,而静态字段/属性是所有对象共享的,无论创建多少对象,静态数据只分配一次。静态方法适用于经常被使用的情况下,可以减少内存的分配和清理次数。类的实例字段/属性和实例方法不能在静态方法中直接使用,只能通过(对象名.XXX)的方式使用。静态构造函数专为静态数据作初始化,其中它更适用于初始化在编译时未知的静态数据的值(如数据库中读取)。静态类也称为工具类,适用于整个类经常被使用,不能使用new创建它,并且只能包含用static修饰的类型成员。

备注:

1、静态构造函数只能定义一个无参静态构造函数,并且不允许有访问修饰符;

2、无论创建了多少类型的对象,静态构造函数只执行一次;

3、运行库创建类实例或调用者首次访问静态成员之前,运行库会调用静态构造函数;

4、静态构造函数的执行先于非静态构造函数。

部分内容引用于精通C#第六版

C#关键字:static的更多相关文章

  1. C++ 不能在类体外指定关键字static

    C++ static 函数的问题 近日读 C++ primer 中static 一章 , 有这么一句话, “静态成员函数的声明除了在类体中的函数声明前加上关键字static 以及不能声明为const  ...

  2. Java关键字--static

    在Java中,将关键字static分为三部分进行讨论,分别为Java静态变量.Java静态方法.Java静态类 Java Static Variables Java instance variable ...

  3. 关键字 static

    A. 面向过程: 1. 静态全局变量:在全局变量前,加上关键词static,该变量就被定义成为一个静态全局变量. 1.1. 特点: |该变量在全局数据区分配内存: |未经初始化的静态全局变量会被程序自 ...

  4. Java之关键字static和final的使用

    static 在Java中声明属性.方法时,可使用关键字static来修饰. 1.static变量       按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或 ...

  5. [JAVA关键字] static & final

    JAVA十分常见的关键字static & final 总的来说final表示常量,即不可更改的:而static表示静态,即全局的 1. final 类:不能被继承 2. final 方法:能被 ...

  6. JAVA基础知识(2)--关键字static的使用

    在Java类中声明属性.方法和内部类时,可使用关键字static作为修饰符,static标记的属性和方法可以由整个类进行共享,因此static修饰的属性称为类成员或者称为类方法:static修饰的方法 ...

  7. C语言关键字static的绝妙用途

    为什么要说static妙,它确实是妙,在软件开发或者单片机开发过程中,大家总以为static就是一个静态变量,在变量类型的前面加上就自动清0了,还有就是加上static关键字的,不管是变量还是关键字, ...

  8. C/C++中关键字static的用法及作用

    本文将主要从static在C和C++共有的作用及C++特有的作用两个方面进行解析. 在C和C++中共有的作用 隐藏(对变量.函数均可) 当同时编译多个文件时,所有未加static前缀的全局变量或全局函 ...

  9. Java开发笔记(五十五)关键字static的用法

    前面介绍嵌套类的时候讲到了关键字static,用static修饰类,该类就变成了嵌套类.从嵌套类的用法可知,其它地方访问嵌套类之时,无需动态创建外层类的实例,直接创建嵌套类的实例就行.其实static ...

  10. Java 关键字 static

    关键字static作用如下: 1. 为某个基本数据类型或对象分配单一的存储空间. 2. 实现某个属性或方法与类关联.在类被加载后类名可以直接调用静态成员方法(下面简称静态方法)或者访问静态成员变量(下 ...

随机推荐

  1. python: str()

    tx1 = '中国' tx2 = u'中国' print tx1 print tx2 print type(tx1) print type(tx2) #<type 'str'> str() ...

  2. player: 初始化分析

    //1. //cocos 程序开始运行时执行的函数 bool AppDelegate::applicationDidFinishLaunching() { // initialize director ...

  3. SpringBoot之文件上传体积过大问题(解决方案)

    错误信息如下(关键): org.apache.tomcat.util.http.fileupload.FileUploadBase$SizeLimitExceededException: the re ...

  4. [Gamma]Scrum Meeting#3

    github 本次会议项目由PM召开,时间为5月28日晚上10点30分 时长10分钟 任务表格 人员 昨日工作 下一步工作 木鬼 撰写博客,组织例会 撰写博客,组织例会 swoip 前端显示屏幕,翻译 ...

  5. 聊聊Dubbo(六):核心源码-Filter链原理

    转载:https://www.jianshu.com/p/6dd76ce7338f 0 前言 对于Java WEB应用来说,Spring的Filter可以拦截WEB接口调用,但对于Dubbo接口,Sp ...

  6. 《Go语言实战》读书笔记

    <Go语言实战>中文版pdf 百度网盘: https://pan.baidu.com/s/1kr-gMzaPAn8BFZG0P24Oiw 提取码: r6rt 书籍源码:https://gi ...

  7. Oracle 如何恢复删除并提交的表数据

    在Oracle的数据库中,如果不小心删除数据,该如何恢复数据呢? 有两种方法 :scn 方法和时间戳方法 一.恢复删除数据的SQL语法(建议用时间戳) 1.通过scn恢复删除且已提交的数据 1)获得当 ...

  8. 从 SVN 迁移至 Git 并保留所有 commit 记录

    yum install -y git-svn 用户映射文件user.txt,等号左边为svn账号,右边为Git用户名和邮箱.注意:svn中有多少用户就要映射多少 test1=test1<1472 ...

  9. Selenium+Java完整框架搭建(2019完整版)

    一.WebDriver框架开发实战 1.框架的思想 (1)什么是框架? 框架是可以被应用开发者定制的应用骨架 (2)为什么要写框架? 提高脚本可维护性 提高编写脚本的速度 提高脚本可阅读性 (3)框架 ...

  10. ubuntu 16.04 安装teamviewer

    很多人可能会问,为什么要在ubuntu上安装teamview?shell不就够用了吗?但实际上,很多时候,在远程连接linux的时候,我们需要在图形用户界面上进行操作.现在我就遇到了一个实际的问题:每 ...