首页 > 其他分享 >Static关键字详解

Static关键字详解

时间:2024-08-22 13:55:25浏览次数:11  
标签:name System 关键字 详解 static println Static public String

Static关键字是什么

static修饰的代码属于类

定义的变量存储在方法区的静态常量池当中

java为什么要设置static关键字?

因为要方便类去使用自己的方法和变量

例如:

1.方法和变量上面没有static关键字

package Work1;

public class A {
    public  String name="张三";
    public void run(){
        System.out.println("跑得很快");
    }
    public void fly(){
        System.out.println("飞得很高");
    }
    //这些代码以信息的形式存储在内存方法区当中(是二进制的代码),只有创建对象时,这些非静态的方法和变量才会有独立的存储空间,被对象调用
}

这些代码以信息的形式存储在内存方法区当中(是二进制的代码),只有创建对象时,这些非静态的方法和变量才会有独立的存储空间,被对象调用

package Work1;

public class Test {
    public static void main(String[] args) {
    //假设方法和变量上面没有static关键字
        A a=new A();
        a.run();
        a.fly();
        a.name="aaa";//只能由对象调用
        //如果方法和变量属于非静态方法,他们只有在对象当中,才会被分配内存空间,那么也就是只能由对象才能调用
       //如果没有static关键字,那么类是不可以调用自己的属性和方法的,只能用对象去调用

    }
}

如果没有static关键字,方法和变量属于非静态方法,那么类是不可以调用这些属性和方法的,只能用对象去调用

堆栈内存图如下

方法和变量上面有static关键字修饰

public class A {
    public static String name="张三";
    public static void run(){
        System.out.println("跑得很快");
    }
    public static void fly(){
        System.out.println("飞得很高");
    }

}
package Work1;

public class Test {
    public static void main(String[] args) {

        A a=new A();
        a.run();
        a.fly();
        a.name="aaa";
        //对象来源于类,那么对象可以使用类的信息,因此可以通过调用方法和变量
        //可以直接用类调用
        A.name="bbb";
        A.run();
        A.fly();
        //因为在方法区的静态常量池当中由独立的内存空间


    }
}

因为在方法区的静态常量池当中由独立的内存空间,可以直接用类调用。对象来源于类,那么对象可以使用类的信息,因此可以通过调用方法和变量 。

堆栈内存图:

Static关键字如何使用?

staic修饰变量

package Work1;

public class A {
    //static修饰的变量属于类变量,存储在方法区的静态常量池当中,被所有对象所共享
    public static String name="张三";
    public String address="保定";

    @Override
    public String toString() {
        return "A{" +
                "address='" + address + '\'' +
                "name='" + name + '\'' +
                '}';
    }
}
public class Test {
    public static void main(String[] args) {

        A a1=new A();
        A a2=new A();
        a1.address="北京";
        a1.name="aaa";
        a1.address="上海";
        a1.name="bbb";
        System.out.println(a1.toString());
        System.out.println(a2.toString());



    }
}

修饰方法

1.静态方法(static修饰的方法)无法调用非静态方法

解决方案:

1.在非静态方法上加上static关键字 

2.在main1方法当中创建对象,让对象调用非静态方法

2.在非静态方法可以调用静态方法

原因:非静态方法想要表达,已经创建了对象,那么静态方法一定存在, 有对象一定有类

修饰代码块

1.在main方法运行之前运行,目的是优化程序

例1

程序执行流程:

1.首先main方法入栈

2.main方法会调用hhh方法,hhh方法会将静态常量池中的a的值赋给入参

3.a++入参的值变为1

4.然后hhh方法出栈

5.继续执行main函数中的System.out.println(a); 输出静态常量池当中a的值

例2

程序执行流程:

1.首先main方法入栈

2.创建一个A类的对象a1

3.调用及静态常量池当中的hhh()方法入栈

4.将对象a1的私有属性a赋给入参

5.执行hhh()方法当中的return a++:入参加1变为1

6.hhh()出栈

7.继续执行main方法当中的

System.out.println(a);输出对象a1的私有属性a

例3
package Work1;

public class E {
    public E(String a){
        System.out.println("===="+a);
    }
    static {
        System.out.println("11");

    }
    public static E e=new E("+++");
    static{
        System.out.println("22");
    }
}

class T {
    public static void main(String[] args) {
      E e=new E("----");
    }
}

程序执行的流程:

扫描-------->加载(编译)--------->运行

main在哪里先扫描哪个类

1.首先扫描Test类,发现其没有父类,也没有static修饰的代码,那么先编译Test类,并且将main方法入栈

2.执行new E("----"); 在执行之前,先扫描E类发现其没有父类,在编译的过程中,static修饰的代码块按顺序优先执行

3.static {

System.out.println("11");

}先执行该static代码块,输出“11”

4.再执行public static E e=new E("+++");此时会涉及到E类当中的构造方法,输出“====++++”

5.最后执行

static{

System.out.println("22");

}输出“22”

6.编译阶段完毕,回到main方法当中,继续执行new E("----");现在可以创建对象,真正运行

7.通过调用构造器创建对象,输出“====----”

例4
package work2;

public class Test {
    public static void main(String[] args) {
        Person p1=new Person();
        Person p2=new Person();
        p1.name="李四";
        p1.address="北京";
        p2.name="张三";
        p2.address="上海";
        System.out.println(p1.toString());
        System.out.println(p2.toString());

    }
}
package work2;

public class Person {

    public  String name;

    //static修饰符修饰的代码属于类代码,没有static修饰的代码属于对象
    public static String address="保定";

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                "address='" + address + '\'' +
                '}';
    }
}

类信息是存储在方法区当中的

static修饰的代码会存储在方法区的静态常量池当中

程序执行流程

1.main方法入栈

2.创建p1 p2两个对象

3.最开始将p1,p2两个对象的name均为“张三”

4.给p1变量的name赋值,address赋值

5.给p1变量的name赋值,address赋值

如果static修饰方法,方法也是共享的,类似于工具被使用

例5
package work2;

public class Test {
    public static void main(String[] args) {
        Person p1=new Person();
        Person p2=new Person();
        p1.name="李四";
        p1.address="北京";
        p1.run("100");
        p2.name="王五";
        p2.address="上海";
        p2.run("200");
        System.out.println(p1.toString());
        System.out.println(p2.toString());

    }
}

package work2;

public class Person {

    public  String name;

    //static修饰符修饰的代码属于类代码,是被对象所共享的,没有static修饰的代码属于对象
    public static String address="保定";
    public static void run(String num){
        System.out.println("跑了"+num+"米");
    }
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                "address='" + address + '\'' +
                '}';
    }
}

run方法入栈执行

static修饰的变量是被所有类所共享的

欢迎点赞,收藏,和关注呦!!!

标签:name,System,关键字,详解,static,println,Static,public,String
From: https://blog.csdn.net/2301_81453175/article/details/141425778

相关文章

  • Redis 数据类型详解
    Redis是一个开源的内存数据结构存储系统,广泛应用于缓存、消息队列、实时数据分析等场景。Redis提供了多种数据类型,本文将详细介绍Redis的五种主要数据类型及其应用场景,并从概述、基本操作、应用场景和数据结构等方面进行深入探讨。1.字符串(String)概述字符串是Redis......
  • MySQL 数据类型详解
    MySQL是一种广泛使用的关系型数据库管理系统,它支持多种数据类型以满足各种应用场景的需求。本文将详细介绍MySQL支持的数据类型、它们的使用场景以及实现原理,并通过图示帮助读者更直观地理解。目录简介数值类型整型浮点型定点型日期和时间类型字符串类型字符串二进制字......
  • 位运算符-按位取反运算符补充详解
    位运算符在计算机中用于直接操作整数的二进制位的运算符。这些运算符通常用于低级编程和优化特定类型的计算任务。以下是几种常见的位运算符及其解释:按位与(&):对应位都是1时结果为1,否则为0。例如:0101&0111=0101按位或(|):只要对应位有一个是1,结果就为1。例如:0101|0111=......
  • Java——三个关键字 static 2
    1.简介在Java中,static表示“静态的”,它也是一种修饰符,可以修饰属性、方法、代码块和内部类。2.特性static修饰符具有如下特性:● 被static修饰的属性(成员变量)称为静态变量,也叫做类变量;● 被static修饰的常量称为静态常量;● 被static修饰的方法称为静态方法,也叫做类......
  • 为什么用Vite框架?来看它的核心组件案例详解
    Vite是一个前端构建工具,它以其快速的开发服务器和生产优化的打包器而闻名前端界,今天的内容,必须得唠唠Vite的关键能力,以下是Vite的核心组件分析,以及使用案例:原理分析:Vite利用了现代浏览器对ESModule语法的支持,在开发环境中不进行打包编译,而是通过启动本地devServer......
  • cnhw06s.dll谜团揭秘:硬件加速支持的权威修复策略详解
    解决cnhw06s.dll文件丢失的问题,可以尝试以下步骤来恢复硬件支持功能:1.系统还原:•如果你知道DLL文件丢失前的一个还原点,可以尝试使用Windows的系统还原功能回到那个状态。2.重新安装相关软件:•cnhw06s.dll通常与某些硬件相关的软件或驱动程序关联。尝试确定该DLL属于哪个程......
  • 触摸输入故障深度剖析:tiptsf.dll修复的高级策略详解
    针对tiptsf.dll文件丢失或损坏导致的触摸输入问题,可以采取以下专业修复步骤:1.安全模式启动:首先,尝试重启计算机进入安全模式。这有助于防止加载可能干扰修复过程的第三方服务。2.系统还原点:检查是否有最近的系统还原点。通过“控制面板”->“系统”->“系统保护”->......
  • 提升代码迭代速度的Python重载方法使用详解
        概要在Python编程中,模块是组织代码的重要工具,它们使得代码更加模块化和易于维护。在开发和调试过程中,有时需要对已经导入的模块进行修改并重新加载以应用更改。Python提供了一个名为reload的模块,用于在不重新启动解释器的情况下重新加载已经导入的模块。本文将详......
  • Python代码部署之用Kubernetes实现自动化详解
    概要在现代软件开发中,容器化和微服务架构逐渐成为主流,而Kubernetes则是管理容器化应用的事实标准。Kubernetes(简称K8s)提供了自动化部署、扩展和管理容器化应用的强大功能。本文将详细介绍如何使用Kubernetes来部署Python代码,包括Kubernetes的基本概念、部署流程,以及通过示例......
  • C++ queue(STL queue,队列)用法详解
    只能访问queue<T>容器适配器的第一个和最后一个元素。只能在容器的末尾添加新元素,只能从头部移除元素。许多程序都使用了queue容器。queue容器可以用来表示超市的结账队列或服务器上等待执行的数据库事务队列。对于任何需要用FIFO准则处理的序列来说,使用queue容器适......