大家好,我是考100分的小小码 ,祝大家学习进步,加薪顺利呀。今天说一说java基础之后学什么_java 静态变量,希望您对编程的造诣更进一步.
#static static是java中比较重要也是比较常用的关键字,可能有人对其的大部分用法不是很了解,再次介绍也自己复习一下。 ##static的几种用法
- static修饰变量
- static修饰方法
- static修饰代码块
- static修饰类
- 静态导包 下面从上面的几种用法分别详细介绍:
-
static修饰变量 被static修饰的变量属于类变量,即不需要实例化就可以通过类名.变量名的方法直接引用,并且熟悉JVM类加载机制的同学应该清楚用static修饰的变量在编译过程中就会对其分配内存,故而可以直接引用。那么用static修饰变量的好处在哪呢?个人理解优点在于一般用static修饰的变量都是此类所共有的变量例如我们平时使用的日志类各种LOGGER,不会根据实例对象的不同而产生差别,在不同的该类实例对象中直接调用改变量使用进行日志记录即可,从某种意义上来说是实例共享的变量。
-
static修饰方法 被static修饰的变量属于类变量,那自然被static修饰的方法属于类方法,同理不用实例化就可以用个类名.方法名的方式调用,也是在类加载的时候对此方法进行加载。 综合上面两种修饰方法初学者一般会有几个容易困惑问题:非静态方法中能否调用静态变量?静态方法中能否调用非静态变量或非静态方法?等等。。。解决此类问题的根本其实上面已经提到过了,根本在于静态资源(资源包括变量和方法)与非静态资源是属于类的还是属于对象的,而静态与非静态资源的加载顺序又不同,静态的一般类加载的时候就已进行了资源分配,而非静态的资源一般是对该类进行实例化也就是new对象的时候才进行初始化,那答案就已经明确了:
- 静态方法中可以引用静态变量及静态方法,无法调用非静态的资源,因为此时非静态的资源还没有初始化,没有真正的存在于内存中,无法调用。
- 非静态方法可以调用静态资源,因为非静态方法是在实例对象产生之后才有的,此时静态资源早已分配,可以调用。
-
static修饰类 static修饰类的情况比较少见,一般用于修饰静态内部类。总结语法内部类的时候详细说明。
-
static修饰代码块 与上面提到的静态资源相同,静态代码块也是在类加载的时候进行执行,一般日常使用是用于获取使用该类前所需要做的准备,例如jdbc操作类静态代码块先执行获取jdbc的连接等。
-
static {
System.out.println("get jdbc connection");
}
平时开发中不同类继承有很多,同时它们可能也都具有各自的静态代码块,虽然是在JVM进行类加载的时候执行静态资源加载,但是具体的执行顺序却不够明了,下面通过下面一段代码的执行来一探究竟:
public class TestStatic {
static {
System.out.println("TestStatic static block init");
}
public TestStatic(){
System.out.println("TestStatic constructor run");
}
}
public class TestStaticSub extends TestStatic{
static {
System.out.println("TestStaticSub static block init");
}
public TestStaticSub(){
System.out.println("TestStaticSub constructor run");
}
public static void main(String[] args) {
new TestStaticSub();
new TestStaticSub();
}
}
输出如下:
TestStatic static block init
TestStaticSub static block init
TestStatic constructor run
TestStaticSub constructor run
TestStatic constructor run
TestStaticSub constructor run
从执行结果可知顺序为:先执行父类的静态资源再执行子类的静态资源,且只在类加载时执行一次。 注:同一类中的静态资源按照代码的上下顺序进行加载 5. 静态导包 此类写法比较少用,笔者之前也未了解过看到别人的用法才学习到,是在进行import的时候对后面的包进行static修饰,这样在该类中使用此包中的变量或方法时,无法加上对应的类名即可直接引用。
import static java.lang.Math.abs;
public static void main(String[] args) {
System.out.println(abs(-12));
}
个人感觉这种写法比较少用,而且从某种程度上减弱了代码的可读性,可能只在某些测试用例中为了减少重复类名的书写使用,平时不推荐使用。
笔者水平有限,书写内容如有错误还请读者指正,还免误导大家,不胜感谢。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/13841.html