《Java程序猿面试笔试宝典》之Statickeyword有哪些作用
statickeyword主要有两种作用:第一,仅仅想为某特定数据类型或对象分配单一的存储空间,而与创建对象的个数无关。第二,希望某个方法或属性与类而不是对象关联在一起,也就是说,在不创建对象的情况下就能够通过类来直接调用方法或使用类的属性。详细而言。static在Java语言中主要有四种使用情况:成员变量、成员方法、代码块、内部类。
(1)static成员变量
尽管Java语言中没有全局的概念,但能够通过statickeyword来达到全局的效果。Java类提供了两种类型的变量:用statickeyword修饰的静态变量和没有statickeyword的实例变量。
静态变量属于类,在内存中仅仅有一个拷贝(全部实例都指向同一个内存地址)。仅仅要静态变量所在的类被载入。这个静态变量就会被分配空间,因此就能够被使用了。对静态变量的引用有两种方式,分别为“类.静态变量”和“对象.静态变量”。
实例变量属于对象,仅仅有对象被创建后,实例变量才会被分配空间,才干被使用。它在内存中存在多个拷贝。
仅仅能用“对象.实例变量”的方式来引用。下面是静态变量与实例变量的使用样例。
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和superkeyword,不能调用非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常与finalkeyword结合使用,用来修饰成员变量与成员方法。有点相似于“全局常量”。对于变量,假设使用static final修饰。则表示一旦赋值。就不可改动,而且通过类名能够訪问。对于方法。假设使用static final修饰。则表示方法不可覆盖,而且能够通过类名直接訪问。
常见笔试题:
|
输出结果是什么?
A:0 B:1 C:2 D:编译失败
答案:D。
在Java语言中,不能在成员函数内部定义static变量。
出自:http://www.360jobhunting.com/?
p=92
《Java程序猿面试笔试宝典》之Statickeyword有哪些作用的更多相关文章
- 《Java程序猿面试笔试宝典》之Java与C/C++有什么异同
Java与C++都是面向对象语言,都使用了面向对象思想(比如封装.继承.多态等),因为面向对象有很多非常好的特性(继承.组合等),使得二者都有非常好的可重用性. 须要注意的是,二者并不是全然一样,以下 ...
- 《Java程序猿面试笔试宝典》之组合与继承有什么差别
组合和继承是面向对象中两种代码复用的方式. 组合是指在新类里面创建原有类的对象,反复利用已有类的功能.继承是面向对象的主要特性之中的一个,它同意设计人员依据其他类的实现来定义一个类的实现. 组合和继承 ...
- 《Java程序猿面试笔试宝典》之Java程序初始化的顺序是如何的
在Java语言中.当实例化对象时.对象所在类的全部成员变量首先要进行初始化,仅仅有当全部类成员完毕初始化后,才会调用对象所在类的构造函数创建对象. Java程序的初始化一般遵循以下三个原则(以下 ...
- 《Java程序猿面试笔试宝典》之 什么是AOP
AOP(Aspect-Oriented Programming.面向切面编程)是对面向对象开发的一种补充,它同意开发者在不改变原来模型的基础上动态地改动模型从而满足新的需求.比如.在不改变原来业务逻辑 ...
- 《Java程序猿面试笔试宝典》之volatile有什么作用
在由Java语言编写的程序中.有时候为了提高程序的执行效率,编译器会自己主动对其进行优化,把经常被訪问的变量缓存起来,程序在读取这个变量的时候有可能会直接从缓存(比如寄存器)中来读取这个值.而不会去内 ...
- 《Java程序猿面试笔试宝典》之字符串创建与存储的机制是什么
在Java语言中.字符串起着非常关键的数据.字符串的声明与初始化主要有例如以下两种情况:(1) 对于String s1=new String("abc")语句与String s2= ...
- 《Java程序猿面试笔试宝典》之Java变量命名有哪些规则
在Java语言中,变量名.函数名.数组名统称为标识符,Java语言规定标识符仅仅能由字母(a~z.A~Z).数字(0~9).下划线(_)和$组成,而且标识符的第一个字符必须是字母.下划线或$.此外.标 ...
- 《Java程序员面试笔试宝典》终于在万众期待中出版啦~
<Java程序员面试笔试宝典>终于在万众期待中出版啦~它是知名畅销书<程序员面试笔试宝典>的姊妹篇,而定价只要48元哦,恰逢求职季节,希望本书的出版能够让更多的求职者能够走进理 ...
- 《Java程序员面试笔试宝典》之为什么需要public static void main(String[] args)这个方法
public staticvoid main(String[] args)为Java程序的入口方法,JVM在运行程序的时候,会首先查找main方法.其中,public是权限修饰符,表明任何类或对象都可 ...
随机推荐
- hdu 1364(差分约束)
King Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 12056 Accepted: 4397 Description ...
- yii2中判断数据表是否存在数据库中(原创)
分为两步: 第一步,找出数据库中所有表名,表名得到的是二维数组. 第二步,判断表名是否存在二维数组中 下面就贴我的代码咯. $table_name =‘table’; $juge = $handle- ...
- hdu5076
好题,首先观察可得w[i][j]选择只有可能两种,一种比阀值大,一种比阀值小 比阀值大就一定选满足条件最大的w,比阀值小同样一定选满足条件最大的w 那么一个最小割模型就呼之欲出了,注意w可能是负数那么 ...
- PreparedStatement 和 Statement 实现基本的批处理
批处理:若需要对数据库进行多步操作,则就没必要每次都和数据库进行一次通信,这样很消耗资源和时间.则需要将操作进行批处理: Statement方式来实现批处理 优点: ...
- linux 批量替换所有文件中包含的字符串
sed -i "s/原来字符串/新字符串/g" `grep 原来字符串 -rl .` 格式: sed -i "s/查找字段/替换字段/g" `grep 查找字段 ...
- shell脚本学习(二)
shell传递参数 shell脚本在执行是可以传递参数,脚本内获取参数的格式为:$n,n为一个数字,1为第一个参数,2为第二个参数,以此类推 其中,$0代表了要执行的文件名 实例: 代码如下: #!/ ...
- Burp Suite的使用介绍
在网上找了一篇关于Burp Suite的使用介绍,感觉写的基础的,下面就copy了,另外还有一篇<BurpSuite实战指南>的pdf是一位好心的“前辈”共享的https://www.gi ...
- C#异步编程模式IAsyncResult
IAsyncResult 异步设计模式通过名为 BeginOperationName 和 EndOperationName 的两个方法来实现原同步方法的异步调用,如 FileStream 类提供了 B ...
- HDU 2562 奇偶位互换(字符串,水)
奇偶位互换 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- [HDU5739]Fantasia(圆方树DP)
题意:给一张无向点带有权无向图.定义连通图的权值为图中各点权的乘积,图的权值为其包含的各连通图的权和.设z_i为删除i点后图的权值,求$S = (\sum\limits_{i=1}^{n}i\cdot ...