【Java基础】static关键字和静态成员

关键字:Static

只可以修饰成员。

静态成员变量/类变量

特点:

  • 随着所属类的字节码加载,就在方法区的静态区开辟内存了,这时还不存在对象;
  • 因为随着类的加载就开辟内存了,所以既可以通过类名直接访问,也可以通过对象访问;
  • 优先于没有被static修饰的成员变量开辟内存;
class Student
{String name;//实例变量static String country="CN"; //类变量、静态成员变量
}
class Demo1
{public static void main(String[] args){Student stu1=new Student();stu1.name="李四";Student stu2=new Student( );stu2.name="赵四";//在对象存在前已经开辟内存//可以通过类名直接访问System.out.println(Student.country);stu2.county="USA";System.out.println(stu1.country);//USA//county的内存只有一处,通过对象stu2更改,//再通过对象stu1访问,得到的便是更改后的数据}
}

对比

非静态成员变量(实例变量)和静态成员变量的对比

  1. 存储数据
    • 非静态成员变量存储的是每个对象特有的数据
    • 静态成员变量存储的是所有对象共享的数据
  2. 访问方式
    • 非静态成员变量只能通过对象来访问
    • 静态成员变量既可以通过对象访问,也可以通过类访问
  3. 内存位置
    • 非静态成员变量是随着所属对象的创建在中开辟内存
    • 静态成员变量是随着类的字节码的加载,在方法区的静态区开辟内存
  4. 生命周期
    • 非静态成员变量是随着所属对象的创建在堆中开辟内存,当所属对象成为垃圾时等待垃圾回收线程回收
    • 静态成员变量是随着类的字节码的加载在方法区的静态区开辟内存,程序退出时才释放内存

静态方法

  • 随着类的加载就加载到静态区,可以直接通过类访问

    public static void fun() {}
    Student.fun();
    
  • 必须通过对象访问

    public void show() {}
    Student stu=new Student();
    stu.show();
    
  • 静态方法只能使用静态成员变量
    非静态方法既可以使用静态成员变量,也可以使用非静态的成员变量

    class Student{String name;//实例变量static String country="CN"; //类变量//随着类的加载就加载到静态区,可以直接通过类名访问public static void fun(){//静态方法不能使用非静态成员System.out.print1n("He1lo" +country);}//必须通过对象访问,既可以使用静态的也可以使用非静态的public void show(){System.out.println("Hello:"+name+country);}
    }
    //静态方法只能使用静态成员
    //非静态方法既可以使用静态的也可以使用非静态的
    class Demo2{public static void main(String[] args){Student.fun();Student stu=new Student() ;stu.show();}
    }
    
  • 什么情况下成员变量可以被修饰为static?
    成员变量的值可以被所属类的对象共享

  • 什么情况下成员方法可以被修饰为static?
    当该方法没有用到所属类中的任何非静态成员时

静态应用——工具类

/**
*这是一个定义了操作数组常用功能的工具类,如求最大值、冒泡排序、二分法查找……
*@author xxx
*@version 1.0
*/
//若类是公共的,文件名必须与该类名称相同
public class ArrayTool{private ArrayTool(){}/***求数组中最大值*@param int[] 接收一个整型的数组*@return int 返回一个整型的数值*/public static int getMax(int[] arr){int max=arr[0];for(int i=1;i<arr.length;i++){if(arr[i]>max)max=arr[i];}return max;}/**冒泡排序算法@param int[] 接收一个整型的数组@return 无返回值*/public static void bubble(int[] arr){for(int i=0;i<arr.length-1;i++){for(int j=0;j<arr.length-i-1;j++){if(arr[j+1]<arr[j]){huan(arr,j+1,j);}}}}private static void huan(int[] arr,int i,int j){int c=arr[i];arr[i]=arr[j];arr[j]=c;}
}

解析主函数

public static void main(String[] args) {}
  • **public:**该函数是公共的
  • **Static:**该方法可以直接通过类名访问
  • **void:**无返回值
  • **main:**函数名
  • **String[] args:**参数是字符串类型的数组
class Demo3{public static void main(String[] args){for(int i=0;i<args.length;i++){System.out.print1n(args[i]);}//Demo3 demos=new Demo3();//demos.main(66);main(88);}public static void main(int a){System.out.println(a);}
}
class Test{public static void main(string[] args){String[] arr={"hehe","xixi"};Demo3.main(arr);}
}

静态代码块

  • 随着类的加载而执行,只执行一次,优先于main的执行
  • static{……}
class Demo6
{static{System.out.println("a");}public static void main(String[] args){//Test test=new Test();  //a b c//Test.show();   //a b c 5//没有创建新的对象,因此不需要调用Test类Test test=null;   //a b}static{System.out.println("b");}
}
class Test
{static int num=5; static{System.out.println("c");}public static void show(){System.out.println(num);}
}

构造代码块

  • 对象一创建就执行,优先于构造函数执行
  • 可以把所有对象共性的内容写在构造代码块中
  • {……}
class Person
{int age;{System.out.println("哈哈");}Person(){}Person(int age){this.age=age;System.out.println("构造函数");}
}
class Demo7
{public static void main(String[] args){Person xiaohong=new Person(20);Person xiaoming=new Person(22);}
}

创建对象的过程

  1. 因为对象是依据字节码来创建,所以先加载字节码到方法区
  2. 如果有静态代码块执行静态代码块
  3. 在堆中开辟内存
  4. 给属性赋默认值
  5. 用初始值覆盖默认值
  6. 执行构造代码块
  7. 执行构造函数
  8. 把对象在堆中的地址赋给栈中的引用变量

执行次序

public class Person {//2:赋初值~{System.out.println("构造代码块");}//1:只执行一次~static{System.out.println("静态代码块");}//3public Person(){System.out.println("构造方法");}public static void main(String[] args) {Person person1=new Person();System.out.println("=============");Person person2 = new Person();}
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件设计师-应用技术-数据库设计题2

基础知识及技巧&#xff1a; 1. 数据库设计过程&#xff1a; 四个阶段&#xff1a;需求分析、概念结构设计、逻辑结构设计、物理设计。每个阶段的产物&#xff1a; 需求分析&#xff1a;数据流图、数据字典、需求说明书。概念结构设计&#xff1a;ER模型逻辑机构设计&#xf…

ue引擎游戏开发笔记(33)——武器与角色的匹配,将新武器装备到角色身上

1.需求分析&#xff1a; 武器能出现在世界中&#xff0c;完成了第一步&#xff0c;下一步需要角色和武器适配&#xff0c;即不论角色跑动&#xff0c;射击等&#xff0c;武器和角色都相匹配&#xff0c;将武器装备到角色身上。 2.操作实现&#xff1a; 1.首先先把角色原有的武…

Linux-信号概念

1. 什么是信号 信号本质是一种通知机制&#xff0c;用户or操作系统通过发送信号通知进程&#xff0c;进程进行后续处理 在日常生活中就有很多例子&#xff0c;比如打游戏方面王者荣耀的“进攻”&#xff0c;“撤退”&#xff0c;“请求集合”&#xff0c;“干得漂亮&#xff01…

透明屏幕的分辨率如何?是否足够清晰以展示高质量的内容?

透明屏幕的分辨率是一个重要的参数&#xff0c;它决定了屏幕显示的清晰度。常见的透明屏幕分辨率包括1920x1080和3840x2160等&#xff0c;其中后者是更高分辨率的4K屏幕。 一般来说&#xff0c;分辨率越高&#xff0c;显示效果越细腻&#xff0c;图像和视频也会更清晰。对于需要…

一起了解开源自定义表单的优势表现

随着社会的进步和科技的发展&#xff0c;越来越多的中小企业希望采用更为先进的软件平台&#xff0c;助力企业实现高效率的流程化管理。低代码技术平台、开源自定义表单已经慢慢走入大众视野&#xff0c;成为一款灵活、高效的数字化转型工具。流辰信息专注于低代码技术平台的研…

若依前后端分离部署nginx

1、v.sj 2、生产环境修改 3、退出登录修改 4、路由改为hash模式 5、nginx配置 location /gldhtml/ {alias D:/java/tool/nginx-1.19.6/project/jxal/html/; } location /jxal/ {proxy_pass http://localhost:8081/; }

【redis】Redis数据类型(五)ZSet类型

目录 类型介绍特点补充 使用场景 Zset类型数据结构ziplist&#xff1a;压缩列表&#xff08;参考之前的文章&#xff09;skiplist&#xff1a;跳表解析 面试题&#xff1a;MySQL索引为什么用B树而不用跳表区别总结 常用命令ZADD示例 ZREM示例 ZCARD示例 ZCOUNT示例 ZSCORE示例 …

LeetCode-hot100题解—Day5

原题链接&#xff1a;力扣热题-HOT100 我把刷题的顺序调整了一下&#xff0c;所以可以根据题号进行参考&#xff0c;题号和力扣上时对应的&#xff0c;那么接下来就开始刷题之旅吧~ 1-8题见LeetCode-hot100题解—Day1 9-16题见LeetCode-hot100题解—Day2 17-24题见LeetCode-hot…

证明力引导算法forceatlas2为什么不是启发式算法

一、基本概念 吸引力 F a ( n i ) ∑ n j ∈ N c t d ( n i ) ω i , j d E ( n i , n j ) V i , j \displaystyle \bm{F}_a(n_i) \sum_{n_j \in \mathcal{N}_{ctd}(n_i)} \omega_{i,j} \; d_E(n_i,n_j) \bm{V}_{i,j} Fa​(ni​)nj​∈Nctd​(ni​)∑​ωi,j​dE​(ni​,nj​…

自动化运维管理工具-------------Ansible

目录 一、自动化运维工具有哪些&#xff1f; 1.1Chef 1.2puppet 1.3Saltstack 二、Ansible介绍 2.1Ansible简介 2.2Ansible特点 2.3Ansible工作原理及流程 2.3.1内部流程 2.3.2外部流程 三、Ansible部署 3.1环境准备 3.2管理端安装 ansible 3.3Ansible相关文件 …

爬虫学习(2)破解百度翻译

代码 import requests import jsonif __name__ "__main__":url https://fanyi.baidu.com/sug#post请求参数处理&#xff08;同get请求一致&#xff09;headers {"User-Agent": Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, …

3.栈和队列(汇总版)

目录 1.栈&#xff08;一端插和删&#xff09; 2.队列&#xff08;一端插另一段删&#xff09; 2.1队列的概念及结构 2.2 队列的实现 队列的接口 1.初始化队列 2.销毁队列 3.插入元素 4.出队列&#xff08;头删&#xff09; 5.访问对头 6.访问队尾 7.判断队列是否为…