《Java程序员面试笔试宝典》之Static关键字有哪些作用
static关键字主要有两种作用:第一,只想为某特定数据类型或对象分配单一的存储空间,而与创建对象的个数无关。第二,希望某个方法或属性与类而不是对象关联在一起,也就是说,在不创建对象的情况下就可以通过类来直接调用方法或使用类的属性。具体而言,static在Java语言中主要有四种使用情况:成员变量、成员方法、代码块、内部类。
(1)static成员变量
虽然Java语言中没有全局的概念,但可以通过static关键字来达到全局的效果。Java类提供了两种类型的变量:用static关键字修饰的静态变量和没有static关键字的实例变量。静态变量属于类,在内存中只有一个拷贝(所有实例都指向同一个内存地址),只要静态变量所在的类被加载,这个静态变量就会被分配空间,因此就可以被使用了。对静态变量的引用有两种方式,分别为“类.静态变量”和“对象.静态变量”。
实例变量属于对象,只有对象被创建后,实例变量才会被分配空间,才能被使用,它在内存中存在多个拷贝。只能用“对象.实例变量”的方式来引用。以下是静态变量与实例变量的使用例子。
public class TestAttribute {public static int staticInt=0;
public int nonStaticInt=0; public static void main(String[] args){ TestAttribute t=new TestAttribute(); System.out.println(“t.staticInt=”+t.staticInt); System.out.println(“TestAttribute.staticInt=”+TestAttribute.staticInt); System.out.println(“t.nonStaticInt=”+t.nonStaticInt); System.out.println(“对静态变量和实例变量分别+1″); t.staticInt++; t.nonStaticInt++; TestAttribute t1=new TestAttribute(); System.out.println(“t1.staticInt=”+t1.staticInt); System.out.println(“TestAttribute.staticInt=”+TestAttribute.staticInt); System.out.println(“t1.nonStaticInt=”+t1.nonStaticInt); } } |
上例的运行结果为:
t.staticInt=0TestAttribute.staticInt=0
t.nonStaticInt=0 对静态变量和实例变量分别+1 t1.staticInt=1 TestAttribute.staticInt=1 t1.nonStaticInt=0 |
从上例可以看出,静态变量只有一个,被类拥有,所有的对象都共享这个静态变量,而实例对象是与具体对象相关的。需要注意的是,与C++语言不同的是,在Java语言中,不能在方法体中定义static变量。
(2)static成员方法
与变量类似,Java类同时也提供了static方法与非static方法。static方法是类的方法,不需要创建对象就可以被调用,而非static方法是对象的方法,只有对象被创建出来后才可以被使用。
static方法中不能使用this和super关键字,不能调用非static方法,只能访问所属类的静态成员变量和成员方法,因为当static方法被调用的时候,这个类的对象可能还没被创建,即使已经被创建了,也无法确定调用哪个对象的方法。同理,static方法也不能访问非static类型的变量。
static一个很重要的用途是实现单例模式。单例模式的特点是该类只能有一个实例,为了实现这一功能,必须隐藏类的构造函数,即把构造函数声明为private,并提供一个创建对象的方法,由于构造对象被声明为private,外界无法直接创建这个类型的对象,只能通过该类提供的方法来获取类的对象,要达到这样的目的只能把创建对象的方法声明为static。程序示例如下所示。
class Singleton{private static Singleton instance = null;
private Singleton (){} public static Singleton getInstance() { if( instance == null ) { instance = new Singleton (); } return instance; } } |
用public修饰的static变量和方法本质上都是全局的,如果在static变量前用private修饰,则表示这个变量可以在类的静态代码块或者类的其它静态成员方法中使用,但是不能在其它类中通过类名来直接引用。
(3)static代码块
static代码块(静态代码块)在类中是独立于成员变量和成员函数的代码块。它不在任何一个方法体内,JVM在加载类的时候会执行static代码块,如果有多个static代码块,JVM将会按顺序来执行。static代码块经常被用来初始化静态变量。需要注意的是,这些static代码块只会被执行一次。如下例所示。
|
程序运行结果为:
|
(4)static内部类
static内部类是指被声明为static的内部类,它可以不依赖于外部类实例对象而被实例化,而通常的内部类需要在外部类实例化后才能实例化。静态内部类不能与外部类有相同的名字,不能访问外部类的普通成员变量,只能访问外部类中的静态成员和静态方法(包括私有类型)。如下例所示。
public class Outer {static int n =5;
static class Inner { void accessAttrFromOuter(){ System.out.println(“Inner:Outer.n=”+n); } } public static void main(String[] args){ Outer.Inner nest = new Outer.Inner(); nest.accessAttrFromOuter(); } } |
程序运行结果为:
|
需要注意的是,只有内部类才能被定义为static。
引申:
(1)什么是实例变量?什么是局部变量?什么是类变量?什么是final 变量?
实例变量:变量归对象所有,只有在实例化对象后才可以。每当实例化一个对象时,会创建一个副本并初始化,如果没有显示初始化,会初始化一个默认值。各个对象中的实例变量互不影响。
局部变量:在方法中定义的变量,在使用前必须初始化。
类变量:用static可修饰的属性;变量归类所有,只要类被加载,这个变量就可以被使用(类名.变量名)。所有实例化的对象共享类变量。
final变量:表示这个变量为常量,不能被修改。
(2)static与final结合使用表示什么意思?
static常与final关键字结合使用,用来修饰成员变量与成员方法,有点类似于“全局常量”。对于变量,如果使用static final修饰,则表示一旦赋值,就不可修改,并且通过类名可以访问。对于方法,如果使用static final修饰,则表示方法不可覆盖,并且可以通过类名直接访问。
常见笔试题:
|
输出结果是什么?
A:0 B:1 C:2 D:编译失败
答案:D。在Java语言中,不能在成员函数内部定义static变量。
《Java程序员面试笔试宝典》之Static关键字有哪些作用的更多相关文章
- 《Java程序员面试笔试宝典》之 instanceof有什么作用
instanceof是Java语言中的一个二元运算符,它的作用是判断一个引用类型的变量所指向的对象是否是一个类(或接口.抽象类.父类)的实例,即它左边的对象是否是它右边的类的实例,返回boolean类 ...
- 《Java程序员面试笔试宝典》之volatile有什么作用
在由Java语言编写的程序中,有时候为了提高程序的运行效率,编译器会自动对其进行优化,把经常被访问的变量缓存起来,程序在读取这个变量的时候有可能会直接从缓存(例如寄存器)中来读取这个值,而不会去内存中 ...
- 《Java程序员面试笔试宝典》终于在万众期待中出版啦~
<Java程序员面试笔试宝典>终于在万众期待中出版啦~它是知名畅销书<程序员面试笔试宝典>的姊妹篇,而定价只要48元哦,恰逢求职季节,希望本书的出版能够让更多的求职者能够走进理 ...
- 《Java程序猿面试笔试宝典》之volatile有什么作用
在由Java语言编写的程序中.有时候为了提高程序的执行效率,编译器会自己主动对其进行优化,把经常被訪问的变量缓存起来,程序在读取这个变量的时候有可能会直接从缓存(比如寄存器)中来读取这个值.而不会去内 ...
- JAVA程序员面试笔试宝典1
1.为什么Java中有些接口没有任何方法? 这些没有任何方法声明的接口又被称为标识接口,标识接口对于实现它的类没有任何语义上的要求,它仅仅充当一个标识的作用,用来表明它的类属于一个特定的类型. 2.j ...
- 《Java程序员面试笔试宝典》之为什么需要public static void main(String[] args)这个方法
public staticvoid main(String[] args)为Java程序的入口方法,JVM在运行程序的时候,会首先查找main方法.其中,public是权限修饰符,表明任何类或对象都可 ...
- 《Java程序员面试笔试宝典》之Java程序初始化的顺序是怎样的
在Java语言中,当实例化对象时,对象所在类的所有成员变量首先要进行初始化,只有当所有类成员完成初始化后,才会调用对象所在类的构造函数创建对象. Java程序的初始化一般遵循以下三个原则(以下三原则优 ...
- 《Java程序猿面试笔试宝典》之Statickeyword有哪些作用
statickeyword主要有两种作用:第一,仅仅想为某特定数据类型或对象分配单一的存储空间,而与创建对象的个数无关.第二,希望某个方法或属性与类而不是对象关联在一起,也就是说,在不创建对象的情况下 ...
- 《Java程序员面试笔试宝典》之为什么Java中有些接口没有任何方法
由于Java不支持多重继承,即一个类只能有一个父类,为了克服单继承的缺点,Java语言引入了接口这一概念.接口是抽象方法定义的集合(接口中也可以定义一些常量值),是一种特殊的抽象类.接口中只包含方法的 ...
随机推荐
- #python基础学习模块:marshal 对象的序列化
#标准库地址:https://docs.python.org/2/library/marshal.html"""有时候,要把内存中一个对象持久化保存磁盘或者序列化二进制流 ...
- UVALive 4043 Ants
KM 构图求最小权值匹配 保证最小的权值,所连的边一定是能够不相交的. Ants Time Limit: 3000MS Memory Limit: Unknown 64bit IO For ...
- Swift 2.0 封装图片折叠效果
文/猫爪(简书作者)原文链接:http://www.jianshu.com/p/688c491580e3著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 用Swift封装图片折叠效果 b ...
- oracle之substr函数
substr(字符串,截取开始位置,截取长度) //返回截取的字 substr(,) //返回结果为 'H' *从字符串第一个字符开始截取长度为1的字符串 substr(,) //返回结果为 'H' ...
- VS2010不能打开预编译的网站源码的原因是什么?(转之csdn)
原问题: 今天将写好的一个网站源码目录拷贝到另一台电脑上,但打开时提示: 你要打开一个预编译的网站,你可以查看该站点,但对它进行更改可能会造成该网站停止运行,若要修改站点,建议先编辑原始网站中的 ...
- ORACLE SQL单行函数(一)【weber出品必属精品】
1.SUBSTR:求父串中的子串 SUBSTR('HelloWorld',1,5) 1:代表子串的起始位置,如果为正,正数,如果为负,倒数 5:代表字串的终止位置,只能向右数,可以省略,如果省略就是数 ...
- C/C++中的空类及抽象类大小
代码: #include <iostream> using namespace std; struct A{ }; struct B{ int i; }; class C:B{ ; }; ...
- 初识CLR
眨眼间我已经实习了半年时间并且转正了,身份也正式从一个学生转变为一个职场人,这个博客自从开始实习以来就一直没有更新过= =没错,就是我懒癌晚期,不过不行!一切都要开始走向正轨,此博会继续见证我的成长, ...
- redis的特色
总结一下redis的特点: 1.独特的键值对模型 很多数据库只能处理一种数据结构: • SQL 数据库 —— 表格 • Memcached —— 键值对数据库,键和值都是字符串 ...
- ecshop优化修改sitemap.xml到根目录
大家都知道sitemap.xml是用来给搜索引擎提交收录的工具,虽然搜索引擎自己也会收录网站但是有了sitemap.xml之后速度会加快不少.而ecshop程序是有自动生成sitemap.xml的功能 ...