面向对象的概念以及特征
实质上将 "数据" 与 "行为" 的过程, 以类的形式封装起来, 一切以对象为中心的
面向对象的程序设计过程中有两个重要概念:类(class)和对象(也称为实例),其中类是某一批对象的抽象,可以把类理解成某种概念,相当于一种“模板”;对象才是一个具体存在的实体,从这个意义上来看,日常所说的人,其实都是人的实例,而不是人类
- -面向对象的特征
(1) 封装 (2) 继承 (3) 多态
※类的定义
- -使用class修饰类
- -类用于描述某种概念,封装类的静态特征以及动态特征
- -定义属性(成员变量、静态特征)
- -定义动态特征(行为方法)
类与实例,实例对象的创建
- -类是抽象的
- -对象是真实存在的
- -对象的创建是通过类的构造器new出来的
- -引用类型有多少种?无数种
※方法的定义
- -用于封装某种特殊的功能操作,能够进行入参和返回数据
- -组成元素:修饰符、方法返回值,方法名,方法参数,方法体
//方法的语法
/*举例:我给水果店老板50元,老板要给我称50元的水果,然后把水果交给我(买水果)
修饰符 方法的返回值 方法名(方法的参数列表) {
方法体(买水果的过程)
收了我50元
称50元的水果
返回水果
}*/
--有返回值类型(在调用方法后需要返回该类型的数据)
--返回值类型为基本数据类型(8种)
则需要注意,返回数据的类型要比定义的返回值类型小或者相等 比如:方法返回值类型为double 则可以返回比double类型小的数据(long、int......)
--返回值类型为引用类型
则返回该类型的对象或者该子类的对象
--没有返回值类型(使用void来表示当前方法没有返回值类型)
※方法签名
- -根据方法签名来判断方法是否一样 方法签名就是方法的id
- -方法签名 = 方法名+方法参数列表 是和修饰符、返回值是没有关系的
方法签名和修饰符、返回值类型没有关系。只要方法签名不一致,则不是同一个方法
※方法重载
- -实现同一种功能(睡觉),互为重载方法 :在同一个类中,同一种功能的不同的实现
- -方法的重载和修饰符以及方法返回值是没有关系的,只跟方法签名有关系
- -方法名相同、参数列表不同
- -由于是同一个功能,所以方法名相同
- -但是在同一个类中,方法不能相同,所以只能方法名相同,方法参数列表不同
※练习:
1、设计一个Hero类,heroName(英雄名) heroHP(英雄HP)
heroArmor(英雄攻击力) heroMoveSpeed(移动速度)
提供一个heal()方法,操作给自己治疗
提供一个heal(Hero h)重载方法给另一个英雄治疗
※构造器的定义
- -作用是创建对象,构造器也是一个特殊的方法 ,因为构造器没有返回值类型
构造器的语法: [修饰符] 类名(参数类别){
方法体
}
如果一个类中没有定义构造器,则系统会默认提供一个无参构造器,但是如果有定义任意一个构造器,则系统不再提供无参构造器,所以通常来说在一类中要一个无参构造器和一个有参构造器
注意:成员变量默认初始化 引用变量默认为null 基本数据类型默认为0 布尔类型默认为false
作业:
定义一个Hero类
--为Hero设计4个参数的构造方法这四个参数分别是 heroName(英雄名) heroHP(英雄HP)heroArmor(英雄攻击力) heroMoveSpeed(移动速度)
--定义一个无参构造器、一个根据heroName(英雄名) heroHP(英雄HP)的有参构造器
--定义一个方法显示当前英雄的所有状态信息showInfo()
方法递归
- -用于实现隐式的循环,从而重复地执行某个操作
- -递归具备哪些要素 出口、递归的规律
练习:
定义方法分别使用循环和方法的递归求 N 的阶乘 1 * 2 * 3 * … * 10
作业
定义方法分别使用循环和方法的递归求 N的累加和 1 + 2 + 3 + … + 10
方法的入参匹配
- -基本数据类型
本类型--> 类型的提升顺序 --> 本类型的包装类 -->本类型的可变长度类型-->报错
- -引用类型
本类型-->直接父类-->间接父类-->报错
封装的概念:
将数据和行为以类的形式进行封装,通过权限修饰符可以隐藏细节或控制访问的权限
※权限修饰符
如何定义一个标准的Java类:POJO\JAVABEAN
//1、私有化属性
//2、公有化的get、set方法 右键---》sources--》generate getters and setters
//3、构造器 有参构造器和无参构造器 右键---》sources--》generate constructor using fields
// 4、toString方法 用于观察对象中的数据 右键---》sources--》generate toString
※ 练习:【标准Java类】
银行类bank:属性{name,address,wealth}
--提取人的现金的方法(入参Person的对象,提取的金额)[银行总金额减少、个人现金流增加]
人类Person:属性{name,sex,age,wealth,cash}
--wealth总资产
--cash现金流
※作业:
《1》定义标准的医生类:id、name、subject、sex
定义方法:check方法,检查病人,入参Person的对象
方法操作为输出病人的个人信息
※static:
表示的静态的意思,属于类的,当使用到这个类的时候会静态加载静态的属性以及方法。
--static修饰的方法里面只能调用静态的方法以及静态的变量,不能直接使用非静态的变量以及方法,除非使用对象去调用非静态方法以及变量
--static还可以修饰代码块,也就是静态代码块。
--static还可以修饰变量
--非静态方法可以调用静态的方法以及变量
--调用静态方法以及变量,一般是通过类名进行调用
※成员变量和局部变量
--成员变量是在类中定义的变量,其中包括类变量(静态的)和实例变量(非静态的)
--局部变量是局部有效的,通常在方法形参、方法体、代码块中定义
变量的初始化时机
- -局部变量(默认不会初始化,在使用的时候再进行初始化)
- -成员变量
--静态成员变量(在类加载的时候初始化)
--非静态的成员变量(在创建对象的时候初始化)
练习:
定义一个ChangeText类,类中定义一个方法change
--要求入参两个int类型的变量实现两数交换。
--编写main测试方法调用change方法,打印结果
this的使用
this表示的是调用当前方法的实例对象的引用
- -1、用于区分同名的成员变量和局部变量
- -2、在本类的非静态方法中调用非静态的属性以及方法可以省略对象,原因是省略this.
- -3、可以使用this调用本类另一个构造器,但是要注意构造器的调用必须要在构造器的第一行
注意:this不能在static修饰的代码块中使用(原因:this是一个对象的引用,是真实存在的;在static的代码块中this不能指向明确的真实对象)
--this的应用场景:类的get、set方法以及构造器【用于区别同名成员变量和局部变量】
※练习:
定义一个安卓手机类Android(produceNo、price、weight),提供构造器初始化对象
定义一个手机生产的工厂类AndroidFactory、提供方法入参生产个数,当生产够之后就不再生产
※==与equals方法
- -使用==是判断变量的数值是否一致
- -可以通过改写equals方法实现判断对象是否相同的操作
--==判断引用类型,则是判断对象指针是否一致
//在eclipse中导入JDK源码
什么是hashcode(选修)
--hashcode主要为了提高对象判断、对象查询的效率而生成的一套机制
--JVM每new一个Object,它都会将这个Object丢到一个Hash哈希表中去,这样的话,下次做 Object的比較或者取这个对象的时候,它会依据对象的hashcode再从Hash表中取这个对象。这样做的目的是提高取对象的效率。
--hashcode是对象的描述,但是不等于该对象的指针
--hashcode并不等于物理内存的地址
--equals 方法能比较两个对象的内容是否相等,因此可以用来查找某个对象是否在集合容器中,通常大致就是逐一去取集合中的每个对象元素与需要查询的对象进行equals比较,当发现某个元素与要查找的对象进行equals方法比较的结果相等时,则停止继续查找并返回肯定的信息,否则,返回否定的信息。
但是通过这种比较的方式效率很低,时间复杂度比较高。那么我们是否可以通过某种编码方式,将每一个对象都具有某个特定的码值,根据码值将对象分组然后划分到不同的区域,这样当我们需要在集合中查询某个对象时,我们先根据该对象的码值就能确定该对象存储在哪一个区域,然后再到该区域中通过equals方式比较内容是否相等,就能知道该对象是否存在集合中。
通过这种方式我们减少了查询比较的次数,优化了查询的效率同时也就减少了查询的时间。
类加载原理以及分析(选修)
类加载的时机:
垃圾回收机制(选修)
--主要是管理虚拟机的内存分配
--以及不定时地检测无用的内存,回收后重新再分配
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?