首页 > 编程语言 >Java学习笔记--static关键字,介绍以及基本使用,static修饰成员的访问特点

Java学习笔记--static关键字,介绍以及基本使用,static修饰成员的访问特点

时间:2024-11-14 09:19:48浏览次数:3  
标签:Java -- 成员 静态 static void test public

一,static的介绍以及基本使用

问题1:

如果现在在测试类中调用了许多学生类,里面有姓名,年龄,教室,但他们的教室都需要更改,现在该怎么办?

定义static关键字

1.概述:static是一个静态关键字
2.使用:
   a.修饰一个成员变量:
     static 数据类型 变量名

   b.修饰一个方法:
      修饰符 static 返回值类型 方法名(形参){
             方法体
             return 结果
      }

3.调用静态成员:
   类名直接调用(不用new对象)

4.静态成员特点:
   a.静态成员属于类成员,不属于对象成员(非静态的成员属于对象成员)
   b.静态成员会随着类的加载而加载
   c.静态成员优先于非静态成员存在在内存中
   d.凡是根据静态成员所在的类创建出来的对象,都可以共享这个静态成员

示例,学生类

public class Student {
    String name;
    int age;
    static String classroom;
}

测试类

public class test {
    public static void main(String[] args) {
        Student.classroom = "561";
        //静态赋值,直接调用
        Student student = new Student();
        student.name = "张三";
        student.age = 23;
        System.out.println(student.age+"........"+student.name+"........."+Student.classroom);


        Student student1 = new Student();
        student.name = "李四";
        student.age = 43;
        System.out.println(student.age+"........"+student.name+"........."+Student.classroom);


    }
}

静态赋值主要用在公用数据中,方便任何类的调用,它与类和栈是同时产生同时消失的,因此没有内存浪费,在之前的jdk中静态关键字在堆中,但在后续版本改为在类和栈中,所以idea版本的不同并不代表会有新的功能或方法,更多的是对内存的优化和方法的调用改变

二,static修饰成员的访问特点

1.在静态方法中能直接访问非静态成员嘛?  不能
  想要调用的话:new对象调用  

演示

创建Person类

public class Person {
    public void eat(){
        System.out.println("ganfan");
    }
}

创建测试类

public class test {
    public static void main(String[] args) {
        //静态成员中访问非静态成员
        Person person = new Person();
        person.eat();

        test test = new test();
        test.method03();


    }

    public static void method01(){

    }


    public static void method02(){

    }


    public void method03(){

    }
}

不管是不是在一个类中,都需要new一片空间出来,再调用
2.在非静态方法中能直接访问静态成员嘛? 能
  a.同类:
    直接调用
    类名调用

public class test {
    public static void main(String[] args) {
        //静态成员中访问非静态成员
        Person person = new Person();
        person.eat();

        test test = new test();
        test.method03();


    }

    public static void method01(){

    }


    public static void method02(){

    }


    public void method03(){
        //同类中非静态成员访问静态成员
        method01();
        method02();
        test.method01();
        test.method02();

    }
}

b.不同类:
    类名调用

给Person类加一个静态方法

public class Person {
    public void eat(){
        System.out.println("ganfan");
    }

    public static void drink(){
        System.out.println("heshui");
    }
    
}

然后在test类里面的method3方法里调用

public void method03(){
        //同类中非静态成员访问静态成员
        method01();
        method02();
        test.method01();
        test.method02();
        //不同类中非静态成员访问静态成员
        Person.drink();

    }


3.在静态方法中能直接访问静态成员嘛?能
  a.同类:
    直接调用
    类名调用

public static void method01(){
        //同类静态成员中访问静态成员
        method02();
        test.method02();
        
    }


  b.不同类:
    类名调用
    

public static void method01(){
        //同类静态成员中访问静态成员
        method02();
        test.method02();
        //不同类静态成员中访问静态成员
        Person.drink();

    }


4.在非静态方法中能直接访问非静态成员嘛?能
  a.同类:
    直接调用
    new对象调用

public void method04(){
        //同类中非静态成员访问非静态成员
        method03();
        test test = new test();
        test.method03();
    }


  b.不同类:
    new对象调用

public void method04(){
        //同类中非静态成员访问非静态成员
        method03();
        test test = new test();
        test.method03();
        //不同类中非静态成员访问非静态成员
        Person person = new Person();
        person.eat();
    }

总结:
 1.不管在不在同一个类中,非静态成员都可以new对象调用
 2.不管在不在同一个类中,静态成员都可以类名调用

问题2:

既然static成员那么好使(类名直接调用),那么我们在实际开发中,能不能将所有的成员都定义成静态的呢?
      不能
     
 原因:由于静态成员会随着类的加载而加载,如果将所有的成员都变成静态的,那么类一加载,静态成员都会进内存,会大量占用内存空间
     
 问题2:那么静态成员都啥时候定义呢?
      一般情况下,我们在抽取工具类的时候可以将工具类中的所有成员都定义成静态的
     
问题3:啥时候定义工具类?

       比如我们在写代码的过程中,发现有的功能在反复实现,代码一样,功能一样,此时就可以抽取出来,形成工具类

示例

创建ArraysUtils类

public class ArraysUtils {
     /*
        构造方法用private修饰
 
        工具类中的成员都是静态的,静态成员都是类名调用,不需要new对象
        所以工具类中的构造方法都是用private修饰
 
        如果构造方法被private修饰,那么在别的类中,就不能利用构造方法new对象
      */
     private ArraysUtils(){
 
     }
 
 
     //定义一个方法,实现获取int数组最大值
     public static int getMax(int[] arr){
         int max = arr[0];
         for (int i = 1; i < arr.length; i++) {
             if (max<arr[i]){
                 max = arr[i];
             }
         }
 
         return max;
     }
 }

test类

public class Test01 {
     public static void main(String[] args) {
         int[] arr = {5,3,4,6,7,54,8};
         int max = ArraysUtils.getMax(arr);
         System.out.println("max = " + max);
     }
 }
 



 public class Test02 {
     public static void main(String[] args) {
         int[] arr = {5,4,5,7,8,9};
         int max = ArraysUtils.getMax(arr);
         System.out.println("max = " + max);
     }
 }

获取数组最大值这个方法一直需要被test调用,所以设置为静态方法,与类同时生成,方便调用

标签:Java,--,成员,静态,static,void,test,public
From: https://blog.csdn.net/THRUSTER11111/article/details/143757057

相关文章

  • C#自动检测文件的编码
    StreamReader自动编码检测:使用 StreamReader 可以自动检测文件的编码(包括UTF-8BOM、UTF-16、等),并选择合适的编码来读取文件。它通过 detectEncodingFromByteOrderMarks:true 来启用BOM检测功能。字符处理:StreamReader 读取的是字符流,而不是字节流,因此不需要......
  • LeetCode【0046】全排列
    本文目录1中文题目2求解方法:回溯法2.1方法思路2.2Python代码2.3复杂度分析3题目总结1中文题目给定一个不含重复数字的数组nums,返回其所有可能的全排列。可以按任意顺序返回答案。示例:输入:nums=[1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,......
  • 毕业论文设计 Python 实现基于WGAN的生成对抗网络数据生成的详细项目实例(含完整的程序
    目录Python实现基于WGAN的生成对抗网络数据生成的详细项目实例...5项目背景介绍...5一、引言...5二、WGAN背景及优势...51.生成对抗网络(GAN)简述...52.WGAN的核心创新:Wasserstein距离...6......
  • ABB IRB5500喷涂机器人电机维修故障方法
    ABB喷涂机器人电机在运行过程中可能会遇到多种常见故障,用户需根据电机的实际运行状况,细致地进行故障辨析并采取适当的处理措施。在进行维修作业时,务必严格遵守安全操作规程,确保不会对机器人本身及维修人员造成任何伤害。一、ABB喷涂机器人电机维修故障现象的初步判断与分析1.电......
  • 网络安全(黑客)——自学2024
    ......
  • [LeetCode] 1385. Find the Distance Value Between Two Arrays
    Giventwointegerarraysarr1andarr2,andtheintegerd,returnthedistancevaluebetweenthetwoarrays.Thedistancevalueisdefinedasthenumberofelementsarr1[i]suchthatthereisnotanyelementarr2[j]where|arr1[i]-arr2[j]|<=d.Exampl......
  • MATLAB实现PSO-KELM粒子群算法优化核极限学习机时间序列预测
    目录项目背景介绍...1项目目标与意义...1项目挑战...1项目特点与创新...1项目应用领域...2项目效果预测图程序设计...2项目模型架构...2项目模型描述...2项目模型算法流程图...4项目结构设计...5项目部署与应用...5项目扩展...5项目应该注意事项...5......
  • Agent的“编排之战”|我开源了!
    请问哪家大模型能够更准确地转化下述问题:“原告是安利股份的案件审理法院是哪家法院?”为可被大模型执行的指令序列(Routine)?公司简称:安利股份->上市公司基本信息;公司名称:上市公司基本信息.公司名称->法律文书信息;法律文书信息.过滤(原告等于上市公司基本信息.公......
  • 网络安全(黑客)——自学2024
    ......
  • 基于SpringBoot+Vue的校友社交系统+万字论文+PPT+Mp4演示
    !!!有需要的小伙伴可以通过文章末尾名片咨询我哦!!!......