> 文档中心 > JavaSE加强知识

JavaSE加强知识

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张牌(放在静态{}加载)共享使用,减少内存消耗。

模拟实现:

 

 静态代码的作用是什么?

  • 如果要在启动时对静态资源进行初始化,则建议使用静态代码块完成数据的初始化操作

 单例模式:

  • 可以保证系统中,应用该模式的这个类只有一个实例(对象)
  • 例如任务管理器对象我们仅仅需要创建一个,节省内存空间

例如:饿汉单例模式、懒汉单例模式

饿汉不用多说,私有构造器+静态变量创建一个对象 

懒汉单例:

  • 在真正需要对象的时候,才去创建一个对象(延迟加载对象)
  • 私有构造器+定义一个静态变量储存一个对象(但是不初始化)
  • 提供一个返回单例对象的方法

 

 

总的来说:

饿汉和懒汉都是限制只能创建一个对象,前者直接利用静态成员变量创建好,后者首先不对静态变量初始化,而是利用静态函数返回。两种单例模式都限制了对象的唯一,但是懒汉更加节省内存空间,限制对象个数的创建,饿汉可以创建多个单例对象(对象都一样)浪费内存空间!

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

告一段落,谢谢大家的阅读,下篇文章见!!!