java中static关键字的作用_Java:Java中static关键字作用

java中static关键字的作用_Java:Java中static关键字作用static关键字最基本的用法是:1、被static修饰的变量属于类变量,可以通过类名.变量名直接引用,而不需要new出一个类来2、被static修饰的方法属于类方法,可以通过类名.方法名直接引用,而不需要new出一个类来3、被static修饰的变量、被static修饰的方法统一属于类的静态资源,是类实例之间共享的。@JDK把不同的静态资源放在了不同的类中为什么不把所有静态资源放在一个类里面呢?…

大家好,又见面了,我是你们的朋友全栈君。

static关键字最基本的用法是:

1、被static修饰的变量属于类变量,可以通过类名.变量名直接引用,而不需要new出一个类来

2、被static修饰的方法属于类方法,可以通过类名.方法名直接引用,而不需要new出一个类来

3、被static修饰的变量、被static修饰的方法统一属于类的静态资源,是类实例之间共享的。

@ JDK把不同的静态资源放在了不同的类中为什么不把所有静态资源放在一个类里面呢?

主要有以下几个原因:

1、不同的类有自己的静态资源,这可以实现静态资源分类。比如和数学相关的静态资源放在java.lang.Math中,和日历相关的静态资源放在java.util.Calendar中,这样就很清晰了

2、避免重名。不同的类之间有重名的静态变量名、静态方法名也是很正常的,如果所有的都放在一起不可避免的一个问题就是名字重复,这时候怎么办?分类放置就好了。

3、避免静态资源类无限膨胀,这很好理解。

静态方法不可以引用非静态资源

例如下面代码:

public class A

{

private int i = 1;

public static void main(String[] args)

{

//报错,静态方法内不能引用非静态属性

i = 1;

}

}

非静态方法里面可以引用静态资源

示例:

public class A

{

//静态属性

private static int i = 1;

//非静态方法

public void main(String[] args)

{

i = 1;

}

}

静态资源属于类,但是独立于类存在的。从JVM的类加载机制的角度讲,静态资源是类初始化的时候加载的,而非静态资源是类new的时候加载的。

静态块

静态块也是static的重要应用之一。也是用于初始化一个类的时候做操作用的,和静态变量、静态方法一样,静态块里面的代码只执行一次,且只在初始化类的时候执行。

需要注意的三点:

1、Static修饰的方法执行顺序是怎么样的?

public class A

{

private static int a = B();

static

{

System.out.println(“Enter A.static block”);

}

public static void main(String[] args)

{

new A();

}

public static int B()

{

System.out.println(“Enter A.B()”);

return 1;

}

}

输出结果:

Enter A.B()

Enter A.static block

结论:静态资源的加载顺序是严格按照静态资源的定义顺序来加载的。

2、静态变量的赋值与创建

public class A

{

static

{

c = 3;

//报错

System.out.println(c);

}

private static int c;

}

报错信息“Cannot reference a field before it is defined”。

结论:静态代码块对于定义在它之后的静态变量,可以赋值,但是不能访问。

3、继承类中静态代码块的加载顺序

public classA

{static{

System.out.println(“A.static block”);

}publicA()

{

System.out.println(“A.constructor()”);

}

}

public class B extendsA

{static{

System.out.println(“B.static block”);

}publicB()

{

System.out.println(“B.constructor()”);

}public static voidmain(String[] args)

{newB();newB();

}

}

输出结果:

A.staticblock

B.staticblock

A.constructor()

B.constructor()

A.constructor()

B.constructor()

结论:静态代码块是严格按照父类静态代码块->子类静态代码块的顺序加载的,且只加载一次。

注意:static一般情况下来说是不可以修饰类的,如果static要修饰一个类,说明这个类是一个静态内部类(注意static只能修饰一个内部类),也就是匿名内部类。

import static

这个比较冷门,基本很少看见有地方用,使用JUnit可能会用到,写assert的时候会方便些。import static是JDK1.5之后的新特性,这两个关键字连用可以指定导入某个类中的指定静态资源,并且不需要使用类名.资源名,可以直接使用资源名。注意一下,import static必须这么写,而不能写成static import。举个例子来看一下:

import static java.lang.Math.*;

public class A

{

public static void main(String[] args)

{

System.out.println(sin(2.2));

}

}

这样写意味着我导入了Math下的所有静态资源,main函数里面我就可以直接用sin(2.2)而不需要使用Math.sin(2.2)了。注意一下,要写import static java.lang.Math.*,最后的“.*”不可少,有了这两个字符才意味着导入的是Math下的所有静态资源,写成import static java.lang.Math是有问题的。当然,我们也可以指定只导入某个静态资源,比如只导入Math下sin这个方法而不导入Math下的所有静态资源:

import staticjava.lang.Math.sin;public classA

{public static voidmain(String[] args)

{

System.out.println(sin(2.2));

}

}

对于import static,个人的态度是:

1、简化了一些操作,比如静态导入Math下的所有静态资源,在频繁使用Math类下静态资源的地方,可以少些很多“Math.”

2、降低了代码的可读性

建议在某些场景下导入特定的静态资源,不建议使用“.*”的导入方式。

知识点:

1、Java中的static关键字不会影响到变量的变量或者方法的作用域。

2、虽然对于静态方法来说没有this,但是我们在非静态方法中能够通过this访问静态方法成员变量。

示例:

public class Test {

//静态变量

static int value = 11;

//静态方法

public static void main(String[] args) {

new Test().printValue();

}

//非静态方法

private void printValue() {

int value = 22;

//运用this访问静态变量

System.out.println(this.value);

}

}

输出结果为:11

这里的this表示的是当前对象,那么通过new Test()来调用printValue的话,当前对象就是通过new Test()生成的对象。而static变量是被对象所享有的,因此在printValue中的this.value的值毫无疑问是11。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/156764.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • idea 正则表达式替换「建议收藏」

    idea 正则表达式替换「建议收藏」例如,现在有一个函数getView(o,’m’,’orderNum’,’s’),这个函数的调用有很多地方,有一天我们想给这个函数加一个默认参数,让它变成getView(o,’m’,’orderNum’,’s’,’*’),一个一个加太麻烦了,我们就用idea自带的正则表达式替换功能来实现。首先按Ctrl+R,打开替换对话框,然后在上面输入getView\((.+)\),下面输…

    2022年5月17日
    318
  • java swing图形化界面_javagui界面设计

    java swing图形化界面_javagui界面设计JavaSwingGUI图形界面窗口开发基础教程,本教程将系统性地详细介绍Swing开发中常用的一些组件、布局管理器等相关知识技术,并且每章节都将通过代码实例展示实际应用。Swing是Java为图形界面应用开发提供的一组工具包,是Java基础类的一部分。Swing包含了构建图形界面(GUI)的各种组件,如:窗口、标签、按钮、文本框等。Swing提供了许多比AWT更好的屏幕显示元素,使用纯Java实现,能够更好的兼容跨平台运行。JavaSwing图形界面开发目录

    2022年8月23日
    9
  • Java Jsoup 解析处理百度谷歌搜索结果的示例代码

    Java Jsoup 解析处理百度谷歌搜索结果的示例代码本文主要介绍Java中,通过Jsoup来解析百度和谷歌中的搜索结果,获取搜索到的链接url和标题title的方法,以及相关的示例代码。原文地址:JavaJsoup解析处理百度谷歌搜索结果的示例代码

    2022年6月15日
    47
  • 汉诺塔递归算法流程图_汉诺塔算法递归表达式

    汉诺塔递归算法流程图_汉诺塔算法递归表达式(5)练习3—汉诺塔(Hanoi)编程实现把A的n个盘子移动到C(盘子编号是[1,n])每次只能移动1个盘子大盘子只能放在小盘子下面1、汉诺塔—1个盘子2、汉诺塔—2个盘子3、汉诺塔—3个盘子3、汉诺塔—思路其实分2种情况讨论即可(1)当n==1时,直接将盘子从A移动到C(2)当n>1时,可以拆分成3大步骤①将n–1个盘子从A移动到B②将编号为n的盘子从A移动到C③将n–1个盘子从B移动到C

    2025年8月5日
    3
  • 币圈新手入门教程 怎么样投资数字货币[通俗易懂]

    币圈新手入门教程 怎么样投资数字货币[通俗易懂]普通人怎么投资数字货币?最近和几位朋友聊到数字货币,发现很多人虽然都想入场交易,但实际上还不是很了解这个东西,这对于新手来说,是非常危险的!笔者尽管现在主要做的是外汇,但是曾经也炒币有一段时间,今天就以自己的经验,给各位币圈新手做个入门普及。数字货币说到数字货币,先要了解区块链,数字货币实际上是区块链的一个产物,数字货币都是由区块链技术产生的,而区块链技术近几年的快速发展,也推动了数字货币…

    2022年8月29日
    2
  • ext.apply()_vba中evaluate使用方法

    ext.apply()_vba中evaluate使用方法EXT.applyEXT.apply方法详解EXT.apply方法详解apply的用法:Ext中apply及applyIf方法的应用apply及applyIf方法都是用于实现把一个对象中的属性应用于另外一个对象中,相当于属性拷贝。不同的是apply将会覆盖目标对象中的属性,而applyIf只拷贝目标对象中没有而源对象中有的属性。apply方法的签名为“apply(Objectobj,Objectconfig,Objectdefaults):Object”,该方法包含

    2022年7月28日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号