《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是权限修饰符,表明任何类或对象都可 ...
随机推荐
- Eclipse默认标签TODO,XXX,FIXME和自定义标签
1 TODO 表示需要实现,但目前还未实现的功能 2 XXX 勉强可以工作,但是需要改进的功能 3 FIXME 代码是错误的,不能工作,需要修复 4.自定义标签 window-->prefere ...
- ionic3 学习记录
1生命周期 ionViewDidLoad(){ console.log("1.0 ionViewDidLoad 当页面加载的时候触发,仅在页面创建的时候触发一次,如果被缓存了,那么下次再打开 ...
- 山东省第八届省赛 A:Return of the Nim(尼姆+威佐夫)
Problem Description Sherlock and Watson are playing the following modified version of Nim game: Ther ...
- (2)创建发布Maven
一.创建maven项目 (1)命令行 mvn archetype:generate (2)选择模板默认是7 (3)输入组织号.项目名称及版本号.包名 回车确认 创建成功 二.转成idea项目 进入跟目 ...
- 51nod 1137 矩阵乘法【矩阵】
1137 矩阵乘法 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出2个N * N的矩阵M1和M2,输出2个矩阵相乘后的结果. Input 第1行 ...
- python——入门系列(一)索引与切片
1.索引和切片:python当中数组的索引和其他语言一样,从0~n-1,使用索引的方法也是中括号,但是python中的切片的使用简化了代码 索引:取出数组s中第3个元素:x=s[2] 切片:用极少的代 ...
- linux程序与进程内存结构
1.可执行文件结构: 1)代码区:包含操作码和操作对象.常量数据(const声明).立即数,代码区是共享的, 只提供只读. 2)全局/静态数据区:包含被初始化的全局数据和初始化静态数据. 3)未初始化 ...
- 福州三中集训day3
Day3数据结构,强无敌. 基本讲的是栈,队列,链表,都是些还会的操作,然后接着讲的就比较心凉凉了,先讲了堆,然后是hsah 栈,队列,链表问题都不大,笔记记得都还好,堆就凉凉了. 不会不会不会,没学 ...
- [美团 CodeM 初赛 Round A]最长树链
题目大意: 给你一棵带点权的树,找出一个最长的树链满足链上点权的最大公因数不为1. 思路: 暴力DP. 对于每个点,记录一下以这个点为一个端点的所有链的最大公因数及长度. 然后暴力转移一下,时间复杂度 ...
- TSQLDBServerHttpApi使用工作线程池
TSQLDBServerHttpApi使用工作线程池 TSQLDBServerHttpApi创建时,默认是使用单线程模式,且只使用一个数据库连接,服务端要应对众多的客户端只靠一个工作线程(主线程)和一 ...