JavaSE加强知识

2023-11-15

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

模拟实现:

 

 静态代码的作用是什么?

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

 单例模式:

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

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

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

懒汉单例:

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

 

 

总的来说:

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

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

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

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaSE加强知识 的相关文章

随机推荐

  • 50道Java集合经典面试题(收藏版)

    前言 来了来了 50道Java集合面试题也来啦 已经上传github https github com whx123 JavaHome 1 Arraylist与LinkedList区别 可以从它们的底层数据结构 效率 开销进行阐述哈 Arr
  • sass变量引入全局

    https www jianshu com p ab9ab999344b copy 本文以Sass做案例 Less的参考 基本配置大同小异 假如我们有一个Sass的全局变量common scss文件 路径 style common scss
  • 解决使用Nginx错误 Failed to load resource: net::ERR_INCOMPLETE_CHUNKED_ENCODING问题

    Failed to load resource net ERR INCOMPLETE CHUNKED ENCODING问题 先说解决办法 方法一 直接删除Nginx缓存文件即可 方法二 更改权限 问题描述 使用Nginx代理的服务 一直使用
  • Flutter 特定页面切换屏幕方向/iOS强制横屏/SystemChrome.setPreferredOrientations不起作用 看这里!...

    转载请标明出处 juejin im post 5c68da 本文出自 Wos的主页 我此刻的Flutter版本 Flutter 1 2 0 channel dev github com flutter flu Framework revis
  • unity3D海底珊瑚礁、珊瑚岛场景和海底植物岩石素材素材包

    unity3D海底珊瑚礁 珊瑚岛场景和素材 详情如下图 下载链接在文末 下载链接 https download csdn net download weixin 43474701 54972284
  • vue+css中通过一个div的hover触发另一个的样式变化

    思路 通过触发父div 除了改变父div的背景色外 还同时改变div中i标签的颜色 效果图 原本 hover触发后 html代码 div class user addfrid i class iconfont icon friend add
  • 面向对象(封装、继承、多态)

    PP2study7 一 面向对象简介 二 封装 三 继承 四 多态 一 面向对象简介 面向过程 Procedure Oriented 简称PO 就是分析出解决问题所需要的步骤 然后用函数把这些步骤一步一步实现 使用的时候一个一个依次调用就可
  • Google Cloud Platform

    本文由Cloud Ace整理发布 更多内容请访问 Cloud Ace 官网 防火墙规则是 Google Cloud 中网络安全的重要组成部分 Google Cloud 中的防火墙大致可分为两种类型 网络防火墙策略和分层防火墙策略 虽然网络防
  • java8之CollectorsAPI详解(带实例)04

    写给自己避免忘掉 private static void testSummingDouble System out println testSummingDouble Optional of menu stream collect Coll
  • 如何给特殊字符串加索引:如身份证、邮箱等

    1 建表语句 CREATE TABLE user id int 11 NOT NULL AUTO INCREMENT id card varchar 18 NOT NULL email varchar 50 NOT NULL PRIMARY
  • 微信公众平台开发调试方法

    在这篇微信公众平台开发教程中 我们将介绍如何进行微信公众平台上的开发调试方法 一 方倍微信调试器 微信调试器是方倍工作室开发的用于微信公众平台接口开发调试的工具 具有Token校验 模拟关注及取消关注 发送文本 图片 语音 视频 位置 链接
  • oracle 基础:表操作

    创建表 示例 CREATE TABLE 表名称 字段名 类型 长度 primary key 字段名 类型 长度 修改表 增加字段 ALTER TABLE 表名称 ADD 列名 1 类型 DEFAULT 默认值 列名 2 类型 DEFAULT
  • MYSQL--基础--05--binlog日志文件过大

    MYSQL 基础 05 binlog日志文件过大 1 Mysql binlog 介绍 mysql binlog是MySQL数据库的二进制日志 用于记录用户对数据库操作的SQL语句 除了数据查询语句 信息 如果mysql 运行很长一段时间 日
  • 汇编语言aaa指令解析,aas指令解析

    aaa指令本质上是将相加后的结果拆成两个部分 拆成非压缩BCD码的形式 下面进行举例介绍 1 ah 0 al 06h bl 09h 执行指令add al bl得ah 01h al 05h aaa的作用就是将相加后al中的结果15拆分成两部分
  • python-opencv对极几何 StereoRectify

    OpenCV如何正确使用stereoRectify函数 函数介绍 用于双目相机的立体校正环节中 这里只谈谈这个函数怎么使用 参数具体指哪些 函数参数 随便去网上一搜或者看官方手册就能得到参数信息 但是 相对关系非常容易出错 这里详细解释一下
  • 电脑提示vcruntime140_1.dll缺少怎么办?

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或者损坏了 这时你只需下载这个vcruntime140 1 dll文件进行安装
  • Alpaca构建方式探秘:低成本构造指令数据增强LLM

    官方介绍 Alpaca A Strong Replicable Instruction Following Model github地址 https github com tatsu lab stanford alpaca Alpaca简介
  • 【STL】list容器的插入与删除

    STL list容器插入与删除 添加或插入新元素 list成员方法 push front 向 list 容器首个元素前添加新元素 push back 向 list 容器最后一个元素后添加新元素 emplace front 在容器首个元素前直
  • 基于LSTM、BP神经网络实现电力系统负荷预测(Python代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 2 1 LSTM 2 2 BP 3 Python代码及数据 4 参考文献 1 概述 前馈神经
  • JavaSE加强知识

    tips 在Java中 万物皆对象 不然我们的Java就白学了 本栏文章我们将会陆续上传以下知识 static 单例 代码块 继承 面向对象五大金刚 成员变量 方法 代码块 构造器 内部类 权限修饰符 抽象类 接口 多态 内部类 常用API