Java中的static重要字解析版权声明
原创static关键字是许多朋友在编写和阅读代码时遇到的关键词。这也是大公司面试官在面试时喜欢问的知识点之一。让我们先谈谈它。static最后列出了关键词的用法和通常容易误解的地方。static试题。以下是本文的目录大纲:
一.static关键字的用途
二.static关键词错误
三.常见笔试问题
如果有任何错误,我希望理解并欢迎批评和纠正。
请尊重作者的劳动成果,并与原文链接一起转载:
http://www.cnblogs.com/dolphin0520/p/3799052.html
一.static关键字的用途
在《Java编程理念P86页面上有一段话:
“static方法是否定的。this方法在里面static不能在方法内部调用非静态方法,这反过来也是可能的。您可以只通过类本身调用它,而不创建任何对象。static方法这正是static该方法的主要用途。”
虽然这段话只显示static方法,但可以看出static简言之,关键词的基本功能用一句话描述:
在不创建对象的情况下调用(方法)很方便。/变量)。
显然static关键字修改的方法或变量不需要由对象访问。只要加载了类,就可以通过类名访问它们。
static可以用来修改类的成员方法、类成员变量,并且可以编写。static优化程序性能的代码块。
1)static方法
static方法通常被称为静态方法,因为静态方法不依赖任何对象来访问,所以对于静态方法,没有。this是的,因为它没有附着到任何对象,因为没有对象,所以它没有this对由于这个特性,类的非静态成员变量和非静态成员方法不能在静态方法中访问,因为非静态成员法/变量必须依赖于要调用的特定对象。
然而,请注意,虽然非静态成员方法和非静态成员变量不能在静态方法中访问,但静态成员方法可以在非静态成员法中访问。/变量。一个简单的例子:
在上述代码中,由于print2方法独立于对象存在,可以直接用类名调用。假设您可以在静态方法中访问非静态方法。/变量,如果在。main方法具有以下语句:
MyObject.print2();
此时没有对象,str2没有矛盾这回事。方法也是如此,因为你无法在中进行预测。print1方法中是否访问了非静态成员变量,因此在静态成员方法中也禁止访问非静态成员方法。
对于非静态成员方法,它访问静态成员方法。/变量显然是无限的。
因此,如果要在不创建对象的情况下调用方法,可以设置该方法static。我们最常见的static方法就是main方法,以及为什么main方法必须是static是的,现在很清楚了。因为程序正在执行。main方法不创建任何对象,因此只能通过类名访问它。
还要记住,构造函数是否static方法可参考:http://blog.csdn.net/qq\_17864929/article/details/48006835
2)static变量
static变量也称为静态变量。静态变量和非静态变量的区别在于,静态变量由所有对象共享,并且在内存中只有一个副本。它们仅在首次加载类时初始化。但是,非静态变量归对象所有,并在创建对象时进行初始化。存在多个副本,每个对象所拥有的副本不会相互影响。
static成员变量的初始化顺序按定义的顺序初始化。
3)static代码块
static关键词的另一个关键作用是 用于形成静态代码块以优化程序性能。static块可以放置在类中的任何位置,并且可以有多个static块当第一次加载类时,它将static执行每个操作的块的顺序static块,并且将只执行一次。
为什么说static由于其特性,块可以用于优化程序性能:当类被加载时,它将只执行一次。让我们看一个例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
class
Person{
private
Date birthDate;
public
Person(Date birthDate) {
this
.birthDate = birthDate;
}
boolean
isBornBoomer() {
Date startDate = Date.valueOf(
"1946"
);
Date endDate = Date.valueOf(
"1964"
);
return
birthDate.compareTo(startDate)>=
0
&& birthDate.compareTo(endDate) <
0
;
}
}
isBornBoomer这是给这个人用的吗1946-1964出生于,每个isBornBoomer当被调用时,它被生成。startDate和birthDate如果将两个导致空间浪费的对象更改为此,则效率会更高:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class
Person{
private
Date birthDate;
private
static
Date startDate,endDate;
static
{
startDate = Date.valueOf(
"1946"
);
endDate = Date.valueOf(
"1964"
);
}
public
Person(Date birthDate) {
this
.birthDate = birthDate;
}
boolean
isBornBoomer() {
return
birthDate.compareTo(startDate)>=
0
&& birthDate.compareTo(endDate) <
0
;
}
}
因此,很多时候,一些只需要执行一次的初始化操作将被放置static在代码块中。
二.static关键词错误
1.static关键字是否会更改类中成员的访问权限?
一些初学者朋友会java中的static与C/C++中的static关键词的功能混乱。请记住一件事:。C/C++中的static不同,Java中的static关键字不影响变量或方法的范围。在里面Java只有private、public、protected(包括包访问)这些关键字。查看以下示例以了解:
提示错误"Person.age 不可视",这说明static关键字不会更改对变量和方法的访问。
2.能通过this是否访问静态成员变量?
虽然不适用于静态方法this,则在非静态方法中可以通过。this是否访问静态成员变量?先看下面的一个例子,这段代码输出的结果是什么?
1
2
3
4
5
6
7
8
9
10
11
12
public
class
Main {
static
int
value =
33
;
public
static
void
main(String[] args)
throws
Exception{
new
Main().printValue();
}
private
void
printValue(){
int
value =
3
;
System.out.println(
this
.value);
}
}
33
这里的主要调查小组this和static的理解。this这是什么意思?this表示当前对象,然后通过。new Main()来调用printValue当前对象已传递。new Main()生成的对象。和static变量由对象使用,因此在printValue中的this.value的价值无疑是33。在printValue方法内部value是一个无法关联的局部变量this关联,因此输出结果为33。这里要记住一件事:尽管静态成员变量独立于对象,但它们并不意味着不能通过对象访问它们。所有静态方法和静态变量都可以通过对象访问(只要访问权限足够)。
3.static它能作用于局部变量吗?
在C/C++中static是一个可以确定范围的局部变量,但在中。Java中切记:static不允许修改局部变量。别问为什么,这是Java语法规定。
具体原因,请参阅本博客文章中的讨论:http://www.debugease.com/j2se/178932.html
三.常见笔试问题
以下是一些在书面面试中经常遇到的问题。static关键字的标题仅供参考。如果有任何补充,请在下面留言。
1.以下代码的输出是什么?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public
class
Test
extends
Base{
static
{
System.out.println(
"test static"
);
}
public
Test(){
System.out.println(
"test constructor"
);
}
public
static
void
main(String[] args) {
new
Test();
}
}
class
Base{
static
{
System.out.println(
"base static"
);
}
public
Base(){
System.out.println(
"base constructor"
);
}
}
base static test static base constructor test constructor
至于为什么会出现这种结果,我们先不讨论它。首先,让我们考虑一下这段代码的具体执行过程。在执行之初,我们必须首先查明main方法,因为main方法是程序的入口点,但在执行中。main方法必须在之前加载Test加载时类Test找到类Test类继承自Base类,因此它将首先加载。Base类,正在加载。Base类,发现有static块,它被执行。static块。在Base类加载后,继续加载。Test类,然后发现Test类中也有static阻止,然后执行static块加载所需的类后,执行开始。main方法。在main方法执行new Test()父类的构造函数在调用自己的构造函数之前被调用。因此,出现上述输出结果。
2.这个代码的输出是什么?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public
class
Test {
Person person =
new
Person(
"Test"
);
static
{
System.out.println(
"test static"
);
}
public
Test() {
System.out.println(
"test constructor"
);
}
public
static
void
main(String[] args) {
new
MyClass();
}
}
class
Person{
static
{
System.out.println(
"person static"
);
}
public
Person(String str) {
System.out.println(
"person "
+str);
}
}
class
MyClass
extends
Test {
Person person =
new
Person(
"MyClass"
);
static
{
System.out.println(
"myclass static"
);
}
public
MyClass() {
System.out.println(
"myclass constructor"
);
}
}
View Code
类似地,让我们考虑一下这段代码的具体执行。首先加载Test类,因此它执行Test类中的static块然后执行new MyClass(),而MyClass该类尚未加载,因此需要加载。MyClass班正在加载MyClass类,发现MyClass类继承自Test类,但由于Test类已加载,因此仅MyClass那就上课吧MyClass类的中的static块加载后,通过构造函数生成对象。生成对象时,必须首先初始化父类的成员变量,才能执行它。Test中的Person person = new Person(),而Person该类尚未加载,因此将首先加载。Person类并执行Person类中的static块,然后执行父类的构造函数,完成父类的初始化,然后初始化自身,这样它将执行MyClass中的Person person = new Person(),最终执行MyClass构造函数的。
3.这个代码的输出是什么?
1
2
3
4
5
6
7
8
9
10
11
12
13
public
class
Test {
static
{
System.out.println(
"test static 1"
);
}
public
static
void
main(String[] args) {
}
static
{
System.out.println(
"test static 2"
);
}
}
View Code
虽然在main由于上述原因,该方法中没有语句,但仍将输出它们。此外static块可以出现在类中的任何位置(只要它不在方法内,请记住,它不在任何方法内),并且执行符合static执行块的顺序。
参考文献:
http://lavasoft.blog.51cto.com/62575/18771/
http://www.51cto.com/specbook/24/35011.htm
http://blog.csdn.net/zhu_apollo/article/details/1888219
http://blog.sina.com.cn/s/blog_70b845780100n9zz.html
http://hi.baidu.com/yuiezt/item/b71ff5fbfe9c385cc8f3370d
http://bbs.csdn.net/topics/330251070
http://yezixingchen.iteye.com/blog/1597186
《Java编程理念
作者: Matrix海子
出处: http://www.cnblogs.com/dolphin0520/
本博客未注明的文章转载归作者所有。 Matrix海子 它与博客公园共享。欢迎转载,但您必须在未经作者同意的情况下保留此声明,并在文章页面的明显位置给出原始连接,否则您保留追究法律责任的权利。
版权声明
所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除