gpt4 book ai didi

实例解析Java关于static的作用

转载 作者:qq735679552 更新时间:2022-09-28 22:32:09 28 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章实例解析Java关于static的作用由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

概述 。

只要是有学过java的都一定知道static,也一定能多多少少说出一些作用和注意事项。如果已经对static了如指掌的请点击关闭按钮,看下去也只是浪费您宝贵时间而已。这篇随笔只是个人的习惯总结.

为什么需要static?

有时候我们并不想去new一个对象,只是单纯的想要调用一个函数,并且希望这个函数不会与包含它的类的其他对象有所关联。说得通俗点,即使没有创建对象,也能通过类本身来调用函数.

static静态变量 。

被static修饰的变量属于类变量,通过字面意思就说明了这个变量的归属(类),与之相对的是没有被static修饰的成员变量,也称为实例变量,说明这个变量是属于某个具体的对象.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class staticdemo
{
  private static int i = 50 ;
 
  private int j = 60 ;
 
  public static void main(string[] args) {
  staticdemo staticdemo = new staticdemo();
  staticdemo staticdemo1 = new staticdemo();
  //即使创建两个对象,也都指向同一存储空间
  system.out.println(staticdemo.i);
  system.out.println(staticdemo1.i);
  //改变值
  staticdemo.i = 52 ;
  system.out.println(staticdemo1.i);
  staticdemo.j = 65 ;
  staticdemo1.j = 70 ;
  system.out.println(staticdemo.j);
  system.out.println(staticdemo1.j);
  }
 
}

输出 。

50 50 52 65 70 。

通过上面的实例,我们很快看出他们的区别 。

  1. 静态变量是属于类的,只有一份存储空间,是类之间共享的,牵一发而动全身,一处变,处处变。
  2. 实例变量属于实例对象,创建几次对象,就有几份的成员变量(拷贝)。

static修饰的静态函数 。

说到静态函数,就不得不提java另一个关键词this,指的是当前的引用。意思是调用这个函数的对象,这意味着和static修饰的函数水火不容。被static修饰的函数,不能出现this关键字,否则便会报错.

实例解析Java关于static的作用

去掉this,分别调用i或者j,会发现静态函数调用非静态资源时出错。这是为什么?从jvm加载机制角度来说,静态资源(被staitc修饰)是类在初始化的时候就加载的,而非静态资源是new的时候加载的。类的初始化是早于new的,加载了say()的函数时,它并不认识 j 这个成员变量,但对于非静态函数来说,当它加载时,静态资源已经加载完毕,所以它是认识 i 这个静态资源的。我们总结一下static修饰函数时的特点 。

  1. 静态函数不能引用非静态资源;
  2. 非静态函数可以引用静态资源;
  3. 静态函数可以相互调用(只要引入所在包即可);
  4. 静态函数没有this,因为它不依附于任何对象。

现在,我们也能知道main函数为什么必须是static的,因为程序在执行main函数时候,没有创建任何对象,只是通过类名来访问.

实例解析Java关于static的作用

构造函数是不是静态函数?

《java编程思想》提到“即使没有显示地使用static关键字,构造器实际上也是静态方法”。我至今不能确认构造器是不是静态函数,个人更偏向于不是。原因待会再阐述,先看个实例 。

?
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
public class statictest
{
  private static int i;
 
  private int j;
 
  public statictest( int i, int j){
  this .i = i;
  this .j = j;
     say1()
  }
 
 
  public void say1()
  {
  system.out.println( "you age is" + i);
  system.out.println( "you age is" + j);
  }
 
  public static void main(string[] args)
  {
  statictest statictest = new statictest( 4 , 5 );
  statictest statictest1 = new statictest( 10 , 69 );
  system.out.println(statictest.i);
  system.out.println(statictest.j);
  system.out.println(statictest1.i);
  system.out.println(statictest1.j);
 
  }
}

输出 。

you age is4 you age is5 you age is10 you age is69 10 5 10 69 。

实例中,确实改变了 i 的值,也符合静态资源的定义,只有一份存储空间。但构造器里用了this,与我前文所说的static属于类,不属于任何对象,this属于当前引用对象互相矛盾,并且构造函数还可以调用实例函数。一脸懵逼,这也是让我感到困惑并且认为构造函数不是静态函数的地方。如有周知,留言解惑,感谢.

静态块与非静态块 。

private static int i; static     {         i = 5;     } 。

静态块是static的重要应用之一,无函数名、作用域、返回值以及参数,静态代码块与静态变量和静态函数一样,不论类被调用多少次,该区域代码只在类初始化时第一次时执行一次,并且严格按照静态资源的定义顺序执行加载,与静态函数区别在于一个主动一个被动.

{         system.out.println("我是静态块.");   } 。

非静态块,同样无函数名,作用域,返回值以及参数,非静态代码块会在每次类被调用或者被实例化时执行.

实例 。

?
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
36
37
38
39
40
41
42
43
44
public class statictest extends father
{
  public statictest()
  {
  system.out.println( "我是statictest的构造函数" );
  }
 
  {
  system.out.println( "我是statictest的非静态块" );
  }
 
  static
  {
  system.out.println( "我是statictest的静态块" );
  }
 
  public static void main(string[] args)
  {
  new statictest();
  new statictest();
  }
}
 
class father
{
  public father()
  {
  system.out.println( "我是father构造函数" );
  }
 
  {
  system.out.println( "我是father非静态块1" );
  }
 
  {
  system.out.println( "我是father非静态块2" );
  }
 
  static
  {
  system.out.println( "我是father静态块" );
  }
 
}

输出 。

我是father静态块 我是statictest的静态块 我是father非静态块1 我是father非静态块2 我是father构造函数 我是statictest的非静态块 我是statictest的构造函数 我是father非静态块1 我是father非静态块2 我是father构造函数 我是statictest的非静态块 我是statictest的构造函数 。

加载顺序 :父类静态块 > 子类静态块 > 父类非静态块 > 父类构造函数 > 子类非静态块 > 子类构造函数 。

静态代码块以及非静态代码块都会在构造函数前执行,首次访问时,静态代码块会在非静态代码块前执行.

改变main函数 。

public static void main(string[] args) {         } 。

输出 。

我是father静态块 我是statictest的静态块 。

静态代码块在类加载时自动执行,非静态代码块是在创建对象时自动执行的代码,不创建对象不执行该类的非静态代码块.

静态导入 。

静态导入是jdk5引入的新特性,有时我们在实际应用中,并不需要整个jar包都导入,而只是想使用某部分函数。提高代码的阅读性,更好的理解程序.

?
1
2
3
4
5
6
7
8
9
10
import static java.lang.system.out;
 
public class statictest
{
  public static void main(string[] args)
  {
  out.println( "import static测试" );
     system.out.println( "import static测试" );
  }
}

输出 。

import static测试 import static测试 。

会发现,两者输出是没有区别的,但是我们少写了system. 虽然允许这么使用,但在实际开发中,我很少发现有同事这么做,主要是不利于理解,但好处是如果频繁用这个类,可以少很多的类名.

=============================================================== 。

如发现错误,请及时留言,lz及时修改,避免误导后来者。感谢!!! 。

最后此篇关于实例解析Java关于static的作用的文章就讲到这里了,如果你想了解更多关于实例解析Java关于static的作用的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com