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。

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • string s=new string(“hello”)_result of string concatenation

    string s=new string(“hello”)_result of string concatenation—問題———我的页面上分别有两个按钮Button1,Button2,和两个编辑框TextBox1,TextBox2,我在PAGE_LOAD里加上下面这行代码后,     TextBox1.Attributes.Add(“onkeydown”,”if(event.keyCode==13){document.all.Button1.click();}”);     实现了对Te

  • acwing-143. 最大异或对(Trie+异或)「建议收藏」

    acwing-143. 最大异或对(Trie+异或)「建议收藏」在给定的 N 个整数 A1,A2……AN 中选出两个进行 xor(异或)运算,得到的结果最大是多少?输入格式第一行输入一个整数 N。第二行输入 N 个整数 A1~AN。输出格式输出一个整数表示答案。数据范围1≤N≤105,0≤Ai<231输入样例:31 2 3输出样例:3#include<bits/stdc++.h>using namespace std;const int N = 31e5 + 10;int trie[N][2],ctx,cnt[N];

  • oralce入门学习[通俗易懂]

    oralce入门学习[通俗易懂]oracle的认识sql数据库语言关键字distinct关键字null连接符||比较运算符排序单行函数字符函数数值函数日期函数转换函数通用函数条件表达式多行函数

  • webpack开发环境和生产环境_环境问题包括

    webpack开发环境和生产环境_环境问题包括前言如果我们需要使用webpack,就需要依赖node环境nvmnodenpmwebpack@cliwebpacknvm安装nvm是一个用来管理node版本的工具。我们之所以需要使用n

  • js在数组指定位置添加元素_java数组删除指定位置元素

    js在数组指定位置添加元素_java数组删除指定位置元素原文链接:Array:InsertanItemataSpecificIndexwithJavaScript原文日期:2014年07月24日翻译日期:2014年07月26日翻译人员:铁锚很多与数组有关的任务听起来很简单,但实际情况并不总是如此,而开发人员在很多时候也用不到他。最近我碰到了这样一个需求:将一个元素插入到现有数组的特定索引处。听起来很容易和常见,但需要一点时间

  • 重复字符串 leetcode_求最长不重复字符串

    重复字符串 leetcode_求最长不重复字符串原题链接给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: s = “abcabcbb”输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。示例 2:输入: s = “bbbbb”输出: 1解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。示例 3:输入: s = “pwwkew”输出: 3解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。 请注意,你的答案必须是 子串 的长度,”pwk

发表回复

您的电子邮箱地址不会被公开。

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