C\C++里面的static:

面向过程的static:

在c和c++面向过程的设计里,在全局变量前加上static关键字则可将该变量定义为一个静态全局变量,比如:

static int a;

那么c和c++中的静态全局变量有什么特点呢:

1、      变量在全局数据区分配内存(局部变量在栈内,通过new和malloc动态分配的变量在堆里);

2、      未经初始化的全局变量会被程序自动初始化为0;

3、      静态全局变量或函数在声明它的文件内是可见的,在文件外是不可见的;(可以起到保护作用)

讲讲第三点,如果我们只是在某个头文件中声明了一个普通的全局变量a,那么在引用这个头文件的时候,我们也可以通过extern关键字将这个变量引用到当前文件中;但是如果你在声明那个变量的时候就加了static关键字,那么全局变量a对于其他任何文件都是不可见的。

同样的,如果以static方式定义了一个函数,那么这个函数只在定义它的文件内可见。

面向对象的static:

在面向对象设计里面,使用static有几点要注意:

1、      静态成员函数的声明在类内要加上static关键字,但是在类外实现的时候不需要;

2、      静态成员函数没有this指针,所以不要尝试显示或隐式地在静态成员函数内引用这个指针,这种做法会导致编译期间报错。因此也就不要尝试些什么在构造函数中给静态成员变量初始化的动作了。

下面写个小例子感受一下面向对象的static:

首先定义一个头文件account.h,在头文件中定义一个类:

#pragma once
class Account
{
public:
static void reiseInterest(double var );
static double interest(){return dInterest; } //类内给出实现,语句简单,无递归,与类外实现并声明为inline函数都是相同的,均为内联函数
private:
static double dInterest ;
};
double Account::dInterest = ; //静态数据成员初始化
inline void Account::reiseInterest(double var)
{
dInterest += var;
}

接着在源文件中进行测试:

#include <iostream>
#include "account.h"
using namespace std;
int main()
{
//double Account::dInterest = 5; //错误!!static关键字限制了可视域!!
cout<<"The initial interest is "<<Account::interest()<<endl;
Account ac1;
Account ac2;
ac1.reiseInterest();
ac2.reiseInterest();
cout<<"The current interest is "<<Account::interest()<<endl;
return ;
}

运行结果如下:

Java部分:

Java中,在一个类里面,一个变量一旦声明,即使没有对变量进行初始化,它们也会获得一个默认值。不过需要注意的是,只有当变量作为一个类的数据成员被使用的时候才能确保获得初值。

所以static对于java是没有所谓赋予默认初值的说法的。

但是如果一个变量不属于任何类,比如说只是一个局部变量:

int a;

那么这个a得到的可能是任意值,而不会被自动初始化为0。

那么Java中static的作用到底是什么?

Java中的Static:

每当我们声明一个类,需要用到其中的方法和变量的时候我们都需要通过new来创建对象,再用该对象去调用具体的方法和变量。

但是有两种情况是比较特殊的:

情形1我只想为某一特定数据分配一份存储控件,而不用去考虑究竟要创建多少对象,或者是甚至根本不去创建任何对象;

情形2我希望某个方法不与包含它的类的任何对象关联在一起,即是,即使没有创建对象,我也能够调用这个方法。

这个时候我们就需要用到static。

下面进行一些小测试:

class StaticTest
{
static int a = 47;
public StaticTest(){}
} class StaticFun
{
static void Fun()
{
StaticTest.a++;
}
} public class StaticT { public static void main(String[] args) {
// TODO Auto-generated method stub
StaticTest st1 = new StaticTest();
StaticTest st2 = new StaticTest();
StaticTest.a++;
System.out.println("st1's a is "+st1.a);
System.out.println("st2's a is "+st2.a);
StaticFun.Fun();
System.out.println("current a is "+StaticTest.a);
System.out.println("st1's a is "+st1.a);
System.out.println("st2's a is "+st2.a);
}
}

运行结果如下:

C\C++与Java中的static关键字的更多相关文章

  1. (转)Java中的static关键字解析

    转载: http://www.cnblogs.com/dolphin0520/p/3799052.html 一.static关键字的用途 在<Java编程思想>P86页有这样一段话: &q ...

  2. 关于Java中的static关键字

    Java中的 static 关键字,确实是一个关键的字(key word),今天就来总结一下它的用法,说说为什么关键. Java中的 static 关键字主要是用来做内存管理的.理解了这句话才能够比较 ...

  3. Java中的static关键字解析

    Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键 ...

  4. (转)Java中的static关键字解析

    转自http://www.cnblogs.com/dolphin0520/p/3799052.html 一.static关键字的用途 在<Java编程思想>P86页有这样一段话: “sta ...

  5. Java中的static关键字解析 转载

    原文链接:http://www.cnblogs.com/dolphin0520/p/3799052.html Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到 ...

  6. Java中的static关键字解析(转自海子)__为什么main方法必须是static的,因为程序在执行main方法的时候没有创建任何对象,因此只有通过类名来访问。

    Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键 ...

  7. Java中的static关键字

    写在前面: 在Java中并不存在全局变量的概念,但是我们可以通过static来实现一个“伪全局”的概念,在Java中static表示“全局”或“静态”的意思,用来修饰成员变量和成员方法,当然也可以修饰 ...

  8. java中的static关键字详解

    static对于我们这些初学者在编写代码和阅读代码是一个难以理解的关键字,也是大量公司面试题最喜欢考的之一.下面我就来就先讲述一下static关键字的用法和我们初学者容易误解的地方. static关键 ...

  9. 【Java学习笔记之十五】Java中的static关键字解析

    Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键 ...

  10. 再议Java中的static关键字

    再议Java中的static关键字 java中的static关键字在很久之前的一篇博文中已经讲到过了,感兴趣的朋友可以参考:<Java中的static关键字解析>. 今天我们再来谈一谈st ...

随机推荐

  1. EF提供的3中查询方式

    1. Linq to Entities using (TestEntities te = new TestEntities()) { var user = from a in te.User wher ...

  2. 第七篇:两个经典的文件IO程序示例

    前言 本文分析两个经典的C++文件IO程序,提炼出其中文件IO的基本套路,留待日后查阅. 程序功能 程序一打印用户指定的所有文本文件,程序二向用户指定的所有文本文件中写入数据. 程序一代码及其注释 # ...

  3. Spring配置dataSource的三种方式 数据库连接池

    1.使用org.springframework.jdbc.dataSource.DriverManagerDataSource 说明:DriverManagerDataSource建立连接是只要有连接 ...

  4. 基于注解的Spring AOP拦截含有泛型的DAO

    出错场景 1.抽象类BaseDao public abstract class BaseDao<T> { public BaseDao() { entityClass = (Class&l ...

  5. Java RSA加密以及验签

    签名加密以及验签工具类: 一般秘钥分为3个key 1.自己生成的私钥, 2.通过私钥生成的公钥1 3.通过提交公钥1给某宝,获取的公钥2. RSA公钥加密算法简介 非对称加密算法.只有短的RSA钥匙才 ...

  6. JavaWeb开发的一系列可能的配置

    最近电脑硬盘坏了Orz...,重装了.唉!软件什么的都要重新装,重新设置,好麻烦! 我决定写下重装javaweb开发环境的过程 1.Java的安装,配置 https://www.runoob.com/ ...

  7. [Algorithms] Longest Increasing Subsequence

    The Longest Increasing Subsequence (LIS) problem requires us to find a subsequence t of a given sequ ...

  8. 修改jquery.automeplete,使其支持value匹配

    原生只会去匹配label,可在实际使用中,可能需要匹配的值并不需要显示在label中,经过添加一个matchType属性解决 1.加入matchType选项,并默认为原生匹配 $.widget(&qu ...

  9. mysql 中调用存储过程之后,连接断开不可用

    解决方法: 由 mysql_real_connect(&m_mysql,host,user,passwd,Db,0,NULL,0) == NULL 改为 mysql_real_connect( ...

  10. 更新设置api

    8.8 更新设置 API Elasticsearch允许在elasticsearch.yml文件中指定各种参数来调优.但你应该把这个文件当做 默认设置,可以在运行时通过Elasticsearch RE ...