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

news2024/12/24 2:40:06

目录

一、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(…) 都只能放在构造器的第一行,所以二者不能共存在同一个构造器中。 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/530966.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

域名信息收集

被动信息收集 0x01 Certificate Transparency&#xff08;证书透明&#xff09; 证书透明度(Certificate Transparency)是证书授权机构的一个项目&#xff0c;证书授权机构会将每个SSL/TLS证书发布到公共日志中。一个SSL/TLS证书通常包含域名、子域名和邮件地址。查找某个域名…

Java进阶-字符串的使用

1.API 1.1API概述 什么是API ​ API (Application Programming Interface) &#xff1a;应用程序编程接口 java中的API ​ 指的就是 JDK 中提供的各种功能的 Java类&#xff0c;这些类将底层的实现封装了起来&#xff0c;我们不需要关心这些类是如何实现的&#xff0c;只需要…

PPT技能之描边字,要大要醒目别整没用的

文字仅仅加粗&#xff0c;还是不够明显&#xff0c;不妨用上描边字。不会Photoshop&#xff0c;不会PS&#xff0c;也可以做好看的描边字。 描边字&#xff0c;是在文字的边缘加上边框&#xff0c;让文字更醒目、突出。 你的关注&#xff0c;是我最大的动力&#xff01;你的转…

【K8s】基本存储、高级存储(PV和PVC)、配置存储

文章目录 背景一、基本存储1、EmptyDir2、HostPath3、NFS 二、高级存储1、认识PV和PVC2、PV3、PVC4、生命周期 三、配置存储1、ConfigMap2、 Secret 背景 程序运行在容器中&#xff0c;而容器的生命周期可能极其短暂&#xff0c;容器销毁&#xff0c;数据丢失&#xff0c;因此…

pip install出现socket.timeout: The read operation timed out的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

MySQL 8.0不再担心被垃圾SQL搞爆内存

MySQL 8.0.28引入的新功能 MySQL 8.0.28开始&#xff0c;新增一个特性&#xff0c;支持监控统计并限制各个连接&#xff08;会话&#xff09;的内存消耗&#xff0c;避免大量用户连接因为执行垃圾SQL消耗过多内存&#xff0c;造成可能被OOM kill的风险。 首先&#xff0c;需要…

【Servlet】图解HTTP请求Tomcat服务器实现前后端交互

文章目录 前言如何构造HTTP请求&#xff1f;1、通过form表单构造HTTP请求① form发送GET请求② form发送POST请求 2、通过Ajax构造HTTP请求同步等待与异步等待的感性理解 3、使用postman构造HTTP请求4、通过 Java socket 构造 HTTP 请求 如何实现前端给后端传参1、query string…

Jetpack Compose 中的debug调试

之前在 Jetpack Compose 中的重组作用域和性能优化 一文中主要介绍了如何从代码层面进行一些优化以及提到了一些值得注意的优化事项&#xff0c;本文主要来了解一下官方提供了哪些工具层面的手段可以帮助我们进行Compose的debug性能调试。 常规debug方式 这个跟以前的方式一样…

『python爬虫』22. 初识自动化测试工具selenium(保姆级图文)

目录 1. selenium的安装配置2. 为什么使用selenium&#xff1f;它的优势和缺点是什么&#xff1f;3. selenium的基本使用4. selenium实战之csdn搜索python博文4.1 点击选择文章4.2 搜索栏输入搜索关键词4.3 实现代码 总结 欢迎关注 『python爬虫』 专栏&#xff0c;持续更新中 …

【MYSQL】索引的原理(B+树实现)和操作

目录 1.MYSQL与磁盘交互的基本单位 2.索引的原理 3.聚簇索引 4.索引操作 认识磁盘 1.MYSQL与磁盘交互的基本单位 为了提高基本的IO效率&#xff0c; MySQL进行IO的基本单位是16KB 一次使用16KB&#xff08;称为page&#xff09;为单位大于磁道的扇面&#xff08;521B&…

Golang笔记:使用ssh包作为客户端与SSH服务器交互

文章目录 目的基础说明使用演示单次通讯连续通讯&#xff08;远程终端&#xff09; 总结 目的 Golang中可以使用 golang.org/x/crypto/ssh 包作为SSH客户端或者SSH服务使用。这篇文章将简单记录下作为客户端使用的一些内容。 Package ssh implements an SSH client and server…

Java基础 开发相关的介绍和准备(开发环境搭建)

Java 概述 是 SUN(Stanford University Network&#xff0c;斯坦福大学网络公司 ) 1995 年推出的一门高级 编程语言。 是一种面向 Internet 的编程语言。Java 一开始富有吸引力是因为 Java 程序可以在 Web 浏览器中运行。这些 Java 程序被称为 Java 小程序(applet)&#xff0c…

学系统集成项目管理工程师(中项)系列22a_信息化知识(上)

1. 战略资源 1.1. 信息 1.2. 土地 1.3. 能源 1.4. 材料 2. 信息information 2.1. 客观事物状态和运动特征的一种普遍形式 2.2. 控制论 2.2.1. 维纳Norbert Wiener 2.2.2. 信息就是信息&#xff0c;既不是物质也不是能量 2.3. 哲学界 2.3.1. 信息是事物普遍联系的方式…

通过xshell连接甲骨文服务器并安装宝塔详细图文教程避免踩坑

问题&#xff1a; 一&#xff0c;甲骨文创建好了&#xff0c;并且下载了私钥&#xff0c;怎么连接&#xff1f;忘记下载了怎么办&#xff1f; 二&#xff0c;xshell怎么使用&#xff1f; 三&#xff0c;宝塔怎么安装&#xff1f; 起点&#xff1a; 最近有幸注册了一个甲骨…

SpringBoot--Lombok--Initailizr--yaml

目录 SpringBoot--Lombok Lombok 介绍 ● Lombok 作用 ● SpringBoot 和IDEA 官方支持 Lombok 常用注解 Lombok 应用实例 代码实现 在pom.xml 引入lombok 修改Furn.java 使用Lombok 注解简化代码, 解读 NoArgsConstructor AllArgsConstructor ToString Setter Ge…

多种方法解决Please specify which branch you want to merge with的错误

文章目录 1. 复现错误2. 分析错误3. 解决错误3.1 远程有分支3.2 远程无分支 4. 总结 1. 复现错误 今天发布某版本的项目&#xff0c;准备创建个v0point1分支&#xff0c;后期如果修改该版本&#xff0c;直接在该分支上修改即可。 首先&#xff0c;使用git branch v0point1命令…

软考A计划-真题-分类精讲汇总-第十三章(专业英语)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

红黑树的实现

文章目录 红黑树前言1. 红黑树的概念及性质1.1 红黑树的概念1.2 红黑树的性质 2. 红黑树的结构2.1 红黑树节点的定义2.2 红黑树的结构 3. 红黑树的操作3.1 红黑树的查找3.2 红黑树的插入处理红黑树颜色的过程(重点)情况1: 只变色情况2: 变色 单旋情况3: 变色 双旋 处理颜色的…

ubuntu深度学习使用TensorFlow卷积神经网络——图片数据集的制作以及制作好的数据集的使用

首先我事先准备好五分类的图片放在对应的文件夹&#xff0c;图片资源在我的gitee文件夹中链接如下&#xff1a;文件管理: 用于存各种数据https://gitee.com/xiaoxiaotai/file-management.git 里面有imgs目录和npy目录&#xff0c;imgs就是存放5分类的图片的目录&#xff0c;里面…

哈工大计组大作业-RISC处理器设计

RISC_CPU_HIT RISC处理器设计 地址&#xff1a;https://github.com/944613709/Design-of-RISC-Processor.git 要求 根据计算机组成原理课程所学的知识&#xff0c;设计一个给定指令系统的处理器&#xff0c;深刻理解处理器结构和计算机系统的整体工作原理。 1. 处理器功能及…