java之static详细总结

news2024/11/20 23:28:28

static也叫静态,可以修饰成员变量、成员方法。

成员变量

按照有无static分为两种:

  • 类变量:static修饰,属于类,与类一起加载一次,在内存中只有一份,会被类的全部对象共享
  • 实例变量(对象变量):无static修饰,属于每个对象的。

代码举例:

//先创建一个学生类
public class Student {
    //类变量
    static String name;
    //实例变量(对象变量)
    int age;

}


//测试
public class Test {
     public static void main(String[] args) {
        //1、类变量的使用
        //类名.类变量
        Student.name="袁华";
        //对象.类变量(不推荐)
        Student s1=new Student();
        s1.name="马冬梅";

        Student s2=new Student();
        s1.name="秋雅";

        System.out.println(s1.name); //输出秋雅
        System.out.println(Student.name);  //输出秋雅

        //2、实例变量的使用:属于每个对象的变量
        //对象、实例变量(不能通过类名.变量名访问)
        s1.age=23;
        s2.age=18;
        System.out.println(s1.age);  //输出23
        System.out.println(s2.age);  //输出18


    }
}

 一开始先将Test.class加载到方法区,然后main方法入栈,运行到Student.name="张三"会将Student.class加载到方法区,并检查是否有类变量,如果有也会将类变量立即加载到堆内存中,初始值为null,然后赋值成 袁华

 然后在堆内存中创建学生对象,学生变量s1指向这个对象,然后执行 s1.name=“马冬梅”  会在s1指向的对象中去寻找这个变量,如果没有这个变量,则通过类的地址去寻找Student.class,然后通过这个寻找到name并赋值成 “马冬梅”

 同理s2的创建和修改和上面一样

 最后s1和s2的name都指向同一个,所以最后输出的名字都是“秋雅”。

下面再看实例变量age的变化:

s1.age=23会通过s1找到第一个学生对象,将其变量age的值改为23;同理s2也是如此

类变量的应用场景 

        在开发中,如果某个数据只需要一份,且希望能够被共享(访问、修改),则该数据可以定义成类变量来记住。例如,一个类可以记住自己创建了多少个对象,如下图

成员方法

按照有无static分为两种:

  • 类方法:static修饰,属于类
  • 实例方法:无static修饰,属于每个对象的。

代码举例:

public class Student {
    double score;
    //类方法
    public static void printHelloWorld(){
        System.out.println("Hello World");
    }

    //实例方法
    public void printPass(){
        System.out.println("成绩"+(score>=60?"及格了":"没及格"));
    }
}


//测试
public class StaticTest {
    public static void main(String[] args) {
        //1、类方法的使用
        //类名.类方法
        Student.printHelloWorld();
        //对象.类方法(不推荐)
        Student s1=new Student();
        s1.printHelloWorld();


        //2、实例方法的使用:属于每个对象的方法
        //对象.实例方法(不能通过类名.方法名访问)
        s1.printPass();

    }
}

一开始先将Test.class加载到方法区,然后main方法入栈,运行到Student.printHelloWorld()会将Student.class加载到方法区,然后通过学生类找到printHelloWorld()方法,进行打印

  然后在堆内存中创建学生对象,学生变量s1指向这个对象,然后执行 s1.printHelloWorld() 时,会通过s1找到它指向的学生对象,然后通过学会对象找到Student这个类,通过这个类找到这个printHelloWorld()方法 。如图

 实例方法也是如此,但它会访问这个对象的一些变量,所以不能通过类名调用(通过类名调用就不知道访问哪个对象的变量了)。

补充:main方法也是类方法,也是通过类名.main进行调用的

应用场景

类方法最常见的应用场景是做工具类:提高了代码复用;调用方便,提高了开发效率

注意事项

1. 类方法中可以直接访问类成员,不可以直接访问实例成员

public class Student {
    static String schoolname;//类变量
    double score;//实例变量
    //类方法
    public static void printHelloWorld(){
        //同一个类中,访问类成员,可以省略类名
        schoolname="张三";
        printHelloWorld2();
//        score=12.0;//报错
//        printPass();//报错

    }
    //类方法
    public static void printHelloWorld2(){
        System.out.println("Hello World");
    }
    //实例方法
    public void printPass(){
        System.out.println("成绩"+(score>=60?"及格了":"没及格"));
    }
}

2. 实例方法中既可以直接访问类成员,也可以直接方法实例成员

public class Student {
    static String schoolname;//类变量
    double score;//实例变量
    //类方法
    public static void printHelloWorld2(){
        System.out.println("Hello World");
    }
    //实例方法
    public void printPass(){
        schoolname="李四";
        printHelloWorld2();
        printPass2();
        System.out.println(score);
    }
    //实例方法
    public void printPass2(){
        
    }
}

3. 实例方法中可以出现this关键字,类方法中不可以出现this关键字

因为实例方法用this时会拿到这个对象,而类方法拿不到对象

应用知识

1. 代码块

代码块是类的5大成分之一(成员变量、构造器、方法、代码块、内部类)。

代码块分为两种:

  • 静态代码块
    • 格式:static{}
    • 特点:类加载时自动执行,由于类只加载一次,所以静态代码块也只会执行一次
    • 作用:完成类的初始化,例如:对类变量的初始化赋值。
      public class Student {
          static int number=80;
          static{
              System.out.println("静态代码块执行了");
          }
      }
      //测试
      public class StaticTest {
          public static void main(String[] args) {
              System.out.println(Student.number);
          }
      }
      
      //输出
      
      静态代码块执行了
      80
  • 实例代码块
    • 格式:{}
    • 特点:每次创建对象时,执行实例代码块,并在构造器前执行
    • 作用:和构造器一样,都是用来完成对象的初始化的。例如对实例变量进行初始化赋值

2. 单例模式

确保一个类只有一个对象

写法

  • 把类的构造器私有
  • 定义一个类变量记住类的一个对象
  • 定义一个类方法,返回对象
    public class A {
        //2.定义一个类变量记住类的一个对象
        private static A a=new A();
    
        //1.私有类的构造器
        private A() {
        }
        //3.定义一个类方法,返回对象
        public static A getObject(){
            return a;
        }
    }

 实现方式

  • 饿汉式单例:拿到对象时,对象早已经创建好了。上面便是。
  • 懒汉式单例:拿到对象时,才开始创建对象。
    public class B {
        //1.类的构造器私有
        private B() {
        }
        //2.定义一个类变量,用户存储这个类的一个对象
        private static B b;
        //3.定义一个类方法,要保证第一次调用时才创建一个对象,后面调用时都会用这同一个对象
        public static B getObject(){
            if(b==null){
                b=new B();
            }
            return b;
        }
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1572620.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++ STL有序关联容器】set 集合

文章目录 【 1. 基本原理 】【 2. set 的定义 】2.1 调用默认构造函数,创建空的 set 容器2.2 在创建 set 容器的同时,对其进行初始化2.3 拷贝构造的方式创建2.4 取已有 set 容器中的部分元素,来初始化新 set 容器2.5 修改排序规则的方式创建 …

web安全学习笔记(6)

记一下第十节课的内容。 一.PHP语言中的if else判断 语法和c语言中非常类似,不再赘述,也可以使用if...elseif...elseif...else 1.True和False 2.,和 一个等号是赋值 两个等号是比较 三个等号是全等(内容相等,数…

职场中的情绪管理:如何应对工作中的愤怒情绪?

在职场中,我们常常会遇到一些让我们感到愤怒的事情。或许是同事的不配合,或许是上司的不理解,又或许是客户的无理取闹。然而,作为一个职业人,我们需要学会如何管理自己的情绪,尤其是愤怒情绪,以…

linux文件权限与数字转化

chmod命令——change mode,可以对特定文件文件夹权限进行更改 这里我们看到,当执行了chmod u-x try.sh后,try文件底色变为白色,即为其执行权限被“减去” 在linux系统中,权限的减去是通过权限的数字表示来实现的&#…

elment UI el-date-picker 月份组件选定后提交后台页面显示正常,提交后台字段变成时区格式

需求&#xff1a;要实现一个日期的月份选择<el-date-picker :typeformData.dateType :value-formatdateFormat v-modelformData.leaveFactoryDateplaceholder选择月份></el-date-picker>错误示例&#xff1a;将日期显示类型(type)dateType或将日期绑定值的格式(val…

016——DHT11驱动开发(基于I.MX6uLL)

目录 一、 模块介绍 1.1 简介 1.2 电路描述 1.3 通信协议 二、 驱动程序 三、 应用程序 四、 上机实验 一、 模块介绍 1.1 简介 DHT11 是一款可测量温度和湿度的传感器。比如市面上一些空气加湿器&#xff0c;会测量空气中湿度&#xff0c;再根据测量结果决定是否继续加…

P8749 [蓝桥杯 2021 省 B] 杨辉三角形

[蓝桥杯 2021 省 B] 杨辉三角形 题目描述 下面的图形是著名的杨辉三角形: 如果我们按从上到下、从左到右的顺序把所有数排成一列&#xff0c;可以得到如下数列&#xff1a; 1 , 1 , 1 , 1 , 2 , 1 , 1 , 3 , 3 , 1 , 1 , 4 , 6 , 4 , 1 , … 1,1,1,1,2,1,1,3,3,1,1,4,6,4,1, …

LeetCode 1483.树节点的第 K 个祖先:树上倍增

【LetMeFly】1483.树节点的第 K 个祖先&#xff1a;树上倍增 力扣题目链接&#xff1a;https://leetcode.cn/problems/kth-ancestor-of-a-tree-node/ 给你一棵树&#xff0c;树上有 n 个节点&#xff0c;按从 0 到 n-1 编号。树以父节点数组的形式给出&#xff0c;其中 paren…

KeyguardClockSwitch的父类

KeyguardClockSwitch 定义在KeyguardStatusView中, mClockView findViewById(R.id.keyguard_clock_container);KeyguardClockSwitch的父类为&#xff1a; Class Name: LinearLayout Class Name: KeyguardStatusView Class Name: NotificationPanelView Class Name: Notificat…

六、从零实战企业级K8S本地部署ThingsBoard专业版集群

1、从 docker hub 拉取 ThingsBoard PE 映像(所有节点) 1.1、查看k8s信息(主节点) kubectl cluster-info #查看k8s集群信息 kubectl get node #查看节点信息 kubectl get pod -A #查看内部组件1.2、从 docker hub 拉取 ThingsBoard PE 映像(所有…

C语言进阶课程学习记录-第24课 - #pragma 使用分析

C语言进阶课程学习记录-第24课 - #pragma 使用分析 #pragma实验-#pragma messagecmd窗口运行 实验-pragma oncebcc编译报错gcc编译成功global.h代码优化 #pragma pack实验BCC编译器输出 小结 本文学习自狄泰软件学院 唐佐林老师的 C语言进阶课程&#xff0c;图片全部来源于课程…

docker笔记(二):镜像、容器数据卷

四、 docker镜像 4.1 镜像 镜像是一种轻量级、可执行的独立软件包&#xff0c;用来打包软件运行环境和基于运行环境开发的软件&#xff0c;它包含运行某个软件所需的所有内容&#xff0c;包括代码、库、环境变量和配置文件 所有的应用&#xff0c;直接打包docker镜像就可以直…

BPMNJS 在原生HTML中的引入与使用

BPMNJS 在HTML中的引入与使用 在网上看到的大多是基于vue使用BPMN的示例或者教程&#xff0c;竟然没有在HTML使用的示例&#xff0c;有也是很简单的介绍核心库的引入和使用&#xff0c;并没有涉及到扩展库。于是简单看了下&#xff0c;真的是一波三折&#xff0c;坎坎坷坷。不…

MobTech积极参与鸿蒙生态建设,HarmonyOS NEXT鸿蒙星河版产品即将发布

1月18日&#xff0c;在鸿蒙生态千帆启航仪式上&#xff0c;华为宣布HarmonyOS NEXT鸿蒙星河版开发者预览正式面向开发者开放申请。被称为“纯血鸿蒙”的鸿蒙星河版将实现原生精致、原生易用、原生流畅、原生安全、原生智能、原生互联6大极致原生体验。 作为深耕开发者服务领域…

二分法题集1

1 二分查找 分析&#xff1a; 这是一道很简单的二分法题&#xff0c;定义两个指针和中间值middle&#xff0c;判断middle对应数组值与目标值的大小关系&#xff0c;从而对left和right进行修改。由于太过基础&#xff0c;代码简单基础就不多赘述。 目录 1 二分查找 分析&…

Oracle 数据库维的建立

Oracle 数据库维的建立 SQL> select table_name from dict where table_name like %DBA%DIM%;TABLE_NAME ------------------------------ DBA_DIMENSIONS DBA_DIM_LEVELS DBA_DIM_LEVEL_KEY DBA_DIM_ATTRIBUTES DBA_DIM_HIERARCHIES DBA_DIM_CHILD_OF DBA_DIM_JOIN_KEYsel…

专题【链表】【考试题】刷题日记

题目列表 考试题&#xff08;22题&#xff09; 2024.04.04 146. LRU 缓存 707. 设计链表 138. 随机链表的复制 160. 相交链表 622. 设计循环队列 109. 有序链表转换二叉搜索树 460. LFU 缓存 355. 设计推特 725. 分隔链表 2487. 从链表中移除节点 日常复习题 876. 链表的中…

【智能算法应用】猎人猎物优化算法(HPO)在WSN覆盖中的应用

目录 1.算法原理2.数学模型3.结果展示4.参考文献 1.算法原理 【智能算法】猎人猎物算法&#xff08;HPO&#xff09;原理及实现 2.数学模型 3.结果展示 HPO设置区域边长为20&#xff0c;节点数为35&#xff0c;感知半径为2.5&#xff0c;实验结果如下&#xff1a; 4.参考…

iMazing 3 for Windows iOS设备管理软件2024最新功能解析

iMazing 3 for Windows是一款兼容Win和Mac的iOS设备管理软件。iMazing 3 for Windows能够将音乐、文件、消息和应用等数据从任何 iPhone、iPad 或 iPod 传输到 Mac 或 PC 上。 iMazing 3 win 版下载&#xff1a; https://souurl.cn/Qp6gFU iMazing 3 mac 版下载&#x…

一点点金融

一点点金融 价值投资 需求 > 有限 > 不可逆 > 优势 > 长期持有者多趋势分析 改进MACD策略&#xff0c;使用涨跌幅比值RSI计算MACD原始MACD计算改进思路&#xff1a;使用涨跌幅比值RSI计算MACD 价值投资 需求 > 有限 > 不可逆 > 优势 > 长期持有者多…