文章目录本篇文章为学习笔记
- 前言
- static关键字
- 1.静态变量
- 2.静态方法
- 3.静态代码块
- 4.单例模式
- 4.1 饿汉模式
- 4.2 懒汉模式
前言
在Java中,static关键字可以修饰类的成员,如成员变量、成员方法以及代码块,被修饰的成员具有一些特殊性。
static关键字 1.静态变量- 在定义一个类时,只是描述某类事物的特征和行为,并没有产生具体的数据。只有通过new关键字的创建该类的实例对象后,系统才会为每个对象分配空间,存储各自的数据。有时候,我们希望某些特定的数据在内存中只有一份,而且能够被一个类的所有实例对象所共享。
- Java中,可以使用static关键字来修饰成员变量,该变量被称作静态变量。静态变量被所有实例共享,使用**“类名.变量名”**的形式来访问。
- 部分代码展示:
//定义一个Student类 class Student{ static String schoolName; //定义静态变量schoolName } public class LearnStatic1 { public static void main(String[] args) { Student student1 = new Student(); //创建学生对象 Student student2 = new Student(); Student.schoolName = "家里蹲大学"; //为静态变量赋值 System.out.println("我的学校是"+student1.schoolName); System.out.println("我的学校是"+student2.schoolName); } }
- 因为 schoolName 是静态变量所以可以直接通过类名.变量名的方式直接调用,也可以通过实例对象进行调用。
注意:static关键字只能用于修饰成员变量,不能用于修饰局部变量,否则编译会报错。即是说不能在代码块内部定义静态变量。
-
有时我们希望在不创建对象的情况下就可以调用某个方法,即是说该方法不必和对象绑在一起。实现这样的效果只需要在类中定义的方法前加上static关键字,我们可以称这类方法为静态方法。跟静态变量的访问方式相同:类名.方法。
-
部分代码展示:
public static void sayHello(){ System.out.println("hello,我是一个静态方法"); } public static void main(String[] args) { //静态方法方法问方式:类名.方法名 LearnStatic1.sayHello(); }
注意:在一个静态方法中只能访问用static修饰的成员,原因在于没有被static修饰的成员需要先创建对象才能访问,而静态方法在调用时可以不创建任何对象。即是说静态的变量和方法主要绑定的是类,而不是具体的对象。
- 在Java中,使用一对大括号包围起来的若干代码被称为一个代码块,用static修饰的被称为静态代码块。
- 当类被加载时,静态代码块会执行,由于类只加载一次,因此静态代码块只执行一次。
- 在程序中,通常会使用静态代码块对类的成员变量进行初始化。
- 部分代码展示:
//静态代码块 static{ System.out.println("测试类的代码块执行了"); } public static void main(String[] args) { //创建两个对象 Person person1 = new Person(); Person person2 = new Person(); } //创建一个人类 class Person{ static String country; //静态代码块 static{ country = "China"; System.out.println("Person类中的静态代码块被执行了"); }
-
单例模式是Java中的一种设计模式,它是指在设计一个类时,需要保证在整个程序中运行期间针对该类只存在一个实例对象。例如工具类等在程序运行过程中,注重的是类中的方法和属性,而不是具体的实例对象,不需要创建太多的情况。
-
实现单例模式的步骤:
- 构造函数私有化;
- 创建一个全局的静态的(static)该类型对象作为属性;
- 写一个公共(public)静态(static)的方法来返回该类型对象。
-
通过创建类的对象来判断是否满足单例设计模式的要求:
JiSuan js1 = JiSuan.getJiSuan(); JiSuan js2 = JiSuan.getJiSuan(); System.out.println(js1 == js2);
- 把创建对象的过程,放在了定义全局变量的时候
- 部分代码展示:
//创建一个计算工具类 public class JiSuan { static JiSuan js=new JiSuan();; private JiSuan(){} //写一个方法返回对象 public static JiSuan getJiSuan(){ return js; }
- 创建对象放在了方法里
- 懒汉模式的时候注意线程安全问题,可以在返回对象的这个方法上,加synchronized关键字
- 部分代码展示:
public class JiSuan { static JiSuan js; private JiSuan(){} public synchronized static JiSuan getJiSuan(){ if(js != null){ return js; }else{ js= new JiSuan(); return js; } }
如有错误,欢迎大佬指出!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)