一文带你快速了解java中的static关键词

作者:java鲨鱼 时间:2022-06-03 16:03:58 

目录
  • Static基本规则:

  • 1. static方法

  • 2. static变量

  • 3. static代码块

  • 4. static内部类

  • 5. static静态导入

  • 6. 实现单例

  • 7. 一些注意事项:

Static基本规则:

(1)一个类的静态方法只能访问静态属性。

(2)一个类的静态方法不能直接调用非静态方法。

(3)如果访问权限允许,static属性和方法可以使用对象加'.'方式调用,当然也可以使用实例加'.'方式调用。

(4)静态方法中不存在当前对象,所以不能使用this,当然也不能使用super。

(5)静态方法不能被非静态方法覆盖。

(6)构造方法不允许被声明为static的。

static关键词,可以加在方法上,成员变量上,代码块。 类就不要想了。

1. static方法

static方法可以在类没有实例化的情况话直接访问。 在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。

2. static变量

static变量也称作静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。

static成员变量的初始化顺序按照定义的顺序进行初始化。

static变量只会有一个内存空间,虽然后多个实例,但这些实例中的static变量会共享同一个内存空间。所以静态变量的值发生变更要格外注意,以免造成不必要的“bug”。

static变量是在类装载的时候就被初始化的。

3. static代码块

可以用来初始化一些成员信息。


public class testClassA {
public static int val = 1;
static {
System.err.println("11:" + val);
val = 2;
System.err.println("22:" + val);
}
public static int getVal() {
return val;
}
}
System.err.println(testClassA.getVal());

结果:

11:1
22:2
2

4. static内部类

为何要用内部类?

1). 内部类一般只为其外部类使用;

2). 内部类提供了某种进入外部类的窗户;

3). 也是最吸引人的原因,每个内部类都能独立地继承一个接口,而无论外部类是否已经继承了某个接口。因此,内部类使多重继承的解决方案变得更加完整。


public class ClassA {
public static String val = "1";

public ClassA() {
}
public static class ClassB {//静态内部类
public static int bVal = 2;
}

public class ClassC {
public ClassC()
{

}

private void name() {
System.err.println("abc");
}
}
}

5. static静态导入

静态导包是为了简化代码,提高代码的阅读性,但是如果滥用阅读性会很糟糕。

对于静态导入,一定要遵循两个规则(来自下面的资料):

不使用*(星号)通配符,除非是导入静态常量类(只包含常量的类或接口)。
方法名是具有明确、清晰表象意义的工具类。


import static java.lang.System.*;

public class testClass {
public static void main(String[] args) {
err.println();//这里就不用system.err.println()了。
}
}

6. 实现单例


public class ClassA {

private static ClassA instance = null;

public static synchronized ClassA getInstance() {//静态方法生成实例 懒汉模式 用到的时候再实例化
if (instance == null) {
instance = new ClassA();
}
return instance;
}

public void test() {
System.err.println(1);
}
}

public class ClassA {

private static ClassA instance = new ClassA();// 饿汉模式,直接生成实例

public static ClassA getInstance() {

return instance;
}

public void test() {
System.err.println(1);
}
}

//使用volatile关键词,单例模式最优解决方案,不支持旧版jdk


public class ClassA {

private volatile static ClassA instance = null;

public static ClassA getInstance() {
if (instance == null) {
synchronized (ClassA.class) {
if (instance == null) {
 instance = new ClassA();
}
}
}
return instance;
}

public void test() {
System.err.println(1);
}
}

//静态内部类实现单例模式 兼容旧版jdk
public class ClassA {
private ClassA() {

}

private static class InstanceClass {
private static ClassA instance = new ClassA();
}

public static ClassA getInstance() {
return InstanceClass.instance;
}最新2020整理收集的很多干货,包含mysql,netty,spring,线程,spring cloud、jvm、源码、算法等详细讲解,需要获取这些内容的朋友加Q君样:756584822

public void test() {
System.err.println(1);
}
}
ClassA.getInstance().test(); //使用方法

7. 一些注意事项:

1. 静态的成员变量可以被实例化后的类对象访问,静态方法也可以被对象访问,但是会有警告。

2. 局部变量不可以static。

3. static代码块优先于构造函数。

来源:https://blog.csdn.net/shayukaifa/article/details/110940755

标签:java,static,关键词
0
投稿

猜你喜欢

  • springboot基于docsify 实现随身文档

    2023-04-25 04:52:23
  • Java rmi远程方法调用基本用法解析

    2023-02-20 08:44:19
  • Unity实现仿3D轮转图效果

    2023-11-24 12:26:56
  • 轻松学习C#的String类

    2021-06-21 02:03:06
  • Java实现年兽大作战游戏详解

    2023-11-08 04:28:05
  • Android APK应用安装原理解析之AndroidManifest使用PackageParser.parserPackage原理分析

    2023-05-19 23:58:18
  • Kotlin的::符号怎么用

    2022-07-13 22:59:37
  • Android 7.0新特性详解

    2022-10-10 07:11:56
  • mybatis中<choose>标签的用法说明

    2023-07-22 19:37:27
  • MyBatis-Plus多表联查的实现方法(动态查询和静态查询)

    2023-11-23 22:26:45
  • Java常用函数式接口总结

    2022-02-02 00:02:50
  • Android usb设备权限查询及自动获取详解流程

    2022-01-12 08:40:39
  • 详解Java中Callable和Future的区别

    2023-07-25 21:18:58
  • C#中WPF ListView绑定数据的实例详解

    2023-03-11 12:08:41
  • C#实现合并多个word文档的方法

    2022-10-02 08:32:39
  • android多开器解析与检测实现方法示例

    2022-04-01 11:43:15
  • ElasticSearch学习之ES Mapping实战示例

    2023-11-25 06:12:25
  • RxJava2.x实现定时器的实例代码

    2023-08-06 17:41:01
  • C# 崩溃异常中研究页堆布局的详细过程

    2022-11-06 17:04:08
  • Android开发实现NFC刷卡读取的两种方式

    2023-01-14 13:00:07
  • asp之家 软件编程 m.aspxhome.com