浅谈面向对象--知识补充

This关键字

this 内存图

this关键字表示当前对象本身,一般用于类的内部,其内部存在一个地址,指向当前初始化的对象本身。

new一个对象时,实际上产生了两个引用,一个是供类Dog内部调用其成员变量和成员方法的this关键字,一个是供外界程序调用实例成员的dog

this 三种用法

什么时候需要使用this

调用成员变量

解决局部变量和成员变量之间的二义性,此时必须使用

调用其他成员方法

同一个类中非static方法间互调(此时可以省略this,但是不建议省略

  1. 调用本类其他构造方法(掌握

this可以调用本类其他构造方法


注意 : 在构造方法中调用本类其他构造方法必须写到该构造方法第一句,否则出现编译错误。

一个结合this,满足封装的实战中的Dog类。

public class Dog { private String id; private String name; private int age;

public Dog(String id ,String name) { this.id = id;

this.name = name;

}

public Dog(String id, String name, int age) {

// this.id = id;

// this.name = name;

// 其他构造器的调用必须写在本构造器中第一句

this(id, name); this.age = age;

}

public Dog() { }

// 省略设置器和访问器

public void showInfo(){ System.out.println("id:" + this.id); System.out.println("名字:" + this.name); System.out.println("年龄:" + this.age);

}

public void sayHi() {

System.out.println("大家好,以下是我的信息:"); this.showInfo();

}

}

super关键字

  在子类方法中,调用父类被覆盖的方法,此时必须使用super

super  关键字表示父类对象,子类要访问父类成员时一定要使用super

super只是一个关键字,内部没有引用(地址)

  1. super 访问父类非私有字段

  1. super 访问父类非私有方法

  1. super 访问父类构造方法

注意 :

  super 调用构造方法必须写在子类构造方法的第一句。

  如果子类构造方法没有显式调用父类任何构造方法时,那么jvm会默认调用父类的无参构造super()

​​​​​​​static 修饰符

需求 + 问题:

构成一个车(Car) 的类,统计Car一共创建了多少对象?

=>  紧接着继续思考:统计Car创建了多少对象是不是需要一个变量totalCount?

=>  紧接着继续思考:在哪里声明这个变量totalCount呢?

static 关键字表示静态,可以修饰成员变量构成静态变量,修饰成员方法构成静态方法。静态变量和静态方法都归类所有,称为类的静态成员,用static关键字修饰

静态变量

在类中,用static关键字修饰的成员变量称为静态变量,归类所有,也称为类变量,类的所有实例/对象都可以访问,被类的所有实例或对象所共享。

语法 :

静态变量的访问

思考:为什么通过实例可以访问静态成员?=> 类变量/静态变量被类的所有实例或对象所共享!

静态方法

static 也可以修饰方法称为静态方法,归类所有,也称类方法。形式

静态方法访问方式

静态变量和静态方法称为类的静态成员,归类所有,成员变量和成员方法称为类的实例成员,归对象所有。

静态方法特性

 静态方法中只能访问类的静态成员,不能访问实例成员 

 实例方法中可以访问类的静态成员

1.3.4 jvm加载 static 成员的过程(理解)

当加载一个类到jvm的方法区时,首先jvm会扫描xx.class中的静态成员并分配空间且初始化。

当通过xx.class new一个对象时,可以在该对象的实例方法中访问静态成员;反之静态方法中不能访问实例成员。

​​​​​​​final修饰符

final 表示最终的意思,可以修饰类、方法、局部变量,甚至可以修饰成员变量。

最终类

final 修饰类表示最终类。

最终类不能被继承

最终方法

如果一个方法被final修饰,称为最终方法。

最终方法不能被重写

常量

final修饰的局部变量称为常量,常量只能赋值一次,不能再重新赋值。  

 基本数据类型:表示的值不能改变

  引用数据类型:所引用的地址值不能改变

​​​​​​​ 代码块

{ } 标记的代码称为代码块,根据其位置的不同可以分为普通代码块、构造代码块、静态代码块、同步代码块

普通代码块

普通代码块{ },也成局部代码块,一般存在于方法中,形成作用域。

作用域特性:

[1].作用域可以嵌套,内层作用作用域可以访问外层作用域的变量

[2].当访问一个变量时,首先在变量所在的作用域查找,如果能找到,停止查找并输出变量内容;当本作用域没找到时,尝试去上一层作用域查找,依次类推。这个过程形成的查找链称为作用域链。

​​​​​​​构造代码块 

构造代码块在类中(类的内部)、方法外,也称为初始化代码块。构造代码块构造一个对象执行一次,在构造方法前执行。

开发中不使用初始化代码块,即使要做初始化操作,可以直接在构造器中完成即可。

​​​​​​​静态代码块

static关键字修饰的代码块称为静态代码块。静态代码块位于类的内部、方法的外部。

静态代码块只执行一次(jvm加载xx.class时执行),在构造代码块、构造方法前执行。

当类的字节码被加载到内存时,此时程序需要加载一些资源(读取资源文件、读取配置文件等),可以使用静态代码块,此时被加载进来的资源一般都可以被多个实例所共享。

​​​​​​​内部

 内部类概述

什么是内部类,把一个类定义在另一个类的内部,把里面的类称之为内部类,把外面的类称之为外部类。

内部类可以看作和字段、方法一样,是外部类的成员,而且成员可以有static修饰。

  静态内部类:使用static修饰的内部类,那么访问内部类直接使用外部类名来访问

  实例(成员)内部类:没有使用static修饰的内部类,访问内部类使用外部类的对象来访问 

 局部(方法)内部类:定义在方法中的内部类,一般不用

  匿名内部类:特殊的局部内部类,适合于仅使用一次使用的类

对于每个内部类来说,Java编译器会生成独立.class文件。 

 静态和实例内部类:外部类名$内部类名字

 局部内部类:外部类名$数字内部类名称 

 匿名内部类:外部类名$数字

匿名内部类

思考1:为什么我们要显示声明一个Student类?

当一个类只使用一次,可以声明成匿名内部类。匿名内部类 必须有 实现 存在。匿名内部类,可以使用父类构造器和接口名来完成。

针对类,定义匿名内部类来继承父类(使用较少):

针对接口,定义匿名内部类来实现接口(使用较多):

注意:这里不是根据 父类/接口 创建对象,而是一种语法而已综合案例 : 使用匿名内部类

枚举类

在服装行业,衣服的分类根据性别可以表示为三种情况:男装、女装、中性服装。

需求:定义一个变量来表示服装的分类?请问该变量的类型使用什么?

使用intString类型,且先假设使用int类型,因为分类情况是固定的,为了防止调用者乱创建类型,可以把三种情况使用常量来表示。

注意:常量使用final修饰,并且使用大写字母组成,如果是多个单词组成,使用下划线分割。

此时调用setType方法传递的值应该是ClothType类中三个常量之一。但是此时依然存在一个问题——然可以乱传入参数比如100,此时就不合理了。

同理如果使用String类型,还是可以乱设置数据。那么说明使用intString是类型不安全的。那么如果使用对象来表示三种情况呢?

此时调用setType确实只能传入ClothType类型的对象,但是依然不安全,为什么?因为调用者可以自行创建一个ClothType对象,如:setType(new ClothType())

此时为了防止调用者私自创建出新的对象,我们把CLothType的构造器私有化起来,外界就访问不了了,此时调用setType方法只能传入ClothType类中的三个常量。此时代码变成:

高,实在是高!就是代码复杂了点,如果存在定义这种类型安全的且对象数量固定的类的语法,再简单点就更好了——有枚举类。

​​​​​​​枚举类的定义和使用

枚举是一种特殊的类,专门用于声明可罗列的常量值,定义格式:

我们自定义的枚举类在底层都是直接继承了java.lang.Enum类的。

枚举中都是全局公共的静态常量,可以直接使用枚举类名调用。

因为java.lang.Enum类是所有枚举类的父类,所以所有的枚举对象可以调用Enum类中的方法.

int ordinal = 枚举对象.ordinal(); // 返回枚举对象的序号,0开始注意:枚举类不能使用创建对象​​​​​​​

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

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

相关文章

kotlinx.coroutines.debug.AgentPremain

大家好 我是苏麟 . 项目引入AI大模型 debug 出现报错 设置 勾选

配置docker阿里云镜像地址

一、安装docker的步骤: 1.yum install -y yum-utils 2.yum-config-manager --add-repo http://mirrors.aliyun.com/docker- ce/linux/centos/docker-ce.repo --配置阿里云仓库3.yum makecache fast4.yum install docker-ce -y5.docker version …

Vue3实战笔记(43)—Vue3组合式API下封装可复用ECharts图表组件

文章目录 前言一、封装echart图标钩子二、使用步骤总结 前言 接上文,已经安装好了ECharts,开始封装组件方便使用。 一、封装echart图标钩子 首先应用我们之前学习的钩子方式,在hooks目录下创建一个名为 useECharts.js 的文件,用…

【机器学习300问】97、机器学习中哪些是凸优化问题,哪些是非凸优化问题?

在机器学习的领域中,多数模型的参数估计问题实质上可以转化为优化问题。鉴于机器学习模型的多样性,不同的模型会对应着不同的损失函数,进而形成各具特色的优化问题。了解优化问题的形式和特点,对于提升我们求解模型参数的效率和准…

微信好友这样打标签更高效!

为什么要做标签管理? ① 通过标签管理,可以清晰的知道每个私域好友的关系程度,如哪些是忠诚客户,哪些是意向客户,哪些是刚加上的客户等等。 这样就知道下一步要怎么操作,做到精细化运营。如忠诚客户跟进维护&#x…

Embedding 模型的选择和微调

目录 引言 向量模型在 RAG 系统中的作用 1. 对 query 和 私域知识 进行向量化表示 2. 动态更新知识库 3. 数据隐私和安全 有哪些性能不错的向量模型 OpenAI Embedding JinaAI Embedding BAAI/bge Embedding 模型评测 MTEB 排行榜:https://huggingface.co…

第十六节:带你梳理Vue2: 生命周期与钩子函数

前沿: 通过前面几节的学习,我们已经对vue有了初步的了解,大致了解了vue可以帮我们干什么, 那么接下来我们就来看看vue的生命周期和它常用的钩子函数, 1. 理解生命周期的含义 生命周期:就是一个组件从实例化创建并添加到DOM树开…

读论文 | Small object detection model for UAV aerial image based on YOLOv7

目录 1、前言 2、摘要 3、论文的方法 3.1 方法描述 3.2 方法改进 3.3 本论文的模型图 3.4 本文的数据集: 3.5 论文实验 3.6 解决的问题 3.7 论文总结 (1)文章优点 (2)方法创新点 (3&#xff0…

地质考察AR远程交互展示系统辅助老师日常授课

广东这片充满活力的土地,孕育了一家引领ARVR科技潮流的杰出企业——深圳华锐视点,作为一家专注于VR/AR技术研究与业务开发的先锋公司。多年来,我们不断突破技术壁垒,将AR增强现实技术与各行各业的实际需求完美结合,助力…

Cloneable接口和深拷贝

在java中如何对对象进行拷贝呢?我们可以使用Object类中的clone方法。 一、浅拷贝 在使用clone方法对对象进行拷贝的时候,需要注意: 1.需要重写clone方法; 2.clone方法的返回值是Object类,需要强制类型转化&#xf…

部门来了个测试开发,听说是00后,上来一顿操作给我看蒙了...

公司新来了个同事,听说大学是学的广告专业,因为喜欢IT行业就找了个培训班,后来在一家小公司实习半年,现在跳槽来我们公司。来了之后把现有项目的性能优化了一遍,服务器缩减一半,性能反而提升4倍&#xff01…

阅读笔记——《ProFuzzBench: A Benchmark for Stateful Protocol Fuzzing》

【参考文献】Natella R, Pham V T. Profuzzbench: A benchmark for stateful protocol fuzzing[C]//Proceedings of the 30th ACM SIGSOFT international symposium on software testing and analysis. 2021: 662-665.【注】本文仅为作者个人学习笔记,如有冒犯&…

C++面向对象的第二大特性:继承

1.继承的介绍 首先容我先向大家举一个列子: 我这里定义了一个Person的类 class Person { protected:string name;int age;string address;}; 在这个基础上,我要定义一个关于Student , Worker 的类 由于Student Worker都具有Person类中的成员变量 &#xff0c…

力扣--字符串58.最后一个单词的长度

思路分析 初始化变量: num 用于记录当前单词的长度。before 用于记录上一个单词的长度。 遍历字符串: 如果字符不是空格,增加 num 计数。如果字符是空格,检查 num 是否为 0: 如果 num 为 0,说明之前没有记录到单词,所以…

嵌入式学习——3——UDP TFTP简易文件传输

tftp协议概述 简单文件传输协议,适用于在网络上进行文件传输的一套标准协议,使用UDP传输 特点: 是应用层协议 基于UDP协议实现 数据传输模式 octet:二进制模式(常用) mail:已经不再支持 TFTP通信…

Qt学习记录(14)线程

前言&#xff1a; 我的臀部已经翘到可以顶起一屁股债了 为什么要使用线程 什么时候用线程 复杂的数据处理 头文件.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTimer>//定时器头文件QT_BEGIN_NAMESPACE namespace Ui { class Widget; }…

Python+Flask+Pandas怎样实现任意时间范围的对比数据报表

话不多说,有图有源码: 1.上图 2.因为是低代码的,只能发重要有用的代码片段了 实现思路:1)获取指定时间范围内的数据:2)df合并 #----------年份替换----------------for syear in range(int(byear),int(eyear)1):start_datestr(syear)strbdate[4:]end_datestr(syear)stredate…

【大数据】MapReduce JAVA API编程实践及适用场景介绍

目录 1.前言 2.mapreduce编程示例 3.MapReduce适用场景 1.前言 本文是作者大数据系列专栏的其中一篇&#xff0c;前文我们依次聊了大数据的概论、分布式文件系统、分布式数据库、以及计算引擎mapreduce核心概念以及工作原理。 书接上文&#xff0c;本文将会继续聊一下mapr…

光源亮度检测应用笔记

光源亮度检测应用笔记 光电检测应用光电二极管等效模型和基本参数连接并联电阻&#xff08;RJ&#xff09;串联电阻&#xff08;RS&#xff09;结电容&#xff08;CJ&#xff09;暗电流&#xff08;ID&#xff09; 光电二极管电流-电压转换器无源光电二极管电流-电压转换器有源…

C++ Primer 第五版 第十三章 拷贝控制

当定义一个类时&#xff0c;我们显式地或隐式地指定在此类型的对象拷贝、移动、赋值和销毁时做什么。一个类通过定义五种特殊的成员函数来控制这些操作&#xff0c;包括&#xff1a;拷贝构造函数&#xff08;copy constructor&#xff09;、拷贝赋值运算符&#xff08;copy-ass…