深入理解Java中static关键字的用途与调用方法

1。静态关键字的目的

深入理解Java中static关键字的用途与调用方法

“ Java编程思想”中有一段话:

“静态方法是没有任何方法。非静态方法不能在静态方法中调用,但是可能是可能的。静态方法只能通过类本身来调用,而无需创建任何对象。这实际上是静态方法的主要用途。

尽管此段落仅说明静态方法的特殊功能,但可以看出静态关键字的基本功能。简而言之,这是在一个句子中描述的:

在没有创建对象的情况下调用(方法/变量)很方便。显然,通过静态关键字修改的方法或变量不需要依靠对象访问。只要加载课,就可以通过类名来访问它们。静态可用于修改类成员方法和类成员变量。此外,可以编写静态代码块以优化程序性能。

1)静态方法

静态方法通常称为静态方法。由于可以在不依赖任何对象的情况下访问静态方法,因此对于静态方法没有任何对象,因为它不取决于任何对象。由于没有物体,因此不能说这不是现在的问题。由于此功能,无法以静态方法访问类的非静态成员变量和类的非静态成员方法,因为非静态成员方法/变量必须依靠要调用的特定对象。

但是应该注意的是,尽管无法以静态方法访问非静态成员方法和非静态成员变量,但可以在非静态成员方法中访问静态成员方法/变量。

2)静态变量

静态变量也称为静态变量。静态变量和非静态变量之间的差异在于,所有对象都共享静态变量,只有一个副本在内存中,仅在第一次加载类时,才会在内存初始化。非静态变量归对象所有,并在创建对象时初始化。有多个副本,每个对象拥有的副本不会互相影响。

静态成员变量的初始化顺序以定义顺序初始化。

3)静态代码块

静态关键字还具有相对关键的功能,即形成静态代码块以优化程序性能。可以将静态块放置在班上的任何地方,并且可以在同类中有多个静态块。首先加载类时,每个静态块将按静态块的顺序执行,并且只能执行一次。

可以使用静态块来优化程序性能的原因是由于其特征:只有在加载类时才能执行一次。这是一个示例:

班级{

私人日期出生日期;

公众(日期出生){

this.birthdate =生日;

boolean isbornborboomer(){

日期startDate = date.valueof(“ 1946”);

日期端= date.valueof(“ 1964”);

返回birthdate.compareto(startdate)> = 0 && breathdate.compareto(enddate)<0;

Isbornboomer习惯于该人是否出生于1946 - 1964年。每次称为Isbornboomer时,都会生成两个对象,这会导致空间浪费。如果更改为此,它将更好:

班级{

私人日期出生日期;

私人静态日期开始日期,端端;

静止的{

startDate = date.valueof(“ 1946”);

endDate = date.valueof(“ 1964”);

公众(日期出生){

this.birthdate =生日;

boolean isbornborboomer(){

返回birthdate.compareto(startdate)> = 0 && breathdate.compareto(enddate)<0;

因此,很多时候,只需要将某些初始化操作放置在静态代码块中。

静态块可以出现在类中的任何位置(只要它不在方法内部,请记住,没有方法可以做到),并且执行是按静态块的顺序执行。

4)静态静态内部类

静态内部类不含对外部类的引用(在Java中,它被分为价值类型和参考类型,在这里意味着在静态内类中没有外部类的变量),因为没有引用传递的外部类进入他们的构造函数。

原因:静态内类是外部类的内部类,而不是对象的内部类,而无需使用此类来调用。

1。静态内部类和非静态内类

同样,只有在调用时才加载;

2。静态内类与静态变量和外部类的静态方法相同。只要称呼它,外部类就会被加载;但是,如果仅调用外部类的静态变量和静态方法,则不会加载静态内部类。

3。静态内部类的加载不需要依赖外部类,并且仅在使用时加载;但是,外部类也将在静态内部类加载期间首先加载。

静态内部类的应用:单例模式

公共班级singleton {

私人静态班级单人持有人{

私有静态最终Singleton实例= new Singleton();

私人singleton(){}

公共静态最终Singleton getinstance(){

返回SingletonHolder.Instance;

前提:

默认情况下,在整个加载过程中,ClassLoader的FindClass方法已同步(线程安全);

静态内部类就像非静态内部类,仅在调用时才加载它们。

分析:

关于这篇文章的聪明是,对于内部阶级的单身人士来说,这是饥饿风格的单身人士的实现。当初始化单身人士时,classloader将确保同步,使实例成为真正的单例。同时,由于单身人士是一个内部类,仅在外部类的getinstance方法中使用,因此加载的时间是首次调用getinstance方法的时间;它使用ClassLoader来确保同步,并允许开发人员控制类加载。时机是从内部的饥饿人类风格的单身人士,但从外面来看,这确实是一种懒惰的人类风格的实现。

5)静态静态指南包

静态导入软件包是Java软件包的静态导入,导入静态使用导入静态而不是导入。静态导入软件包是JDK1.5中的一项新功能。

通常,我们使用import com….. classname;要导入类,而静态导入就是这样:导入静态com….. classname。*;;在这里还有其他静态。另外,类名称名称名称名称。*,意味着将静态方法导入此类。当然,您也只能导入某种静态方法,只需替换。*用静态方法名称。然后,在此类中,您可以直接使用方法名称调用静态方法,而无需在类名中调用它。方法名称。

优点:它可以简化某些操作,例如打印操作System.out.println(…);您可以将其写入静态方法打印(…),然后在使用时直接打印(…)。但是,当有许多重复调用时,建议使用此方法。如果只有一个或两个呼叫,最好直接写它。

例如:

导入静态java.lang.system.out;

导入静态java.lang.integer。*;

公共课程测试{

公共静态void main(string [] args){

out.println(max_value);

out.println(tohexstring(22222));

输出:

2147483647

56ce

以下是使用静态导入的一些原则:

1。必须是导入静态的,而不是静态导入;

2。提防模棱两可的命名静态成员。例如,如果在整数类上执行静态导入和长类,则参考MAX_VALUE将导致编译器错误,因为整数和Long都具有max_value常数,而Java将不知道您正在引用哪个max_value;

3。您可以在静态对象引用,常数(请记住,它们是静态或最终)和静态方法上静态导入。

2。静态关键字的误解

1。静态关键字会更改班级成员的访问权限吗?

Java中的静态关键字不会影响变量或方法的范围。在Java中,唯一可能影响访问权限的关键字是私人,公共和受保护的关键字(包括软件包访问权限)。

2。可以通过此访问静态成员变量吗?

尽管对于静态方法没有,但可以通过非静态方法访问静态成员变量吗?让我们首先查看以下示例。此代码输出的结果是什么?

公共类Main {

静态INT值= 33;

public static void main(string [] args)抛出异常{

new main()。printValue();

私有void printValue(){

int值= 3;

system.out.println(this.value);

这主要检查对此和静态的理解。这代表当前对象。如果通过new Main()调用PrintValue,则当前对象是由New Main()生成的对象。静态变量由对象共享,因此printValue中的值无疑是33。printValue方法内部的值是局部变量,完全不能与之相关联,因此输出为33。这里的事情:尽管静态成员变量独立于对象,但它们并不意味着无法通过对象访问它们。所有静态方法和静态变量都可以通过对象访问(只要访问权限就足够)。

3。静态可以对局部变量作用吗?

在Java中,静态不允许无缘无故地修改局部变量,这是Java的语法提供。

----------------------------------------------------------------------------- ----------------------------------------------------------------------------- ----------------------------------------------------------------------------- ----------------------------------------------------------------------------- ----------------------------------------------------------------------------- -------

公共课程测试{

人=新人(“ test”);

静止的{

system.out.println(“测试静态”);

公共测试(){

system.out.println(“ test构造器”);

公共静态void main(string [] args){

new myclass();

班级{

静止的{

system.out.println(“ person static”);

公众(string str){

system.out.println(“ person”+str);

类myclass扩展了测试{

人=新人(“ myclass”);

静止的{

system.out.println(“ myClass static”);

公共myclass(){

system.out.println(“ myClass构造器”);

输出结果:

测试静态

myclass静态

人静态

人测试

测试构造函数

一个人my级

MyClass构造函数

你可能想看:
« 上一篇
下一篇 »

相关推荐

java中什么是冒泡,冒泡算法

2026年09月06日

27阅读

java中冒号,java双冒号

2026年09月06日

24阅读

java中的->,java中的是什么意思

2026年09月06日

24阅读

java中的super用法,Java中super的说明

2026年09月06日

27阅读

java中反射的应用,java中反射的应用场景

2026年09月06日

23阅读

java中开关的定义,Java关键字有哪些

2026年09月06日

25阅读