JavaSE进阶(一)—— 面向对象进阶(static、单例、代码块、继承)

2023-11-18

目录

一、static静态关键字

1. static是什么,static修饰成员变量的用法

2. 成员方法的分类

2.1 使用场景

3. static修饰成员方法的内存原理

4. static的注意事项[拓展]

二、static应用知识:工具类

1. 工具类是什么

2. 工具类的好处

3. 为什么工具类中的方法不用实例方法做? 

4. 工具类定义时的其他要求

二、static应用知识:  代码块        

1. 代码块概述

2. 代码块分类

2.1 静态代码块

2.2 构造代码块(了解,见的少)

3. 静态代码块的应用案例

4. 静态代码块的作用

三、static应用知识:单例设计模式

1. 什么是设计模式(Design pattern)

2. 饿汉单例模式

2. 懒汉单例模式

四、面向对象三大特征之二:继承

1. 继承概述、使用继承的好处

1.1 什么是继承

1.2 使用继承的好处

1.3 案例练习

1.4 继承的格式

1.5 继承后子类的特点

2. 继承的设计规范、内存运行原理

3. 继承的特点

4.继承后:成员变量、成员方法的访问特点

5. 继承后:方法重写

5.1 什么是方法重写

5.2 方法重写的应用场景

5.3 @Override重写注解

5.4 方法重写注意事项和要求

6. 继承后:子类构造器的特点

6.1 怎么调用父类构造器

7. 继承后:子类构造器访问父类有参构造器

7.1 super调用父类有参数构造器的作用

7.2 如果父类中没有无参数构造器,只有有参构造器,会出现什么现象呢?

7.3 如何解决?

8. this、super使用总结 


面向对象知识的学习建议:多关注语法点的基本作用、多进行思考和记忆、练习

一、static静态关键字

1. static是什么,static修饰成员变量的用法

  • static是静态的意思,可以用来修饰成员变量、成员方法
  • static修饰成员变量之后称为静态成员变量(类变量),修饰方法之后称为静态方法(类方法)
  • static修饰后的成员变量,可以被类的所有对象共享(访问、修改)
    public class User {   
        static String name;   
        int age;
    }
    

2. 成员方法的分类

  • 静态成员方法(有static修饰,归属于类),建议用类名访问,也可以用对象访问。
  • 实例成员方法(无static修饰,归属于对象),只能用对象触发访问。 

2.1 使用场景

  • 表示对象自己的行为的,且方法中需要访问实例成员的,则该方法必须申明成实例方法。
  • 如果该方法是以执行一个共用功能为目的,则可以申明成静态方法。

3. static修饰成员方法的内存原理

4. static的注意事项[拓展]

  • 静态方法只能访问静态的成员,不可以直接访问实例成员。
  • 实例方法可以访问静态的成员,也可以访问实例成员。
  • 静态方法中是不可以出现this关键字的。 

二、static应用知识:工具类

1. 工具类是什么

类中都是一些静态方法,每个方法都是以完成一个共用的功能为目的,这个类用来给系统开发人员共同使用的。

2. 工具类的好处

一是调用方便,二是提高了代码复用(一次编写,处处可用)

3. 为什么工具类中的方法不用实例方法做? 

  • 实例方法需要创建对象调用。
  • 此时用对象只是为了调用方法,这样只会浪费内存。

4. 工具类定义时的其他要求

由于工具里面都是静态方法,直接用类名即可访问,因此,工具类无需创建对象,建议将工具类的构造器进行私有

二、static应用知识:  代码块        

1. 代码块概述

  • 代码块是类的5大成分之一(成员变量、构造器,方法,代码块,内部类),定义在类中方法外。 在Java类下,使用 { } 括起来的代码被称为代码块 。

2. 代码块分类

2.1 静态代码块

  • 格式:static{}
  • 特点:需要通过static关键字修饰,随着类的加载而加载,并且自动触发、只执行一次
  • 使用场景:在类加载的时候做一些静态数据初始化的操作,以便后续使用。  

2.2 构造代码块(了解,见的少)

  • 格式:{}
  • 特点:每次创建对象,调用构造器执行时,都会执行该代码块中的代码,并且在构造器执行前执行
  • 使用场景:初始化实例资源。

3. 静态代码块的应用案例

斗地主游戏:

需求: 在启动游戏房间的时候,应该提前准备好54张牌,后续才可以直接使用这些牌数据。

分析:

  • 该房间只需要一副牌。
  • 定义一个静态的ArrayList集合存储54张牌对象,静态的集合只会加载一份。
  • 在启动游戏房间前,应该将54张牌初始化好
  • 当系统启动的同时需要准备好54张牌数据,此时可以用静态代码块完成。

4. 静态代码块的作用

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

三、static应用知识:单例设计模式

1. 什么是设计模式(Design pattern)

  • 开发中经常遇到一些问题,一个问题通常有n种解法的,但其中肯定有一种解法是最优的,这个最优的解法被人总结出来了,称之为设计模式。
  • 设计模式有20多种,对应20多种软件开发中会遇到的问题。
  • 学设计模式主要是学2点:
    • 第一:这种模式用来解决什么问题。
    • 第二:遇到这种问题了,该模式是怎么写的,他是如何解决这个问题的。

2. 饿汉单例模式

在用类获取对象的时候,对象已经提前为你创建好了。

设计步骤:

  • 定义一个类,把构造器私有
  • 定义一个静态变量存储一个对象
/** a、定义一个单例类 */
public class SingleInstance { 
    /** c.定义一个静态变量存储一个对象即可 :属于类,与类一起加载一次 */   
    public static SingleInstance instance = new SingleInstance ();  
    /** b.单例必须私有构造器*/  
    private SingleInstance (){    
        System.out.println("创建了一个对象");  
    }
}

2. 懒汉单例模式

在真正需要该对象的时候,才去创建一个对象(延迟加载对象)。

设计步骤:

  • 定义一个类,把构造器私有
  • 定义一个静态变量存储一个对象
  • 提供一个返回单例对象的方法
/** 定义一个单例类 */
class SingleInstance{    
    /** 定义一个静态变量存储一个对象即可 :属于类,与类一起加载一次 */    
    public static SingleInstance instance ; // null    
    /** 单例必须私有构造器*/    
    private SingleInstance(){}    
    /** 必须提供一个方法返回一个单例对象  */    
    public static SingleInstance getInstance(){        
        ...        
        return ...;    
    }
}

四、面向对象三大特征之二:继承

1. 继承概述、使用继承的好处

1.1 什么是继承

Java中提供一个关键字extends,用这个关键字,我们可以让一个类和另一个类建立起父子关系。

public class Student extends People {}

Student称为子类(派生类),People称为父类(基类 或超类)。 

作用:当子类继承父类后,就可以直接使用父类公共的属性和方法

1.2 使用继承的好处

可以提高代码的复用性。

1.3 案例练习

请阅读以下代码存在的问题,并使用继承这个技术进行优化

解决方案:把相同的属性和行为抽离出来,可以降低重复代码的书写,抽取出来放到何处呢? 

解决:继承(extends)关系, 好处:提高代码复用 

1.4 继承的格式

子类 extends父类

1.5 继承后子类的特点

  • 子类 继承父类,子类可以得到父类的属性和行为,子类可以使用。
  • Java中子类更强大 

2. 继承的设计规范、内存运行原理

子类们相同特征(共性属性,共性方法)放在父类中定义,子类独有的的属性和行为应该定义在子类自己里面。

3. 继承的特点

  • 子类可以继承父类的属性和行为,但是子类不能继承父类的构造器。
  • Java是单继承模式:一个类只能继承一个直接父类。
  • Java不支持多继承、但是支持多层继承。
  • Java中所有的类都是Object类的子类。

子类是否可以继承父类的构造器?

不可以的,子类有自己的构造器,父类构造器用于初始化父类对象。

子类是否可以继承父类的私有成员?

可以的,只是不能直接访问。 

子类是否可以继承父类的静态成员?

  • 有争议的知识点。
  • 子类可以直接使用父类的静态成员(共享)
  • 但个人认为:子类不能继承父类的静态成员。(共享并非继承)

4.继承后:成员变量、成员方法的访问特点

在子类方法中访问成员(成员变量、成员方法)满足:就近原则

  1. 先子类局部范围找
  2. 然后子类成员范围找
  3. 然后父类成员范围找,如果父类范围还没有找到则报错。

如果子父类中,出现了重名的成员,会优先使用子类的,此时如果一定要在子类中使用父类的怎么办?

可以通过super关键字,指定访问父类的成员

格式:super.父类成员变量/父类成员方法

5. 继承后:方法重写

5.1 什么是方法重写

在继承体系中,子类出现了和父类中一模一样的方法声明,我们就称子类这个方法是重写的方法。

5.2 方法重写的应用场景

  • 当子类需要父类的功能,但父类的该功能不完全满足自己的需求时。
  • 子类可以重写父类中的方法。

5.3 @Override重写注解

  • @Override是放在重写后的方法上,作为重写是否正确的校验注解。
  • 加上该注解后如果重写错误,编译阶段会出现错误提示。
  • 建议重写方法都加@Override注解,代码安全,优雅!

5.4 方法重写注意事项和要求

  • 重写方法的名称、形参列表必须与被重写方法的名称和参数列表一致。
  • 私有方法不能被重写。
  • 子类重写父类方法时,访问权限必须大于或者等于父类 (缺省 < protected < public
  • 子类不能重写父类的静态方法,如果重写会报错的。

6. 继承后:子类构造器的特点

子类中所有的构造器默认都会先访问父类中无参的构造器,再执行自己。

为什么?

  • 子类在初始化的时候,有可能会使用到父类中的数据,如果父类没有完成初始化,子类将无法使用父类的数据。
  • 子类初始化之前,一定要调用父类构造器先完成父类数据空间的初始化。

6.1 怎么调用父类构造器

子类构造器的第一行语句默认都是:super(),不写也存在。 

7. 继承后:子类构造器访问父类有参构造器

7.1 super调用父类有参数构造器的作用

初始化继承自父类的数据。

7.2 如果父类中没有无参数构造器,只有有参构造器,会出现什么现象呢?

会报错。因为子类默认是调用父类无参构造器的。

7.3 如何解决?

子类构造器中可以通过书写 super(…),手动调用父类的有参数构造器

8. this、super使用总结 

this:代表本类对象的引用super:代表父类存储空间的标识

实际上,在以上的总结中,唯独只有this调用本类其他构造器我们是没有接触过的。 

this(...)和super(…)使用注意点:

  • 子类通过 this (...)去调用本类的其他构造器,本类其他构造器会通过 super 去手动调用父类的构造器,最终还是会调用父类构造器的。
  • 注意:this(…) super(…) 都只能放在构造器的第一行,所以二者不能共存在同一个构造器中。 

 

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

JavaSE进阶(一)—— 面向对象进阶(static、单例、代码块、继承) 的相关文章

  • @RestController 没有 @ResponseBody 方法工作不正确

    我有以下控制器 RestController RequestMapping value base url public class MyController RequestMapping value child url method Req
  • 如何在 Firebase 远程配置中从 JSON 获取值

    我是 Android 应用开发和 Firebase 的新手 我想知道如何获取存储在 Firebase 远程配置中的 JSONArray 文件中的值 String 和 Int 我使用 Firebase Remote Config 的最终目标是
  • “java.net.MalformedURLException:未找到协议”读取到 html 文件

    我收到一个错误 java net MalformedURLException Protocol not found 我想读取网络上的 HTML 文件 mainfest uses permission android name android
  • Spring Data JPA 选择不同

    我有一个情况 我需要建立一个select distinct a address from Person a 其中地址是 Person 内的地址实体 类型的查询 我正在使用规范动态构建我的 where 子句并使用findAll Specifi
  • Spring Boot自动装配存储库始终为空[重复]

    这个问题在这里已经有答案了 每次我进入我的服务类时 存储库似乎都没有自动连接 因为它不断抛出 NullPointerException 谁能帮我检查一下我缺少什么吗 这是我的代码 演示应用程序 java package com exampl
  • 在 Wildfly 中与 war 部署共享 util jar 文件

    假设我有一个名为 util jar 的 jar 文件 该 jar 文件主要包含 JPA 实体和一些 util 类 无 EJB 如何使这个 jar 可用于 Wildfly 中部署的所有 war 无需将 jar 放置在 war 的 WEB IN
  • 是否可以使用 Flying Saucer (XHTML-Renderer) 将 css 解析为类路径资源?

    我正在尝试将资源打包到 jar 中 但我无法让 Flying Saucer 在类路径上找到 css 我无法轻松构建 URL 来无缝解决此问题 https stackoverflow com questions 861500 url to l
  • Kotlin 未解决的参考:CLI 上 gradle 的 println

    放一个printlnkotlin 函数返回之前的语句会崩溃 堆栈跟踪 thufir dur NetBeansProjects kotlin thufir dur NetBeansProjects kotlin gradle clean bu
  • 如何根据运行的 jar 的结果让我的 ant 任务通过或失败?

    我正在运行 CrossCheck 无浏览器 js 单元测试 作为 ant 脚本的一部分 如果 CrossCheck 测试失败 我希望 ant 报告失败 这是 build xml 中的相关部分
  • ConcurrentHashMap 内部是如何工作的?

    我正在阅读有关 Java 并发性的 Oracle 官方文档 我想知道Collection由返回 public static
  • Jackson XML ArrayList 输出具有两个包装器元素

    我在 Jackson 生成的 XML 输出中得到了两个包装器元素 我只想拥有一个 我有一个 Java bean Entity Table name CITIES JacksonXmlRootElement localName City pu
  • 自动生成Flyway的迁移SQL

    当通过 Java 代码添加新模型 字段等时 JPA Hibernate 的自动模式生成是否可以生成新的 Flyway 迁移 捕获自动生成的 SQL 并将其直接保存到新的 Flyway 迁移中 以供审查 编辑 提交到项目存储库 这将很有用 预
  • Java:如何为山区时间创建 TimeZone 对象?

    必须不禁用夏令时 嗯 在这个清单 http en wikipedia org wiki List of tz database time zones在 zoneinfo 时区名称中 有很多声称是 山地时间 找到最适合您想要的那个 然后使用它
  • 内部存储的安全性如何?

    我需要的 对于 Android 我需要永久保存数据 但也能够编辑 并且显然是读取 它 用户不应访问此数据 它可以包含诸如高分之类的内容 用户不得对其进行编辑 我的问题 我会 并且已经 使用过Internal Storage 但我不确定它实际
  • 使用 Mockito 模拟某些方法,但不模拟其他方法

    有没有办法使用 Mockito 模拟类中的某些方法 而不模拟其他方法 例如 在这个 诚然是人为的 Stock我想嘲笑的班级getPrice and getQuantity 返回值 如下面的测试片段所示 但我想要getValue 执行乘法 如
  • Freemarker 和 Struts 2,有时它计算为序列+扩展哈希

    首先我要说的是 使用 Struts2 Freemarker 真是太棒了 然而有些事情让我发疯 因为我不明白为什么会发生这种情况 我在这里问是因为也许其他人有一个想法可以分享 我有一个动作 有一个属性 说 private String myT
  • HashMap 值需要不可变吗?

    我知道 HashMap 中的键需要是不可变的 或者至少确保它们的哈希码 hashCode 不会改变或与另一个具有不同状态的对象发生冲突 但是 HashMap中存储的值是否需要与上面相同 为什么或者为什么不 这个想法是能够改变值 例如在其上调
  • JMenu 中的文本居中

    好吧 我一直在网上寻找有关此问题的帮助 但我尝试的任何方法似乎都不起作用 我想让所有菜单文本都集中在菜单按钮上 当我使用setHorizontalTextPosition JMenu CENTER 没有变化 事实上 无论我使用什么常量 菜单
  • Android:无法发送http post

    我一直在绞尽脑汁试图弄清楚如何在 Android 中发送 post 方法 这就是我的代码的样子 public class HomeActivity extends Activity implements OnClickListener pr
  • 如何重新启动死线程? [复制]

    这个问题在这里已经有答案了 有哪些不同的可能性可以带来死线程回到可运行状态 如果您查看线程生命周期图像 就会发现一旦线程终止 您就无法返回到新位置 So 没有办法将死线程恢复到可运行状态 相反 您应该创建一个新的 Thread 实例

随机推荐

  • MySql的常见的语句总结

    目录 MySql的高级查询语句 数据准备 查询中常用的DISTINCT IN BETWEEN OR DESC ASC COUNT MAX LIMIT等关键字 SQL中关于日期的函数 SQL的分组查询和多表查询 sql的子查询以及UNION和
  • 【报错】 openai.error.RateLimitError: Rate limit reached for default-text-davinci-003 in organization

    使用open AI的API调用模型的时候 会出现以下报错 openai error RateLimitError Rate limit reached for default text davinci 003 in organization
  • mysql可扩展用户属性_MySQL扩展--可伸缩性最佳实践:来自eBay的经验

    在eBay 可伸缩性是我们每天奋力抵抗的一大架构压力 我们所做的每一项架构及设计决策 身前身后都能看到它的踪影 当我们面对的是全世界数以亿计的用户 每天的页面浏览量超过10亿 系统中的数据量要用皮字节 1015或250 来计算 可伸缩性是生
  • 解释器和编译器的区别

    解释器与编译器的区别 两者都是将高级语言转换成机器码 解释器在程序运行时将代码转换成机器码 编译器在程序运行之前将代码转换成机器码 编译器相当于做好一桌子菜再开吃 解释器就是吃火锅边煮边吃 吃火锅效率要低一点
  • CStatusBar技巧

    一 状态条控制的主要功能 状态条控制 Status Bar Control 比较容易理解 使用起来也比较简单 状态条是位于父窗口底部的一个水平子窗口 它可以被分成多个显示信息的小区域 其MFC中封装的CstatusBarCtrl控制类提供了
  • 加更一个小项目中的几个神奇的函数,tiff文件在matlab的读取和显示,以及如何在底图上画图和透明度设置

    项目需求 在地图tiff文件上画出轨迹和轨迹周围一定距离的范围 难点 tiff文件格式的读取 图片与经纬度之间的转换 图片具有透明度 在图片上作图 boston R geotiffread boston tif figure mapshow
  • ORB-SLAM2:基于可识别特征的自主导航与地图构建

    ORB SLAM2 基于可识别特征的自主导航与地图构建 ORB SLAM Tracking and Mapping Recognizable Features 转自 http blog csdn net cicibabe article d
  • Linux环境configure编译常用外部参数选项笔记

    Linux环境下的软件安装 并不是一件容易的事情 如果通过源代码编译后在安装 当然事情就更为复杂一些 现在安装各种软件的教程都非常普遍 但万变不离其中 对基础知识的扎实掌握 安装各种软件的问题就迎刃而解了 Configure脚本配置工具就是
  • 如何制作一份更具洞察力的商业BI报告?

    随着市场环境的复杂化 在数据分析中 能否提供更具商业洞察力的数据信息正在成为考核业务员能力的重要参考指标 加强以下两大块能力至关重要 1 业务相关专业能力以及相关知识 2 对工具的驾驭能力 大部分人在数据分析时使用的是Excel 而要把Ex
  • 【编译原理】实验二:NFA到DFA

    目录 实验二 NFA 到 DFA 一 实验目的 二 预备知识 三 实验内容 NFA向DFA的转换的思路 lt
  • 方板围棋吃子换001

    1 描述 130给定一个二维的矩阵 包含 X 和 O 字母 O 找到所有被 X 围绕的区域 并将这些区域里所有的 O 用 X 填充 示例 X X X X X O O X X X O X X O X X 运行你的函数后 矩阵变为 X X X
  • 速装jax

    jax可以理解为一个函数库 具有求导数的函数 1 建立一个环境 2 安装jax pip install upgrade jax jaxlib 0 1 74 f https storage googleapis com jax release
  • Unity3d中使用OnGUI()函数判断“键盘按下抬起”功能的新方法。

    private bool flagJudgeDownAllow true 开始值为true void OnGUI key Event current FunctionKeyCodeV1 key private void FunctionKe
  • python基础十:模块

    1 模块简介 模块化指将一个完整的程序分解成一个个的小模块 通过将模块组合 来搭建出一个完整的程序 模块化的优点 方便开发 方便维护 模块可以复用 2 模块的创建 在Python当中一个py文件就是一个模块 在一个模块中引入外部模块 imp
  • HpSocket源码使用

    说明 去除了不必要的文件 已建好tcpserver tcpclient 无连接的udpServer和udpclient类 可直接复制到项目中 然后在回调函数里面添加自己的处理函数即可 方便开发 详细使用说明见压缩包里的说明 https do
  • eclipse 启动web项目提示:Server Tomcat v7.0 Server at localhost was unable to start within 101 seconds。

    今天通过eclipse 启动web 项目提示如下错误信息 Server Tomcat v7 0 Server at localhost was unable to start within 101 seconds If the server
  • 骑缝章的正确盖法(详细图文教程)

    一般商务场景都需要盖骑缝章 合同 标书等尤其需要 因为加盖了骑缝章 合同展开后可以将骑缝章还原成原章 因此可以防止对方更换合同内页 防止对方否认合同内容 并避免因更换合同内容或否认合同内容而造成的不必要的麻烦 骑缝章有2个原则 1 印章要覆
  • 使用R语言的names函数为DataFrame数据中的所有列进行重命名

    使用R语言的names函数为DataFrame数据中的所有列进行重命名 在R语言中 DataFrame是一种常用的数据结构 用于存储和处理表格型数据 有时候 我们需要为DataFrame中的列重新命名 以便更好地理解和处理数据 这时可以使用
  • 【华为OD统一考试B卷

    在线OJ 已购买本专栏用户 请私信博主开通账号 在线刷题 运行出现 Runtime Error 0Aborted 请忽略 华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一
  • JavaSE进阶(一)—— 面向对象进阶(static、单例、代码块、继承)

    目录 一 static静态关键字 1 static是什么 static修饰成员变量的用法 2 成员方法的分类 2 1 使用场景 3 static修饰成员方法的内存原理 4 static的注意事项 拓展 二 static应用知识 工具类 1