JavaSE基础加强、static
目录
一、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相关推荐
- javaSE基础04
javaSE基础04 一.三木运算符 <表达式1> ? <表达式2> : <表达式3> "?"运算符的含义是: 先求表达式1的值, 如果为真, ...
- JAVASE基础模块十五(StringBuffer类)
JAVASE基础模块十五(StringBuffer类) public class Stbuffer { public static void main(String[] args) { //总共创建五 ...
- JAVASE基础模块三十四( 菜鸡版简单登录验证模块系统IO流文件写入)
JAVASE基础模块三十四( 菜鸡版简单登录验证模块系统IO流文件写入) 开发流程:需求文档 接口文档 效果图 开发环境统一:JDK1.8 IDEA win10 GIT SSM SSH SpringB ...
- javaSE基础重点知识点总结 持续更新
javaSE基础重点知识点解析 文章目录 javaSE基础重点知识点解析 前言 1.重载和重写 2.匿名对象 3.可变个数形参的方法 4.MVC设计模式 5.java.lang.Object类 6.自 ...
- JavaSE基础阶段学习笔记
MarkDown学习 标题 三级标题 四级标题 字体 hello,word! hello,word! hello,word! hello,word! 引用 选择狂神说Java,走向人生巅峰 分割线 图 ...
- JavaSE基础——常用类1
JavaSE基础--常用类1 一.Object类 java.lang.Object类是Java语言中的根类,即所有类的父类.它当中描述的所有方法子类都可以使用. 如果在类的声明中没有显式地使用exte ...
- JavaSE基础加强-学习黑马程序员Java基础视频教程(P93开始)
目录 P0:写在前面的小知识 P93:下阶段:JavaSE基础加强简介 P95:static:修饰成员变量.内存机制 P96:static:修饰成员方法.内存机制 P97:static:访问的注意事项 ...
- JavaSE基础——流程控制
JavaSE基础--流程控制 文章目录 JavaSE基础--流程控制 一 .用户交互Scanner 1. 初识Scanner 2. Scanner进阶 二.顺序结构 三.分支结构 1. if单选结构 ...
- java学习之路之javaSE基础1
<h2>java学习之路之javaSE基础1</h2> <div> ###01.01_计算机基础知识(计算机概述)(了解) * A:什么是计算机?计算机在生活中的应 ...
- 【Java面试题】JavaSE基础之Java面向对象
JavaSE基础 1.Java面向对象 1.1.什么是面向对象? 1.2.对象的概念 1.3.面向对象和面向过程的关系和区别 1.4 .面向对象三大核心特性 1.4.1.继承 1.4.2.封装 1.4 ...
最新文章
- 写了一个PPT,用于公司内部培训
- 【转载】Python对接六大主流数据库,只需三步
- 软件开发心得点滴记录
- 中国互联网+政务建设发展现状及市场规模预测报告2022-2027年版
- 目标检测特殊层:ROI Align层详解
- C#配置及使用log4net
- linux shell 自定义函数(定义、返回值、变量作用域)介绍
- Java学习笔记2.3.4 运算符与表达式 - 逻辑运算符
- 【Mac】Mac 下安装MySQL优化工具mysqltuner执行报错 [!!] Attempted to use login credentials
- npm 代理的设置和取消
- 磅 英寸 厘米 dpi 像素
- js(javascript)和jq(jquery)常见问题(持续更新)
- 涂鸦小程序——为自己的人生画上一笔
- IEEE754浮点数标准
- 组合游戏 - SG函数和SG定理
- MSP430C语言编程技巧,如何提高MSP430 C语言编程效率
- 链路追踪jaeger
- 转:随机过程方面书籍的评论
- python操作鼠标进行点击
- google浏览器中页面在新的标签页打开
热门文章