tips:在Java中,万物皆对象,不然我们的Java就白学了!!!
本栏文章我们将会陆续上传以下知识:
static、单例、代码块、继承 面向对象五大金刚(成员变量、方法、代码块、构造器、内部类)
权限修饰符、抽象类、接口
多态、内部类、常用API
正则表达式(RE) Lambda
Collection集合、数据结构、list、泛型 ArrayList<类型>
Set、Collections、Map、集合嵌套
不可变集合、Stream流、异常
Logback日志框架、阶段项目
File、递归、IO流(一)(二)
多线程
网络编程
Java高级技术:单元测试、反射、注解、动态代理
XML-解析、设计模式
能力培养:
完整的JavaSE体系
阅读Java程序的能力
编程思维
Java面试
解决问题的能力
支撑后面企业级技术的学习
内容呈现:
思考:之前在类里定义的时候这些成员变量属于对应的对象,那我们如何表示共享变量呢?例如
当前在线人数,我们把每一个用户看做是一个对象(有自己的成员变量和方法)
设计模式:单例 (只允许创建一个对象)
有些对象需要一个就可以了,例如pc的任务管理器(限制对象个数为1)
引出继承:
系统中有很多实体类的属性和行为存在重复的代码,为了减少代码的冗余,我们如何优化这些代码呢?如何提高代码的复用性呢?
成员变量分为实体成员变量和静态成员变量
- 静态(有static修饰,属于类,内存中仅仅加载一次)常见的:在线人数信息,共享访问
- 实体 例如上面的例子 实体变量属于该对象
成员变量的分类和访问分别是什么样的?
- 静态成员变量(加载一次 共享使用) 推荐(类名.静态变量名)
- 实例成员变量(无static修饰 属于对象)访问格式 首先创建对象 对象.实体变量
两种成员变量各自在什么情况下定义?
静态成员变量:共享访问
实体成员变量:私有访问
注意:
静态成员变量可以直接被访问(在一个类里可以直接写静态变量名);
实体成员变量要访问必须想要创建对象,才能调用使用。
内存分配:
方法区:加载类和主函数
堆内存:对象的信息(成员变量 方法等) 静态成员变量
栈:存储对象的地址 当执行到该函数时,通过对象地址联合堆内存拿到数据进行访问
静态方法: 可以由类直接调用(推荐) 也可以新建对象访问(不推荐)
成员方法的分类和访问分别是什么样的?
- 静态成员方法 (static修饰 共享) 类名.方法名 共享调用
- 实例成员方法 (无static修饰 不共享)首先创对象 对象.方法 私有调用
每种成员方法的使用场景什么样的?
- 表示对象自己的行为的 且在方法中需要直接访问实例成员 需要申明实例方法
- 如果该方法是一个通用的功能,可以申明为静态方法
static的注意事项:
- 静态方法只能访问静态的成员,不可以访问实体的成员(对象独立具有)静态方法+静态变量
- 实例方法可以访问静态方法 也可以访问实例成员(属于对象本身) this只能出现在实例里
- 静态方法中不允许出现this关键字 this指的是当前对象地址 不能访问属于别的对象的变量
static工具包案例:创建验证码
工具类是什么?
类中都是一些静态方法,开发人员共享使用。
企业管理中,通常需要一个系统的很多业务使用验证码进行安全控制。
问题:同一个功能,,会出现代码重复度过高。
使用根据类的好处:
调用方便
提高代码复用性(Java核心:一次编译,永久使用)
为什么工具类中的方法不用实例方法做?
- 实例方法需要创建对象
- 此时使用对象仅仅是调用了方法,但是浪费了内存
工具类定义要求:
- 设置构造器私有
- 写静态方法 方便 类.静态方法
回顾总结:
工具类是什么,好处?
- 内部是一些静态方法,每个方法完成一个功能
- 一次编写,处处可用,提高代码的复用性
工具类有什么要求?
- 建议工具类的构造器私有处理
定义打印数组的工具类:
测试结果:
代码块知识:
- 代码块是类的五大成分之一(成员变量、方法、构造器、代码块、内部类)
- 在Java类下,使用{}括起来的代码称为代码块 含:static{} {} 分为静态和实体
代码块细分:
静态代码块
- 格式 :static{}
- 特点:需要通过static关键字修饰,随着类的加载而加载,并且自动触发,进行一次
- 使用场景:在类的加载中做一些静态数据初始化没便于后续使用
构造代码块
- 格式 :{}
- 特点:每次创建对象,调用构造器都会执行该代码块的代码 再构造器运行前运行
- 使用场景:在类的加载中做一些实例数据初始化没便于后续使用
可以看到:加载类的时候,自动加载static{}里的数据:一般用于静态数据的初始化main执行靠后
案例:斗地主游戏
需求:在启动游戏房间的时候,提前准备54张牌(放在静态{}加载)共享使用,减少内存消耗。
模拟实现:
静态代码的作用是什么?
- 如果要在启动时对静态资源进行初始化,则建议使用静态代码块完成数据的初始化操作
单例模式:
- 可以保证系统中,应用该模式的这个类只有一个实例(对象)
- 例如任务管理器对象我们仅仅需要创建一个,节省内存空间
例如:饿汉单例模式、懒汉单例模式
饿汉不用多说,私有构造器+静态变量创建一个对象
懒汉单例:
- 在真正需要对象的时候,才去创建一个对象(延迟加载对象)
- 私有构造器+定义一个静态变量储存一个对象(但是不初始化)
- 提供一个返回单例对象的方法
总的来说:
饿汉和懒汉都是限制只能创建一个对象,前者直接利用静态成员变量创建好,后者首先不对静态变量初始化,而是利用静态函数返回。两种单例模式都限制了对象的唯一,但是懒汉更加节省内存空间,限制对象个数的创建,饿汉可以创建多个单例对象(对象都一样)浪费内存空间!
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
告一段落,谢谢大家的阅读,下篇文章见!!!