⾯向对象的概念以及特征
⾯向对象的概念以及特征
实质上将 "数据" 与 "⾏为" 的过程, 以类的形式封装起来, ⼀切以对象为中⼼的
⾯向对象的程序设计过程中有两个重要概念:类(class)和对象(也称为实例),其中类是某⼀批对象的抽象,可以把类理解成某种概念,相当于⼀种“模板”;对象才是⼀个具体存在的实体,从这个意义上来看,⽇常所说的⼈,其实都是⼈的实例,⽽不是⼈类
- -⾯向对象的特征
(1) 封装 (2) 继承 (3) 多态
※类的定义
- -使⽤class修饰类
- -类⽤于描述某种概念,封装类的静态特征以及动态特征
- -定义属性(成员变量、静态特征)
- -定义动态特征(⾏为⽅法)
类与实例,实例对象的创建
- -类是抽象的
- -对象是真实存在的
- -对象的创建是通过类的构造器new出来的
- -引⽤类型有多少种?⽆数种
※⽅法的定义
- -⽤于封装某种特殊的功能操作,能够进⾏⼊参和返回数据
- -组成元素:修饰符、⽅法返回值,⽅法名,⽅法参数,⽅法体
//⽅法的语法
/*举例:我给⽔果店⽼板50元,⽼板要给我称50元的⽔果,然后把⽔果交给我(买⽔果)
修饰符⽅法的返回值⽅法名(⽅法的参数列表) {
⽅法体(买⽔果的过程)
收了我50元
称50元的⽔果
返回⽔果
}*/
--有返回值类型(在调⽤⽅法后需要返回该类型的数据)
--返回值类型为基本数据类型(8种)
则需要注意,返回数据的类型要⽐定义的返回值类型⼩或者相等⽐如:⽅法返回值类型为double 则可以返回⽐double类型⼩的数据(long、)
--返回值类型为引⽤类型
则返回该类型的对象或者该⼦类的对象
--没有返回值类型(使⽤void来表⽰当前⽅法没有返回值类型)
※⽅法签名
- -根据⽅法签名来判断⽅法是否⼀样⽅法签名就是⽅法的id
- -⽅法签名 = ⽅法名+⽅法参数列表是和修饰符、返回值是没有关系的
⽅法签名和修饰符、返回值类型没有关系。只要⽅法签名不⼀致,则不是同⼀个⽅法
※⽅法重载
- -实现同⼀种功能(睡觉),互为重载⽅法:在同⼀个类中,同⼀种功能的不同的实现
- -⽅法的重载和修饰符以及⽅法返回值是没有关系的,只跟⽅法签名有关系
- -⽅法名相同、参数列表不同
- -由于是同⼀个功能,所以⽅法名相同
- -但是在同⼀个类中,⽅法不能相同,所以只能⽅法名相同,⽅法参数列表不同
※练习:
1、设计⼀个Hero类,heroName(英雄名) heroHP(英雄HP)
heroArmor(英雄攻击⼒) heroMoveSpeed(移动速度)
提供⼀个heal()⽅法,操作给⾃⼰
提供⼀个heal(Hero h)重载⽅法给另⼀个英雄
※构造器的定义
- -作⽤是创建对象,构造器也是⼀个特殊的⽅法,因为构造器没有返回值类型
构造器的语法: [修饰符] 类名(参数类别){
⽅法体
}
如果⼀个类中没有定义构造器,则系统会默认提供⼀个⽆参构造器,但是如果有定义任意⼀个构造器,则系统不再提供⽆参构造器,所以通常来说在⼀类中要⼀个⽆参构造器和⼀个有参构造器
注意:成员变量默认初始化引⽤变量默认为null 基本数据类型默认为0 布尔类型默认为false
作业:
java面向对象的特征有哪些方面定义⼀个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⽅式⽐较内容是否相等,就能知道该对象是否存在集合中。
通过这种⽅式我们减少了查询⽐较的次数,优化了查询的效率同时也就减少了查询的时间。
类加载原理以及分析(选修)
类加载的时机:
垃圾回收机制(选修)
--主要是管理虚拟机的内存分配
--以及不定时地检测⽆⽤的内存,回收后重新再分配
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论