目录

一、static静态关键字

1、static是什么?

2、成员变量分两类

3、static修饰成员变量的内存原理

4、static修饰成员方法的基本用法

成员方法分为两类

两种成员方法的区别

不使用static修饰成员方法的场景

使用static修饰成员方法的场景

5、static修饰成员方法的内存原理

6、static注意事项(笔试题)

二、static应用知识:工具类

1、工具类是什么?

2、创建工具类注意事项

3、工具类的调用方法

三、static应用知识2:代码块

1、认识代码块

2、代码块的分类

3、静态代码块的应用案例

四、static应用知识:单例设计模式

1、设计模式

2、单例模式

2.1、饿汉单例设计模式

2.2、懒汉单例模式


一、static静态关键字

1、static是什么?

  • static是静态的意思,可以修饰成员变量和成员方法。
  • static修饰成员变量表示该成员只在内存中存储一份,可以被共享访问、修改。

static修饰的静态成员变量只在内存中加载一次,就一份放在堆内存中,可以反复共享访问和修改,而实例成员变量每创建一个对象就会创建这个对象独有的成员变量。

2、成员变量分两类

  • 静态成员变量 又称为类变量(有static修饰,属于类,内存中只加载一次):常表示如在线人数信息等需要被共享的信息,可以被共享访问。
public class User {//在线人数//static修饰  静态成员变量只在内存中独一份,通常采用public修饰,表示对外可以访问public static int onlineNumber = 161;//如果在同一个类中静态成员变量的访问不需要类名System.out.println(onlineNumber);
}
public class StaticDemo1 {public static void main(String[] args) {//理解static修饰成员变量的作用和访问特点//1、通过 类名.静态成员变量,使用人数加一User.onlineNumber++;//2、通过 对象.静态成员变量,但一般不推荐但是语法没问题User u = new User();u.onlineNumber++;}
}
  • 实例成员变量(无static修饰,存在于每个对象中,且每个对象的该信息不同):常表示姓名name、年龄age等属于每个对象独有的信息。
public class User {//实例成员变量的定义private int age; public static void main(String[] args) {//实例成员调用   对象名.实例成员变量User u1 = new User();u1.age = 21;}
}

3、static修饰成员变量的内存原理

先将User.class文件引入方法区,同时在堆内存中创建一个空间存储静态成员变量,然后将main方法提到栈内存中,执行两次输出,再通过 对象.静态成员变量 调用静态成员变量并修改他的值,创建新的用户对象,在栈内存的main方法中分配一块存储空间存储用户型变量u1,并在堆内存中开辟一块区域存储对象,对name、age赋值,将对象的地址返回给u1存储,使u1指向这个对象,输出name、age,而对象与静态成员变量之间也建立了一种关系,静态成员变量可以被所有人共享,所以也可以通过 对象.静态成员变量 调用,语法上没问题,但是一般并不推荐。

4、static修饰成员方法的基本用法

成员方法分为两类:

  • 静态成员方法 (有static修饰,归属于类,又称类方法),建议使用类名访问,也可以用对象访问。
//静态成员方法,有static修饰,归属于类,可以被共享访问,用类名或者对象名都可以访问public static int getMax(int ag1,int ag2) {return ag1>ag2?ag1:ag2;}
//调用方法
1、类名.静态成员方法
Student.getMax(10,3);
//在同一个类中可以不用写类名
getMax(10,3);Student s = new Student();
//也可以采用对象.静态成员变量,语法可行但是不推荐
System.out.println(s.getMax(13,14));

前几节接触到的都是静态成员方法,在类中直接调用该方法。

  • 实例成员方法(无static修饰,归属于对象),只能用对象触发访问。
//实例成员方法,属于对象,只能用对象触发访问,它可以直接访问实例成员变量public void study() {System.out.println(name);}
Student s = new Student();
s.name = "测试";
//对象.实例成员方法
s.study();

两种成员方法的区别:

  • 内存分配的时间  当类的字节码文件被加载到内存时,类方法就分配了相应的入口地址;实例成员方法是当类的对象创建时才会被分配入口地址。
  • 访问方式 实例方法必须用对象名访问;类方法一般用类名访问,也可以用对象名访问。
  • 操作的对象 类方法只能操作类变量不能操作实例变量;而实例方法即可以操作类变量也可以操作实例变量。
  • 实例方法中可以调用实例方法和类方法,而类方法中只能调用类方法。

不使用static修饰成员方法的场景:

表示对象自己的行为的,且方法中需要访问实例成员变量,则该方法必须声明成实例方法。

比如学生的行为,学习,这个学习方法就是学生对象本身的行为。

这样就可以直接访问对象中的成员变量。

使用static修饰成员方法的场景:

如果该方法是以执行一个共同功能为目的,则可以声明成静态成员方法

5、static修饰成员方法的内存原理

先将Student.class文件加载到方法区,同时在class文件中加载main方法和getMax方法,因为getMax方法是静态成员方法所以会和main方法同步加载,而study方法是实例方法与对象有关,创建对象时才会加载该方法,将main方法提到栈内存,通过 类名.静态成员变量 调用getMax方法,将getMax方法提到栈内存中,执行该方法输出10,在栈内存的main方法中分配一块区域存储学生变量s,在堆内存中创建对象并赋值,将对象的地址赋给s存储,执行s.study();,通过对象中的方法引用的地址,调用对象中的study()方法。

6、static注意事项(笔试题)

静态/实例成员 它包括静态/实例成员变量和静态/实例成员方法。

  • 静态方法只能访问静态的成员,不可以直接访问实例成员。
  • 实例方法可以访问静态的成员,也可以访问实例成员。
  • 静态方法中不可以出现this关键字,因为this只能代表当前对象。

二、static应用知识:工具类

1、工具类是什么?

类中都是一些静态方法,每个方法都是以完成一个共同的功能为目的,这个类用来给系统开发人员共同使用的。

对于同一个功能多处开发,会出现代码重复度过高,所以将功能写在方法中,随用随调。

这样的好处:

一是调用方便,二是提高了代码复用,实现一次编写,处处可用。

 使用静态方法的好处:

  • 实例方法需要创建对象调用
  • 只是为了调用方法而创建对象,只会浪费内存。

2、创建工具类注意事项

由于工具类里面都是静态方法,直接用类名即可访问,因此,工具类无需创建对象,建议将工具类的构造器私有化。

//工具类,多个静态方法的集合,静态方法方便调用
public class ItHeimUtil {//将工具类私有化,对外无法创建对象private ItHeimUtil() {}

3、工具类的调用方法

类名.类方法

三、static应用知识2:代码块

1、认识代码块

  • 代码块是类的五大成分之一(成员变量、构造器、方法、代码块、内部类),定义在类中方法外。
  • 在java类下,使用{}括起来的代码被称为代码块

2、代码块的分类

静态代码块属于类,他会与类一起加载,自动触发执行,由于程序的执行会先加载类文件,所以静态代码块也会被先调用,程序调用之前先被执行。

构造代码块属于对象,每次构建对象时,都会触发执行一次,只有创建对象时才会触发。

3、静态代码块的应用案例

斗地主游戏,要求在游戏开始前准备好一副新的扑克牌。

import java.util.ArrayList;public class StaticTest {//目的:模拟游戏启动前,初始化54张牌//定义一个静态的字符串集合,一个房间只需要一副牌,公开化//创建一个cards对象存放54张牌public static ArrayList<String> cards = new ArrayList<>();//在程序运行之前将54张牌放进去,static与类文件同时创建,优先加载static {//提前准备资源//定义扑克牌的点数集合String[] size = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};//定义扑克牌花色集合String[] colors = {"♠","♥","♣","♦"};//开始生成新的54张扑克牌for (int i = 0; i < size.length; i++) {for (int i1 = 0; i1 < colors.length; i1++) {cards.add(colors[i1] + size[i]);}}//将大小王加进去cards.add("大												

JavaSE基础加强、static相关推荐

  1. javaSE基础04

    javaSE基础04 一.三木运算符 <表达式1> ? <表达式2> : <表达式3> "?"运算符的含义是: 先求表达式1的值, 如果为真, ...

  2. JAVASE基础模块十五(StringBuffer类)

    JAVASE基础模块十五(StringBuffer类) public class Stbuffer { public static void main(String[] args) { //总共创建五 ...

  3. JAVASE基础模块三十四( 菜鸡版简单登录验证模块系统IO流文件写入)

    JAVASE基础模块三十四( 菜鸡版简单登录验证模块系统IO流文件写入) 开发流程:需求文档 接口文档 效果图 开发环境统一:JDK1.8 IDEA win10 GIT SSM SSH SpringB ...

  4. javaSE基础重点知识点总结 持续更新

    javaSE基础重点知识点解析 文章目录 javaSE基础重点知识点解析 前言 1.重载和重写 2.匿名对象 3.可变个数形参的方法 4.MVC设计模式 5.java.lang.Object类 6.自 ...

  5. JavaSE基础阶段学习笔记

    MarkDown学习 标题 三级标题 四级标题 字体 hello,word! hello,word! hello,word! hello,word! 引用 选择狂神说Java,走向人生巅峰 分割线 图 ...

  6. JavaSE基础——常用类1

    JavaSE基础--常用类1 一.Object类 java.lang.Object类是Java语言中的根类,即所有类的父类.它当中描述的所有方法子类都可以使用. 如果在类的声明中没有显式地使用exte ...

  7. JavaSE基础加强-学习黑马程序员Java基础视频教程(P93开始)

    目录 P0:写在前面的小知识 P93:下阶段:JavaSE基础加强简介 P95:static:修饰成员变量.内存机制 P96:static:修饰成员方法.内存机制 P97:static:访问的注意事项 ...

  8. JavaSE基础——流程控制

    JavaSE基础--流程控制 文章目录 JavaSE基础--流程控制 一 .用户交互Scanner 1. 初识Scanner 2. Scanner进阶 二.顺序结构 三.分支结构 1. if单选结构 ...

  9. java学习之路之javaSE基础1

    <h2>java学习之路之javaSE基础1</h2> <div> ###01.01_计算机基础知识(计算机概述)(了解) * A:什么是计算机?计算机在生活中的应 ...

  10. 【Java面试题】JavaSE基础之Java面向对象

    JavaSE基础 1.Java面向对象 1.1.什么是面向对象? 1.2.对象的概念 1.3.面向对象和面向过程的关系和区别 1.4 .面向对象三大核心特性 1.4.1.继承 1.4.2.封装 1.4 ...

最新文章

  1. 写了一个PPT,用于公司内部培训
  2. 【转载】Python对接六大主流数据库,只需三步
  3. 软件开发心得点滴记录
  4. 中国互联网+政务建设发展现状及市场规模预测报告2022-2027年版
  5. 目标检测特殊层:ROI Align层详解
  6. C#配置及使用log4net
  7. linux shell 自定义函数(定义、返回值、变量作用域)介绍
  8. Java学习笔记2.3.4 运算符与表达式 - 逻辑运算符
  9. 【Mac】Mac 下安装MySQL优化工具mysqltuner执行报错 [!!] Attempted to use login credentials
  10. npm 代理的设置和取消
  11. 磅 英寸 厘米 dpi 像素
  12. js(javascript)和jq(jquery)常见问题(持续更新)
  13. 涂鸦小程序——为自己的人生画上一笔
  14. IEEE754浮点数标准
  15. 组合游戏 - SG函数和SG定理
  16. MSP430C语言编程技巧,如何提高MSP430 C语言编程效率
  17. 链路追踪jaeger
  18. 转:随机过程方面书籍的评论
  19. python操作鼠标进行点击
  20. google浏览器中页面在新的标签页打开

热门文章

  1. Android中的权限-中英对照
  2. DxLib做弹幕射击游戏(二)——画一台敌机
  3. 推荐一些电驴网站,坚决扁死VERYCD论坛
  4. proteus 与 keil 的安装及联调
  5. 免费的投屏软件,爱你好难
  6. 医疗系统 java_基于Java的医疗管理系统
  7. 浅谈网站中的布局与建网站的注意事项
  8. Delphi 中TPath单元引用报错无法编译问题
  9. 个人项目——论文查重
  10. 广东女子职业学院计算机,广东女子职业技术学院代码