在上一篇文章讲完了static关键字的一些基础知识后,我们就来说一说这个关键字在应用开发中具体可以怎么使用吧,希望看完这篇文章可以对您有帮助📖
类中都是一些静态方法,每个方法都是以完成一个公用的功能为目的,这个类用来给系统开发人员共同使用的
一是调用方便,二是提高了代码复用【一次编写,处处可用】
我们平常在生活中都会遇到很多的验证码需要输入,比如登录注册、修改密码、查询访问,所以验证码处处可在,但是在开发过程中,难道我们开发人员每次遇到一个需要验证码的场合就重新写一次代码,那这样的开发效率就太低了,因此就产生了工具类
//Util工具类
public static String CreateVerifiableCode(int n)
{
String Code = "";
String data = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
Random r = new Random();
for (int i = 0; i < n; i++) {
int index = r.nextInt(data.length()); //0 - data.length - 1
Code += data.charAt(index); //连接所产生的随机字符
}
return Code;
}
//登录注册类
public static void main(String[] args) {
System.out.println(ItheimaUtl.CreateVerifiableCode(3));
}
//异常检查类
public static void main(String[] args) {
System.out.println(ItheimaUtl.CreateVerifiableCode(6));
//ItheimaUtl i = new ItheimaUtl(); 工具类构造器被私有化,无法创建对象
}
对于数组这个数据结构,大家应该在刚刚接触C语言的时候有已经使用过了,经常会让我们去遍历输出一个数组中的所有内容,这个时候的正常操作就是通过一个for循环去遍历,但是如果每次我们输出一个数组都这样去操作,那也会降低开发效率,因此这个也可以定义成工具类
public static String ToString(int[] arr)
{
if(arr == null)
return null;
String result = "[";
for (int i = 0; i < arr.length; i++) {
result += (i == arr.length - 1 ? arr[i] : arr[i] + ", ");
}
result += "]";
return result;
}
有关代码的内容我就不解释了,都是基本的操作,就是多了一个三元运算符,这就是一个简略代码段的操作,相当于if分支,不知道的小伙伴们可以去单独学习一下🔎
//主函数实现类
public static void main(String[] args) {
int[] arr1 = null;
int[] arr2 = {};
int[] arr3 = {12,66,33,48};
System.out.println(ArrayUtil.ToString(arr1));
System.out.println(ArrayUtil.ToString(arr2));
System.out.println(ArrayUtil.ToString(arr3));
}
运行结果
private ItheimaUtl(){
//验证码
}
private ArrayUtil(){
//数组
}
对于代码块,它是类的五大成分之一(成员变量、构造器、方法、代码块、内部类)
在Java中,使用{}括起来的代码被称为代码块
public static String name;
public static ArrayList<String> card = new ArrayList<>();
/*
*静态代码块:有static修饰,属于类,与类一起优先加载,自动触发执行
* 作用:可以用于初始化静态资源
*/
static{
name = "Fire";
System.out.println("Let's go");
card.add("#");
}
public static void main(String[] args) {
System.out.println("name = " + name);
System.out.println("Ok");
}
从上述代码可以看到,我定义了一个静态成员变量name,一个静态集合容器ArrayList,在static代码块中,我分别都对它们进行了初始化,一些需要在程序一启动就初始化好的变量可以放在此处加载
从运行结果中可以看出,Let’s go 这句代码在最前面执行,因为其放在静态代码块中,是优先于所有代码先行加载的,当然最先执行的是name = "Fire"这句代码,只是后面打印而已
String name;
StaticDemo2()
{
System.out.println("===无参构造被触发执行===");
}
/**
*实例代码块:无static修饰,属于对象,每次构建对象时,都会触发一次执行
*
*/
{
System.out.println("===实例代码块被触发执行===");
name = "gg";
}
public static void main(String[] args) {
StaticDemo2 st1 = new StaticDemo2();
System.out.println("name = " + st1.name);
StaticDemo2 st2 = new StaticDemo2();
System.out.println("name = " + st2.name);
}
从上述代码我们可以看出构造代码块会在每次构建对象之前调用,也就是会在构造方法之前,从运行结果我们就可以看出来。我这里是构建了两个对象,它就会调用两次构造代码块
不仅如此,构造代码块还可以用于初始化实例资源,这里我定义了一个姓名name,在代码块中进行一个初始化,然后在分别打印这两个对象的姓名时,发现他们的姓名都是一样的,就是因为实例代码块都是在构建对象前就已经跑过了,所以无论你去构建多少对象,它们都是相同的
但我们知道在程序中每个对象的成员变量都要不一样,这样才能体现类与对象的特性,所以这个代码块在开发中很少用到,大家了解即可,重点在于【静态代码块】🔔
不墨迹,先上代码👇
//1.定义一个静态的集合,存放所有扑克,一个房间只需要一副牌
public static ArrayList<String> cards = new ArrayList<>();
//2.在程序运行前,初始化静态数据,将这些牌放进去
static{ //静态代码块 - 只加载一次
//a.定义一个数组存储所有点数 - 个数确定,类型确定
String[] size = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
//b.定义一个数组存储所有花色 - 个数确定,类型确定
String[] colors = {"♥","♠","♦","♣"};
for (int i = 0; i < size.length; i++) {
for (int j = 0; j < colors.length; j++) {
String card = size[i] + colors[j];
cards.add(card);
}
cards.add("\n");
}
//c.单独加入大小王
cards.add("小王");
cards.add("大王");
}
public static void main(String[] args) {
//3.显示牌
System.out.println("54张牌为");
System.out.println(" " + cards);
}
运行结果
设计模式是一套经过反复使用的代码设计经验,目的是为了重用代码、让代码更容易被他人理解、保证代码可靠性,在开发中遇到很多问题,一个问题会有多种解法,而最优的那一个称为设计模式
具体大家想深入了解的可以看看这篇博客Java常见设计模式总结
单例模式可以确保在系统中,应用该模式的时候永远只会有一个实例,即一个类只能创建一个对象。因为我们在开发中,有些东西往往只需要一个对象就够了,对象多了🐶就会占内存
单例模式可以帮助我们在实现一个类时只创建一个对象,从而节省空间,提高系统性能🏃
当想实例化一个单例类的时候,必须要记住使用相应的获取对象的方法,而不是使用new,可能会给其他开发人员造成困扰,特别是看不到源码的时候
单例模式有七八种,这里我们讲解一下常用的两种🎈
1.定义一个类,然后把构造器私有化,为的是不然外界轻易访问
2.定义一个静态变量去存储一个对象,为的是实现单例的功能
//饿汉单例 - 已提前构建好一个对象
public class SingleInstance {
//1.构造器私有化
private SingleInstance(){}
//2.饿汉单例在获取对象前,对象已经提前准备好了,
// 这个对象只能是一个,所以定义静态成员变量记住
public static SingleInstance instance = new SingleInstance();
}
public static void main(String[] args) {
SingleInstance s1 = SingleInstance.instance;
SingleInstance s2 = SingleInstance.instance;
System.out.println(s1 == s2);
//该对象只会生成一个,两个对象的地址相同
}
以上这个测试结果为true,就不显示了
public static SingleInstance instance = new SingleInstance();
public static int age = 18;
看完了饿汉单例,接下来我们来了解一下另一种单例模式——懒汉单例
1.定义一个类,然后将构造器私有化,不让外界访问
2.声明一个静态变量,但是不为其初始化构建对象
3.提供一个返回单例对象的方法,在真正需要用时返回对象
//懒汉单例 - 访问时才产生对象
public class SingleInstance2 {
//1.构造器私有化
private SingleInstance2(){}
//2.定义一个静态变量存储对象,只调用一次
private static SingleInstance2 instance2;
//private私有化,使得外界无法访问到此静态变量
//3.提供一个方法,对象返回单例对象
public static SingleInstance2 getInstance2()
{
if(instance2 == null){
//若instance2为空,表示第一次来拿对象
instance2 = new SingleInstance2();
}
//若不为空,则表示是第二次及以上来获取对象,直接返回上一个创建的对象即可
return instance2;
}
}
public static void main(String[] args) {
SingleInstance2 s1 = SingleInstance2.getInstance2();
SingleInstance2 s2 = SingleInstance2.getInstance2();
//两个对象相同,第二次创建对象时还是第一个的地址
System.out.println(s1);
System.out.println(s2);
}
运行结果
饿汉单例的原理就是,在你真正需要用到对象的时候才去调用方法接口创建,而不是像懒汉单例一样在事先给你创建好
SingleInstance s3 = SingleInstance.instance;
SingleInstance s4 = SingleInstance.instance;
System.out.println(s3);
System.out.println(s4);
本文主要讲述了static关键字在实例应用中的表现形式,可以作为【工具类】来减少代码的复用、可以通过【静态代码块】来初始化静态成员变量、也可以将其运用在【单例】中,节省系统资源,提高系统性能
OK,对于static关键字在Java中的应用就讲到这里,相信大家在看完上一篇文章和本文后对static关键字有了一个更加深入的了解了,这个关键字在Java中还是起到比较重要的一个作用,大家在学习的时候一定要好好掌握,如果有什么疑问,可以于评论区或私信留言,感谢您的观看🌹