static相关知识点详解

文章目录

  • [一. 修饰成员变量](#一. 修饰成员变量)
  • [二. 修饰成员方法](#二. 修饰成员方法)
  • [三. 修饰代码块](#三. 修饰代码块)
  • [四. 修饰类](#四. 修饰类)

一. 修饰成员变量

static 修饰的成员变量,称为静态成员变量,该变量不属于某个具体的对象,是所有对象所共享的。

javascript 复制代码
public class Student {
    private String name;
    private static String classRoom="106";

    public static void main(String[] args) {
        // 方法一:静态成员变量可以直接通过类名访问
        System.out.println(Student.classRoom);

        //方法二:静态成员变量也可以通过对象访问,但是classRoom是三个对象共享的
        Student s1=new Student();
        Student s2=new Student();
        Student s3=new Student();
        System.out.println(s1.classRoom);
        System.out.println(s2.classRoom);
        System.out.println(s3.classRoom);

    }
}

由以上代码可知:

【静态成员变量特性】:

  1. **不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中。
  2. 既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问。
  3. 类变量存储在方法区当中。
  4. 生命周期伴随类的一生(即:随类的加载而创建,随类的卸载而销毁)。

二. 修饰成员方法

被 static 修饰的成员方法称为静态成员方法,是类的方法,不是某个对象所特有的。在类外部,静态成员一般是通过静态方法访问的。

javascript 复制代码
public class Student {
    private String name;
    private static String classRoom="106";

    public static String getClassRoom(){
        return classRoom;
    }
}
class TestStudent{
    public static void main(String[] args) {
        Student s1=new Student();
        System.out.println(Student.getClassRoom());

    }
}

由以上代码可知:

【静态方法特性】:

  1. 不属于某个具体的对象,是类方法。
  2. 可以通过对象调用,也可以通过**类名.静态方法名(...)**方式调用,更推荐使用后者。


  1. 不能在静态方法中访问任何非静态成员变量


  1. 静态方法中不能调用任何非静态方法。
  2. 静态方法无法重写,无法实现多态。

三. 修饰代码块

静态成员变量一般不会放在构造方法中来初始化,构造方法中初始化的是与对象相关的实例属性。那么静态成员变量该如何实现初始化呢?

1. 就地初始化:在定义时直接给出初始值

javascript 复制代码
private static String classRoom="106";

2. 静态代码块初始化

使用 static 定义的代码块称为静态代码块。一般用于初始化静态成员变量。

javascript 复制代码
public class Student {
    private String name;
    private static String classRoom;

    static {
        classRoom="106";
    }

    public static void main(String[] args) {
        System.out.println(Student.classRoom);
    }
}


这里有几点需要注意:

  • 静态代码块不管生成多少个对象,其只会执行一次。
  • 静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的。
  • 如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次执行(合并)实例代码块只有在创建对象时才会执行。

四. 修饰类

被 static 修饰的内部成员类称为静态内部类。

javascript 复制代码
public class OutClass {
    private int a;
    private static int b;
    public void methodA(){
        a=10;
        System.out.println(a);
    }
    public static void methodB(){
        System.out.println(b);
    }

    //静态内部类
    static class InnerClass{
        public void methodInner(){

            //a=100;//编译失败,在内部类中只能访问外部类的静态成员变量
            b=200;
            //methodA();//编译失败,因为methodB()不是静态成员方法
            methodB();

        }
    }

    public static void main(String[] args) {
        //静态内部类对象创建
        OutClass.InnerClass innerClass=new OutClass.InnerClass();
        innerClass.methodInner();
    }
}


这里有几点需要注意:

  • 在静态内部类中只能访问外部类中的静态成员。
  • 创建静态内部类对象时,不需要先创建外部类对象。

如果我们一定要访问外部类中的非静态成员呢?

我们可以通过在静态内部类内创建外部类对象,然后通过该对象去访问。

代码示例如下:

javascript 复制代码
static class InnerClass{
        public void methodInner(){
           OutClass outClass=new OutClass();
           outClass.a=10;
           outClass.methodA();

  		}
}
相关推荐
计算机程序设计小李同学几秒前
基于位置服务的二手图书回收平台
java·前端·vue.js·spring boot·后端
Whisper_Sy1 分钟前
Flutter for OpenHarmony移动数据使用监管助手App实战 - 月报告实现
android·开发语言·javascript·网络·flutter·ecmascript
灰灰勇闯IT2 分钟前
【Flutter for OpenHarmonyDart 入门日记】第5篇:字典类型 Map 与动态类型 dynamic 全解析
开发语言·javascript·ecmascript
leaves falling2 分钟前
c语言- 有序序列合并
c语言·开发语言·数据结构
雨季6665 分钟前
Flutter for OpenHarmony 入门实践:从 Scaffold 到 Container 的三段式布局构建
开发语言·javascript·flutter
青云交5 分钟前
Java 大视界 -- 基于 Java+Flink 构建实时风控规则引擎:动态规则配置与热更新(446)
java·nacos·flink·规则引擎·aviator·实时风控·动态规则
Dreamy smile6 分钟前
JavaScript 继承与 this 指向操作详解
开发语言·javascript·原型模式
副露のmagic8 分钟前
更弱智的算法学习 day53
开发语言·python
想逃离铁厂的老铁8 分钟前
Day51 >> 99、计数孤岛 + 100、最大岛屿面积
java·服务器
HellowAmy8 分钟前
我的C++规范 - 回调的设想
开发语言·c++·代码规范