Java基础13 面向对象~static关键字和单例模式

为热爱编程的你点赞!
学习SpringBoot实战课程 https://edu.csdn.net/course/detail/31433
学习SpringCloud入门课程 https://edu.csdn.net/course/detail/31451


面向对象系列:
类和对象
封装
继承
多态
static关键字和单例模式
接口和内部类

前言

Hello,大家好,本章我们介绍两个知识点:static关键字和单例模式

static关键字

static的意思是静态,可以用来修饰类的属性和方法,一旦被static修饰的属性和方法,就会由类的所有对象共享,而不是属于某一个对象。

当某些属性和方法不想被对象调用时,就可以定义成静态的。

静态属性

语法:

static 类型 属性名;

静态属性的调用:

类名.属性名
也可以使用:对象名.属性
一般推荐使用类名调用静态成员

静态属性和非静态属性的区别

public class StaticTest {
	int count;
	public static void main(String[] args) {
		StaticTest t1 = new StaticTest();
		StaticTest t2 = new StaticTest();
		StaticTest t3 = new StaticTest();
		t1.count++;
		t2.count++;
		t3.count++;
		System.out.println(t1.count);
		System.out.println(t2.count);
		System.out.println(t3.count);
	}
}

输出结果都是1,如果将count定义为static的,输出结果为3,为什么?
总结:

  1. 静态的属性保存在方法区中,每个对象都共享这一个静态属性。
  2. 非静态的属性是由每个对象都有一个独立的副本。

非静态属性
在这里插入图片描述
静态属性
在这里插入图片描述

静态常量

开发过程中我们需要一些固定的数据,如:圆周率 3.1415926

扫描二维码关注公众号,回复: 12192312 查看本文章
public static final double PI = 3.1415926;

优点:

  1. 可读性高
  2. 提高数据的安全性
  3. 调用和维护方便

静态方法

定义:

public static 返回值类型 方法名(参数){
}

调用:

类名.方法名(参数)

注意:

  1. 静态方法中可以直接调用当前类的其它静态属性和方法
  2. 静态方法中不能直接调用当前类的非静态方法属性和方法
  3. 非静态方法中可以直接调用当前类的静态和非静态的属性和方法
  4. 静态方法中不能出现this和super关键字

Java中的各种工具类都大量使用静态方法,如:Arrays、Math等

静态代码块

语法:

static{
	代码块
}

作用:
对静态的成员进行初始化
特点:

  1. 静态代码块只执行一次
  2. 在类加载到内存后执行,是类中所有代码最先执行
  3. 在第一次使用类的使用调用

面试题:下面代码的执行结果

public class Test2 {

	//静态代码块
	static{
		System.out.println("这是静态代码块");
	}
	
	//非静态代码块
	{
		System.out.println("这是非静态代码块");
	}
	
	//构造方法
	public Test2(){
		System.out.println("这个构造方法");
	}
	
	public static void main(String[] args) {
		Test2 t1 = new Test2();
		Test2 t2 = new Test2();
		Test2 t3 = new Test2();
	}
}

在这里插入图片描述
执行顺序:

  1. 静态代码块(只执行一次)
  2. 非静态代码块(每个对象执行一次)
  3. 构造方法(每个对象执行一次)

静态导入

jdk1.5的特性,导入某个类的静态方法后,可以不通过类名直接调用

//静态导入
import static java.util.Arrays.sort;

public class Test3 {

	public static void main(String[] args) {
		int[] array = {3,5,7,8,2};
		//直接调用
		sort(array);
		for(int n : array){
			System.out.println(n);
		}
	}
}

单例模式

设计模式是前人针对不同的应用需求总结一套解决方案,常见的设计模式有23种,也称为GOF23。
单例模式属于GOF23中的创建性模式,作用是:保证一个类只能创建一个实例

单例模式的应用场景

  1. 某些业务场景,如:公司只有一个老板
  2. 减少大型对象对系统资源的消耗,如:连接池、线程池

如何实现单例模式

步骤:

  1. 将构造方法定义成private的
  2. 在单例类的内部定义一个该类的静态对象
  3. 定义一个静态方法用于返回静态对象

单例的分类

单例模式分为:饿汉式和懒汉式
区别是:

  • 饿汉式,一开始就创建对象
    优点:代码简洁
    缺点:如果方法没有调用,就浪费了内存
  • 懒汉式,开始不创建对象,当方法被调用后,再创建对象
    优点:内存的分配更高效
    缺点:有线程安全问题

饿汉式

/**
 * 单例
 */
public class Singleton {
	
	//静态对象
	private static Singleton instance = new Singleton();

	//私有构造方法
	private Singleton(){
	}
	
	//返回对象
	public static Singleton getInstance(){
		return instance;
	}
	
	public static void main(String[] args) {
		Singleton s1 = Singleton.getInstance();
		Singleton s2 = Singleton.getInstance();
		Singleton s3 = Singleton.getInstance();
		System.out.println(s1 == s2);
		System.out.println(s2 == s3);
	}
}

懒汉式

//静态对象
private static Singleton instance = null;

//返回对象
public static Singleton getInstance(){
	if(instance == null){
		instance = new Singleton();
	}
	return instance;
}

在这里插入图片描述

结束

好了,本文内容就是这么多,欢迎大家留言讨论


大家如果需要学习其他Java知识点,戳这里 超详细的Java知识点汇总

猜你喜欢

转载自blog.csdn.net/u013343114/article/details/112509898