C\C++与Java中的static关键字
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关键字的更多相关文章
- (转)Java中的static关键字解析
转载: http://www.cnblogs.com/dolphin0520/p/3799052.html 一.static关键字的用途 在<Java编程思想>P86页有这样一段话: &q ...
- 关于Java中的static关键字
Java中的 static 关键字,确实是一个关键的字(key word),今天就来总结一下它的用法,说说为什么关键. Java中的 static 关键字主要是用来做内存管理的.理解了这句话才能够比较 ...
- Java中的static关键字解析
Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键 ...
- (转)Java中的static关键字解析
转自http://www.cnblogs.com/dolphin0520/p/3799052.html 一.static关键字的用途 在<Java编程思想>P86页有这样一段话: “sta ...
- Java中的static关键字解析 转载
原文链接:http://www.cnblogs.com/dolphin0520/p/3799052.html Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到 ...
- Java中的static关键字解析(转自海子)__为什么main方法必须是static的,因为程序在执行main方法的时候没有创建任何对象,因此只有通过类名来访问。
Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键 ...
- Java中的static关键字
写在前面: 在Java中并不存在全局变量的概念,但是我们可以通过static来实现一个“伪全局”的概念,在Java中static表示“全局”或“静态”的意思,用来修饰成员变量和成员方法,当然也可以修饰 ...
- java中的static关键字详解
static对于我们这些初学者在编写代码和阅读代码是一个难以理解的关键字,也是大量公司面试题最喜欢考的之一.下面我就来就先讲述一下static关键字的用法和我们初学者容易误解的地方. static关键 ...
- 【Java学习笔记之十五】Java中的static关键字解析
Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一.下面就先讲述一下static关键 ...
- 再议Java中的static关键字
再议Java中的static关键字 java中的static关键字在很久之前的一篇博文中已经讲到过了,感兴趣的朋友可以参考:<Java中的static关键字解析>. 今天我们再来谈一谈st ...
随机推荐
- git & github 菜鸟笔记
1.概念: 最先进的分布式版本控制系统 文件修改该提交的内容:---版本 文件名 用户 说明 日期 GitHub网站上线了,它为开源项目免费提供Git存储 --CVS及SVN都是集中式的版本控制系统, ...
- java 连接mariadb 无法获取数据源的问题,在ubuntu上部署的时候(原创)
问题: 连接数据库时报错: log4j:WARN No appenders could be found for logger (com.mchange.v2.log.MLog).log4j:WARN ...
- 使用ghost硬盘对拷备份系统
公司有台server装了OA系统.要备份数据.同一时候假设系统出错之后可以及时回复.所以有买了块同型号硬盘. 用ghost的硬盘对拷功能,将原硬盘的系统和数据拷到新硬盘上.新硬盘挂到server上.当 ...
- 5秒后跳转到另一个页面的js代码
今天看视频学习时学习了一种新技术,即平时我们在一个页面点击“提交”或“确认”会自动跳转到一个页面. 在网上搜了一下,关于这个技术处理有多种方法,我只记下我在视频里学到的三种: 1.用一个respons ...
- angular_文本变化
注意,在input中用ng-change的时候,一定要结合着ng-model用 开头,注意在这里添加了ng-app <!DOCTYPE html> <html lang=" ...
- mysql连接远程数据库的用法
mysql -u root -p 等这些常用的参数外,你知道多少?来测试一下吧 一,mysql命令行参数 Usage: mysql [OPTIONS] [database] //命令方式 -?, ...
- ssh访问跳过RSA key"yes/no"验证
通常我们再批量配置多台机器的时候经常出现通过ssh批量登录机器提示 RSA key fingerprint is ::a6:b1:c9:d7:b8::c1:::8e:f5::2b:8b. Are yo ...
- 机器被感染病毒文件zigw的处理流程
1.现象 服务器CPU报警,查看时,已接近100%. 2.查找 使用top查看是哪个进程在占用CPU,此时zigw立刻出现,记录下进程的PID,假如为12345. (1) 如果在不知道程序的路径前,就 ...
- Xcode 编译静态库
有时候,我们需要将一部分经常用到的代码提取出来用来复用,或者说需要用到c++的代码的时候,可以通过编译成静态库的方式来使用.本文中使用的Xcode版本是8.3,静态库制作过程和其他版本基本一样,可能出 ...
- 使用jQuery操作Cookies
转载自: https://www.cnblogs.com/yonge/articles/2698106.html Cookies是一种能够让网站服务器把少量数据储存到客户端的硬盘或内存,或是从客户端的 ...