浅谈java中static关键字修饰的几种用法

简介: 浅谈java中static关键字修饰的几种用法

在java的关键字中,static和final是两个我们必须掌握的关键字。不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构。下面我们先来了解一下static关键字及其用法。

static关键字

1,修饰成员变量

类,里面有属性和方法

属性里面又分局部变量,实例变量和类变量


实例变量,在创建对象的时候分配空间初始化

类变量不再属于某一个对象,它属于全类公有;

实例变量和类变量区分主要看加不加static,统称变量

属性和方法合称为成员


所以这里我再次区分一下,

(1),static修饰变量时的用法:

static修饰的变量叫做类变量

//类变量不再属于某一个对象,它属于全类公有;

static int b = 20;

类变量是在类加载的时候初始化的;

什么是类加载:

所有数据都是存在虚拟机内存里面

jvm启动后,在程序之执行的过程中,肯定会用到很多的类

.class文件的读取过程只有一次,在第一次用到这个类的时候;这就是类的加载

类加载:当虚拟机第一次使用一个类时,需要通过Classpath找到这个类对应的.class文件

把这个文件中包含的类的信息读jvm并保存起来。

一般的说,一个类只会加载一次;

所有的类变量是在类加载的时候分配空间,并且初始化!


类加载的时机:

1,创建类的对象

2,访问类的静态成员

3,加载子类必须先加载父类

4,如果仅仅是声明类的引用,不会类加载;


(2)修饰成员方法

static的另一个作用,就是修饰成员方法。相比于修饰成员属性,修饰成员方法对于数据的存储上面并没有多大的变化,因为我们从上面可以看出,方法本来就是存放在类的定义当中的。static修饰成员方法最大的作用,就是可以使用"类名.方法名"的方式操作方法,避免了先要new出对象的繁琐和资源消耗,我们可能会经常在帮助类中看到它的使用:


static修饰的静态方法:允许直接用类名调用

在静态方法中,只能访问类的静态成员

  • 静态方法中不能直接访问本类非静态成员(方法和属性)
  • 非静态方法中可以去访问静态成员
  • 静态方法中不能使用this和super关键字
  • 静态方法可以被覆盖,但是只能被静态方法覆盖, 而且 没有多态

(3),初始代码块

静态初始代码块中的代码,在类加载的时候执行一次;

其中,
局部变量
构造方法
等都不能静态

(4)

父类的静态方法只能被子类的静态方法覆盖

为便于理解下面程序加了详细注释说明,每一种使用都有详细标注,相信把下面这个程序看懂就能理解static的具体用法了!

   package test;
    public class TestStatic{
    /**
    static   静态的
    修饰的   1,属性
        2,方法
        3,初始代码块
     */
      public static void main(String[] args) {
         MyClass m1 = new MyClass();
         MyClass m2 = new MyClass();
         m1.a++;
         m1.b++;
         System.out.println(m1.a);//11
          System.out.println(m1.b);//21
         System.out.println(m2.a);//10
         System.out.println(m2.b);//21
         //类变量允许直接用类名访问,与对象无关
         System.out.println(MyClass.b);//21
         //静态方法:允许直接用类名调用
         MyClass.print(); 
         //如果不是静态方法,需要创建对象然后通过对象去调用
         MyClass mc = new MyClass();
         mc.prints();
        System.out.println("****************************");
         //静态初始代码块中的代码,只在类加载的时候执行一次;
         /* 所以就算两次创建,也只会输出
          hahahha
           MyClass2()
           MyClass2()  */
         new MyClass2();
         new MyClass2();
         //多态
         Super s = new Sub();
         //对一个引用,调用其静态方法,仅相当于对引用的引用类型调用静态方法
         //例, s.method();等价于Super.method();
         s.method();//输出Super  
         /*根据以往学的多态的知识,此处应该打印Sub;
         //所以,静态方法可以被子类的静态方法覆盖,而且没有多态
         //没有多态,是指多态三条原则中的第三条不再适用,
         //不会根据对象实际类型去找子类覆盖之后的方法
         //即,静态方法的覆盖没有多态,*/
         Super s2 = null;
         s2.method();     
      }
    }
    class MyClass{
      //实例变量,在创建对象的时候分配空间初始化 
      int a = 10;
    /*  1,属性
      //静态变量   类变量,
      //类变量不再属于某一个对象,它属于全类公有; */
      static int b = 20;
    /*2,方法
      静态方法:允许直接用类名调用
      在静态方法中,只能访问类的静态成员     */
      public static void print(){
        System.out.println("==  ========");
        //在静态方法中,只能访问类的静态成员
        //System.out.println("=========="+a);error!!!
        System.out.println("=========="+b);//true
          //访问myclass类对象的成员就可以了
          MyClass ma = new MyClass();
          System.out.println(ma.a);//true
      }
      //非静态方法
      public void prints(){
        System.out.println("-----------");
      }
    }
     /*3,初始代码块 
      静态初始代码块中的代码,在类加载的时候执行一次; */
    class MyClass2{
      static{
        System.out.println("hahahha");
      }
      public MyClass2(){
        System.out.println(" MyClass2()");
      }
    }
    /*  局部变量, 类, 构造方法
    等都不能静态     */   
    //父类的静态方法只能被子类的静态方法覆盖
    class Super{
      public static void method(){
        System.out.println("Super");
      }
    }
    class Sub extends Super{
      public static void method(){
        System.out.println("Sub");
      }
    }

总结:

static是java中非常重要的一个关键字,而且它的用法也很丰富,主要有四种用法:


用来修饰成员变量,将其变为类的成员,从而实现所有对象对于该成员的共享;


用来修饰成员方法,将其变为类方法,可以直接使用“类名.方法名”的方式调用,常用于工具类;


静态块用法,将多个类成员放在一起初始化,使得程序更加规整,其中理解对象的初始化过程非常关键;


静态导包用法,将类的方法直接导入到当前类中,从而直接使用“方法名”即可调用类方法,更加方便。


目录
相关文章
|
9天前
|
存储 Java
Java 中的静态(static)
【10月更文挑战第15天】静态是 Java 语言中一个非常重要的特性,它为我们提供了一种方便、高效的方式来管理和共享资源。然而,在使用过程中,我们需要谨慎考虑其优缺点,以确保代码的质量和可维护性。
|
13天前
|
存储 安全 Java
深入理解Java中的FutureTask:用法和原理
【10月更文挑战第28天】`FutureTask` 是 Java 中 `java.util.concurrent` 包下的一个类,实现了 `RunnableFuture` 接口,支持异步计算和结果获取。它可以作为 `Runnable` 被线程执行,同时通过 `Future` 接口获取计算结果。`FutureTask` 可以基于 `Callable` 或 `Runnable` 创建,常用于多线程环境中执行耗时任务,避免阻塞主线程。任务结果可通过 `get` 方法获取,支持阻塞和非阻塞方式。内部使用 AQS 实现同步机制,确保线程安全。
|
21天前
|
Java 程序员
Java 面试高频考点:static 和 final 深度剖析
本文介绍了 Java 中的 `static` 和 `final` 关键字。`static` 修饰的属性和方法属于类而非对象,所有实例共享;`final` 用于变量、方法和类,确保其不可修改或继承。两者结合可用于定义常量。文章通过具体示例详细解析了它们的用法和应用场景。
22 3
|
29天前
|
Java 编译器
在Java中,关于final、static关键字与方法的重写和继承【易错点】
在Java中,关于final、static关键字与方法的重写和继承【易错点】
20 5
|
1月前
|
Java
Java关键字 —— static 与 final 详细解释!一看就懂 有代码实例运行!
这篇文章详细解释了Java中static和final关键字的用法,包括它们修饰类、方法、变量和代码块时的行为,并通过代码示例展示了它们的具体应用。
152 0
Java关键字 —— static 与 final 详细解释!一看就懂 有代码实例运行!
|
2月前
|
存储 Java
Java之静态(static)与实例(instance)
Java之静态(static)与实例(instance)
|
2月前
|
Java
Java 正则表达式高级用法
Java 中的正则表达式是强大的文本处理工具,用于搜索、匹配、替换和分割字符串。`java.util.regex` 包提供了 `Pattern` 和 `Matcher` 类来高效处理正则表达式。本文介绍了高级用法,包括使用 `Pattern` 和 `Matcher` 进行匹配、断言(如正向和负向前瞻/后顾)、捕获组与命名组、替换操作、分割字符串、修饰符(如忽略大小写和多行模式)及 Unicode 支持。通过这些功能,可以高效地处理复杂文本数据。
|
2月前
|
存储 Java 数据处理
Java 数组的高级用法
在 Java 中,数组不仅可以存储同类型的数据,还支持多种高级用法,如多维数组(常用于矩阵)、动态创建数组、克隆数组、使用 `java.util.Arrays` 进行排序和搜索、与集合相互转换、增强 for 循环遍历、匿名数组传递以及利用 `Arrays.equals()` 比较数组内容。这些技巧能提升代码的灵活性和可读性,适用于更复杂的数据处理场景。
|
2月前
|
安全 Java
Java switch case隐藏用法
在 Java 中,`switch` 语句是一种多分支选择结构,常用于根据变量值执行不同代码块。除基本用法外,它还有多种进阶技巧,如使用字符串(Java 7 开始支持)、多个 `case` 共享代码块、不使用 `break` 实现 “fall-through”、使用枚举类型、使用表达式(Java 12 及以上)、组合条件以及使用标签等。这些技巧使代码更加简洁、清晰且高效。
|
3月前
|
Java 数据处理
Java IO 接口(Input)究竟隐藏着怎样的神秘用法?快来一探究竟,解锁高效编程新境界!
【8月更文挑战第22天】Java的输入输出(IO)操作至关重要,它支持从多种来源读取数据,如文件、网络等。常用输入流包括`FileInputStream`,适用于按字节读取文件;结合`BufferedInputStream`可提升读取效率。此外,通过`Socket`和相关输入流,还能实现网络数据读取。合理选用这些流能有效支持程序的数据处理需求。
42 2