• 【Java初阶】- - - static 关键字


     

    ced485cbb11e458d81a746890b32cf3f.gif

      🎈🎈 作者 whispar
    🎈🎈专栏 :Java由浅入深

    ✨矢志不渝✨ 

    7abc9c8906564477a6679bb15d368e37.gif


    目录

    前言:

    一、理解static

    二、static修饰成员变量

    三、static修饰成员方法


     

    前言:

    • 变量的分类:

    1.根据声明的位置来划分

    在方法体当中声明的变量叫做:局部变量 。

    在方法体外声明的变量叫做:成员变量(全局变量)

    注意:

    (1)main 函数内的变量不是全局变量,而是局部变量,只不过它的生命周期和全局变量一样长而已。

    (2)全局变量一定是定义在函数外部的。

    静态变量都用类名访问,加static的变量叫做静态变量,在类加载时初始化,静态变量储存在方法区。

    实例变量的都要先new对象,然后引用访问。否则可能会出现空指针异常。

    • java中三个变量分别储存在那块内存上?

    局部变量在栈内存,静态变量在方法区,实例变量在堆内存。 也就是三个内存中都有变量。

    一、理解static

    1. class Student {
    2.    String name;
    3.    String sex;
    4.    int age;
    5.    String school = "SchoolA";
    6.    public Student(String name,String sex,int age){
    7.        this.name = name;
    8.        this.sex = sex;
    9.        this.age = age;
    10.   }
    11.   public static void main(String[] args) {
    12.        Student s1 = new Student("花花","女",3);
    13.        Student s2 = new Student("小明","男",18);
    14.        Student s3 = new Student("KiKi","女",5);
    15.   }
    16. }

    4f09bfb7ee5fb8506e3e4a79baeaf075.png

     

    即:School 与 Student类中具体的对象没有关系,只与Student这个类有关系

    在Java中,被static修饰的成员,称之为静态成员,也可以称为类成员,其不属于某个具体的对象,是所有对象所共享的

    ✅介绍Java当中静态成员的特点?

    类的静态成员是通过static关键字修饰的成员,主要包括静态变量、静态方法和静态代码块,具有一下一些特点:

    • 在类加载的时候,就进行创建初始化或执行代码

    • 他们对于一个类来说都只有一份

    • 类的所有实例都可以访问到他们

    二、static修饰成员变量

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

    1. class Student {
    2.    public String name;
    3.    public String gender;
    4.    public int age;
    5.    public double score;
    6.    public static String classRoom = "Java106";//静态成员变量-->类变量
    7. // 访问:一般通过类名.静态成员变量去访问,不推荐使用对象去进行访问
    8. //不依赖于对象
    9.    public Student(String jim, String 男, int i, double v) {}
    10.    public static void main(String[] args) {
    11. // 静态成员变量可以直接通过类名访问
    12.        System.out.println(Student.classRoom);
    13.        Student s1 = new Student("Li leilei", "男", 18, 3.8);
    14.        Student s2 = new Student("Han MeiMei", "女", 19, 4.0);
    15.        Student s3 = new Student("Jim", "男", 18, 2.6);
    16. // 也可以通过对象访问:但是classRoom是三个对象共享的
    17.        System.out.println(s1.classRoom);
    18.        System.out.println(s2.classRoom);
    19.        System.out.println(s3.classRoom);
    20.   }
    21. }

    特点:

    • 不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中

    • 既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问

    • 类变量存储在方法区当中

    • 生命周期伴随类的一生(即:随类的加载而创建,随类的卸载而销毁)

    b8cc75b809882fdc40a1392b505636a2.png

    哈希值:由系统随机给出,就是一个对象的地址值,是一个逻辑地址,,不是实际地址。 四者打印的哈希值一样,验证了静态成员变量只有一份。

    三、static修饰成员方法

    一般类中的数据成员都设置为private,而成员方法设置为public ,那static修饰的成员变量如何访问?

    非static成员函数可访问static成员函数/成员

    静态成员一般是通过静态方法来访问的

    1. public class Student {
    2.    String name;
    3.    String sex;
    4.    int age;
    5.    private static String school = "SchoolA";
    6.    public Student(String name,String sex,int age){
    7.        this.name = name;
    8.        this.sex = sex;
    9.        this.age = age;
    10.   }
    11.    
    12.    public static String getSchool(){
    13.        return school;
    14.   }
    15. }

    【静态方法的特性】

    • 不属于某个具体的对象,是类方法

    • 可以通过对象调用,也可以通过类名.静态方法名(...)方式调用,更推荐使用后者

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

    1. public static String getClassRoom(){
    2.        System.out.println(this);
    3.        return classRoom;
    4.   }
    5.    
    6. // 编译失败:Error:(35, 28) java: 无法从静态上下文中引用非静态 变量 this
    7.    public static String getClassRoom(){
    8.        age += 1;
    9.        return classRoom;
    10.   }
    11. // 编译失败:Error:(35, 9) java: 无法从静态上下文中引用非静态 变量 age
    • 静态方法中不能调用任何非静态方法,因为非静态方法有this参数,在静态方法中调用时候无法传递this引用

    72589f6746834824b2d0238544cd51b9.png

    • static 的使用

    ✅ 题一:关于以下程序代码的运行结果是

    1. public class HasStatic {// 1
    2. private static int x = 100;// 2
    3. public static void main(String args[]) {// 3
    4. HasStatic hsl = new HasStatic();// 4
    5. hsl.x++;// 5
    6. HasStatic hs2 = new HasStatic();// 6
    7. hs2.x++;// 7
    8. hsl = new HasStatic();// 8
    9. hsl.x++;// 9
    10. HasStatic.x--;// 10
    11. System.out.println(" x=" + x);// 11
    12. }
    13. }

    详解:

    本题中的静态成员变量x,属于类变量,只有一份。所有对x的操作针对的都是同一份。静态成员变量的访问需要通过类名访问,这是正确的访问方式。本题中虽然使用了对象引用访问,但是不会报错,我们不建议这样访问,但不是错误,所以,不会编译报错。

    故:100 +1 +1+1 -1 = 102

    ✅题二:如下代码的输出结果是什么?

    1. public class Test {
    2.    public int aMethod(){
    3.        static int i = 0;
    4.        i++;
    5.        return i;
    6.   }
    7. public static void main(String args[]){
    8.    Test test = new Test();
    9.    test.aMethod();
    10.    int j = test.aMethod();
    11.    System.out.println(j);
    12.   }
    13. }

    详解:

    在方法当中定义的变量是局部变量,而静态的变量属于类变量。随着类的加载而被创建,而局部变量是调用该方法的时候,才创建的。

    所以,此时两种变量的性质是冲突的。Java当中不允许定义局部的静态变量,故以上代码编译失败.

             💖如果文章对你有帮助,请多多点赞、收藏、评论、关注支持!!💖  

    ced485cbb11e458d81a746890b32cf3f.gif

     

     

  • 相关阅读:
    14:00面试,14:06就出来了,问的问题有点变态。。。
    JPA概述
    chromedriverUnable to obtain driver for chrome using ,selenium找不到chromedriver
    java 实现删除单链表中所有指定的结点以及如何清空单链表
    预测未来一周全球天气要多久?华为云:给我几秒钟
    远程仓库(一)之git 小乌龟安装教程
    【进阶篇】使用 Redis 实现分布式缓存的全过程思考(一)
    剑指 Offer 03. 数组中重复的数字
    计算机毕业设计Java校园流浪猫图鉴管理系统的设计与实现(源码+系统+mysql数据库+Lw文档)
    从GitHub火到了CSDN,共计1658页的《Java岗面试核心MCA版》,拿走不谢
  • 原文地址:https://blog.csdn.net/m0_56361048/article/details/126573310