Java基础——4、面向对象(下)——单例、final、抽象类、接口、内部类

本文详细介绍了Java中的面向对象特性,包括静态变量、静态方法、单例设计模式、final关键字、抽象类和接口。讲解了静态变量的加载过程,对比了饿汉式和懒汉式的单例实现,讨论了抽象类的使用场景,以及接口在代理模式中的应用。此外,还探讨了内部类的概念及其分类。
摘要由CSDN通过智能技术生成

接上一章
面向对象(中)

凡是被static修饰的结构,都是随着类的加载而加载,只加载一次

1、关键字:static

1、static : 静态的
2、static 可以用来修饰 : 属性、方法、代码块、内部类
3、使用static修饰属性:静态变量(类变量)
3.1、属性:按是否使用static修饰,又分为:静态属性 vs 非静态属性(实例变量)
》 实例变量:我们创建了类的多个对象,每个对象都独立的拥有一套类中的非静态属性。
当修改其中一个对象中的非静态属性时,不会导致其他对象中同样的属性值的修改。
》静态变量:我们创建了类的多个对象,多个对象共享同一个静态变量。当通过某一个对象修改静态变量时,
会导致其他对象调用此静态变量时,是修改过了的。
在这里插入图片描述
3.2、static修饰属性的其他说明:
静态变量随着类的加载而加载。可以通过"类.静态变量"的方式进行调用
静态变量的加载要早于对象的创建,
由于类只会加载一次,则静态变量在内存中也会存在一份;存在方法区的静态域中。
静态变量是存在方法区的静态域中。
.
4、使用static修饰方法:静态方法
随着类的加载而加载,可以通过 ” 类.静态方法 “ 的方式进行调用

在这里插入图片描述
静态方法中,只能调用静态的方法或属性
非静态方法中,既可以调用非静态的方法或属性,也可以调用静态的方法或属性
.
5、static注意点:
在静态的方法内,不能使用this关键字、super关键字
原因:
this和super指代的是当前对象和父类对象,是在类加载静态结构之后才会new对象,
因为new是在static之后所以无法在静态方法内使用

1.1、类变量(static修饰的)和实例变量的内存解析

栈:存放局部变量
堆:存放new出来的结构; 对象、数组
方法区:类的加载信息、静态域、常量池

结合下图分析:
1、先在方法区里面的静态域中生成nation属性,默认值为null 然后赋值为中国
2、在栈中声明c1 这个局部变量 堆空间中new一个类结构生成一个0x2233的地址值, c1 通过0x2233地址值找到堆空间的结构,给name和age赋值
3、c2 操作类似
4、c1找到静态域的nation 然后将其默认值null改为CHN
5、因为nation是静态变量 随着类加载,只加载一次,所以c2调用的和c1一开始调用的都是静态域里面同一个nation变量,c2将其值改为CHINA。
6、总结:可以看出 类变量和实例变量的赋值操作是有出入的

在这里插入图片描述

2、23种设计模式

创建型模式——5种

  • 工厂方法模式
  • 抽象工厂模式
  • 单例模式
  • 建造者模式
  • 原型模式

结构型模式——7种

  • 适配器模式
  • 装饰器模式
  • 代理模式
  • 外观模式
  • 桥接模式
  • 组合模式
  • 享元模式

行为型模式——11种

  • 策略模式
  • 模板方法模式
  • 观察者模式
  • 迭代子模式
  • 责任链模式
  • 命令模式
  • 备忘录模式
  • 状态模式
  • 访问者模式
  • 中介者模式
  • 解释器模式

3、单例设计模式

在这里插入图片描述

单例模式
某个类只能存在一个对象实例

3.1、单例模式如何实现?

饿汉式:

//单例模式——饿汉式
实体类
class Bank{
   
	//1、私有化类的构造器;外部不能new对象
	private Bank(){
   
		
	}
	//2、内部创建类的对象;
	//4、该类的属性也得是静态的属性,才可以被静态方法调用
	private static Bank instance = new Bank();
	//3、提供公共的静态方法,返回类的对象
	public static Bank getInstance(){
   
		return instance;
	}
	
}
测试类
/*
 * 单例模式——饿汉式
 * 某个类只能存在一个对象实例
 * 如何实现?
 * 1、私有化类的构造器;不能让该类在外部实例对象
 * 2、内部创建类的对象;因为构造器私有化了,外部不能实例化,只能内部实现
 * 3、提供公共的静态方法,返回类的对象;
 * 为什么是静态的方法呢?
 * 如果不是静态的方法,只能在外部new一个对象才能调用该方法,
 * 但是该类的构造器私有化了,外部不能new对象,所以只能通过类名调用该方法。
 * 4、要求作为属性的这个instance对象也要是静态的属性;
 * 为什么是静态的属性?
 * 因为要通过该类中的静态方法去实现实例化,静态方法只能调用静态的属性,所以该属性也必须是静态的属性。
 * */
public class SingletonTest1 {
   
	public static void main(String[] args) {
   
		//单例的方式创建对象
		Bank instance = Bank.getInstance();
		Bank instance1 = Bank.getInstance();
		//测试  该类是否是有一个对象实例,,如果结果为true,说明两个对象的地址值是一样的。
		System.out.println("饿汉模式:"+(instance == instance1));//饿汉模式:true
	}
}

懒汉式:

单例模式——饿汉式
实体类
class Order{
   
	//1、私有化构造器
	private Order(){
   
		
	}
	//2、声明当前类对象,先不初始化,要在方法中new对象
	//4、此对象也必须声明为static的;——才可以被静态方法调用
	private static Order instance = null;
	//3、声明公共的、静态的返回当前类对象的方法
	public static Order getInstance(){
   
		//为了实现单例的懒汉模式,必须先判断之前该类有没有实例化
		//如果为null说明没有实例化,就给他new一个,否则不需要new对象
		if (instance == null) {
   
			instance = new Order();
		}
		return instance
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值