面向对象(基础)
目录
package(包)和import(导入)关键字的理解和使用:
方法最基本的三个成员
?属性(变量的另一种认识 )、
- 复习一下变量的分类
- 成员变量(也叫做属性)
- 属性的其他称呼:成员变量,field,字段,域
- 局部变量(方法内,方法形参,构造器内,构造器形参,代码块内)
- 成员变量(也叫做属性)
- 两者之间的相同点和不同点
- 共同点:
- 声明的格式相同:数据类型 变量名 = 变量值
- 变量都有其有效的作用域,出了作用域就失效了。
- 必须先声明后赋值,最后使用
- 不同点
- 属性声明在类内,方法外的变量 ,局部变量:方法内,方法形参,构造器内,构造器形参,代码块内
- 在内存中分配的位置不同:局部变量就在栈里面;属性随着对象的创建,存储在堆空间中。
- 生命周期:属性:随着对象的创建而创建,随着对象的消亡而消亡。局部变量:随着方法对应的栈帧入栈(或消亡),局部变量会在栈中分配(或消亡)
- 作用域:属性在整个类内都是有效的,局部变量仅限于其所在的方法(……)。
- 是否可以有权限修饰符来修饰:修饰符有:public protected 缺省 private(用于表明所修饰的结构可调用的范围的大小)
- 属性可以用权限修饰符来进行修饰,局部变量不能使用任何修饰符进行修饰.
- 共同点:
- 是否有默认值
- 属性:都有默认初始化值 意味着如果没有给属性进行显示初始化值,则会有默认初始化值
- 局部变量:都没有默认初始化值 意味着,在使用之前必须要显示赋值,否则会报错
- 当局部变量作为方法的形参时,无影响,因为可以在调用方法时再赋值(比较特殊)
?方法
- 是类或对象行为特征的抽象,用来完成某个功能操作。(在某些语言中也称为函数或过程,比如C语言)
- 方法的好处:实现代码重用,减少冗余,简化代码
- 使用例子:Math.random()的random()方法等
- 定义的格式:
- 权限修饰符【其他关键词(以后讲)】 返回值类型 方法名(形参列表)【throws 异常类型】//这些都是方法头
{
方法体
}- 方法体:调用一个方法时,真正执行的代码。体现了此方法的功能
-
- 【】里面的不是必须的、可加可不加,比如static、final等。
- 权限修饰符: public \ protected \ 缺省 \ private (声明方法是先都写public,以后讲封装再考虑这个)
- 返回值类型:描述当调用完此方法时,是否需要返回一个结果(无返回值类型void/有具体返回值类型(指明返回的数据类型),而且在最后要用return 返回值类型;)
- 方法名就是根据标识符的规则来写的
- 形参列表:属于局部变量。且可以声明多个
- 格式(形参类型1 形参1,形参类型2 形参2)
- 分类:有/无形参列表
- 无:不能省略小括号,比如:Math.random()
- 有:也不能省略小括号,调用时需要不确定变量的类型和个数来确定形参类型和个数;比如:Arrays.sort(数组名) Arrays.binarySearch(数组名 要找的数)
- 如何判断:根据“在方法体里面有没有不确定的数”来判断是否需要形参列表
- 权限修饰符【其他关键词(以后讲)】 返回值类型 方法名(形参列表)【throws 异常类型】//这些都是方法头
- 注意点:
- 必须先声明后使用(main方法中)
- 不能单独存在,只能放在类里面定义
- 方法不调用不执行,每调用一次执行一次
- 在一个方法当中,可以调用本类中的其他方法。
- 方法内不能定义方法。
- 形参实参解释:
- 形参:方法在声明时,一对()内声明的一个或者多个形式参数,简称形参
- 实参:方法在被调用时,实际传递给形参的变量或常量,就称为实际参数,简称实参
- 内存解析(康师傅图片)例子里面的Person类里面的属性由name、age、gender,方法有sleep、intersts?
?构造器(constructor)
- 作用:
- 1.搭配new关键字,创建类的对象
- 2.在创建对象的同时,可以给对象的相关属性赋值
- 使用:
- 构造器的声明:权限修饰符 类名(形参列表){}
- 创建类以后,在没有显示提供任何构造器的情况下,系统会默认提供一个空参的构造器,且和构造器的权限与类声明的权限相同。
- 一旦类中显示声明了构造器。则系统不在提供默认的空参构造器(这个地方要加重记一下,后面复习super、和this有用)
- 一个类中可以声明多个构造器,彼此之间构成重载
? ?面向对象的特征之一:封装性
我这样记两个常用的权限修饰符:我的就是我的(private),你的还是我的(public)
另外缺省其实就是“啥也不写”,就比如创建一个类的时候:直接? ?class……
- 用权限修饰符来进行封装
- 四种权限修饰:分别是private、缺省、protected、public
- 修饰类即类内部的成员,当这些成员被调用时,体现可见性的大小
- private:本类内部
- 缺省:本类内部、本包内
- protected:本类内部、本包内、其他包的子类
- public:本类内部、本包内、其他包的子类、其它包非子类
- 类:只能使用public、缺省修饰
- 类的内部成员:可以使用四种权限修饰符
package(包)和import(导入)关键字的理解和使用:
首先想一下他们的实用性:我们不能肯定在开发中,你们每个人定义的类或接口会做到“不重复标识符”,就比如现在有两个包下都定义了Person类,所以为了判断使用的是哪一个Person就需要import结合package来解决了
pakage作用:
用于指明该文件中定义的类、接口等结构所在的包
一个源文件只能有一个package的语句,只能放首行
包名全部小写,且开头不能为java.
一个包下有多个类和接口,但不能同名。(不同包下可以定义同名的类)?
import作用
用impoort来显示引入指定包下所需要的类
语法格式:import 包名.类名
写在包的声明和类的声明之间
如果已经导入了想使用的的包,又想使用该包下子包中的类,就仍然需要导,或者用更简单的下一步
import 包名 . *代表该包的所有类
导入的类或接口如果在同一个包下,则可以省略此步骤
?如果想同时用不同包下两个相同名字类,要使用全类名的方式java.包名.类名 名字 = new java.包名.类名 名字,在很久之前一般的情况下其实都应该是这样的方式,但为了提高可读性,才用上了import关键词来简单化导包的过程
方法的应用:4个
1.重载(overload):
定义:
在一个类中,允许存在一个以上的同名的方法,只要他们的参数列表不同即可,满足这样特征的多个方法,彼此之间构成方法的重载。
特征为两同一不同:
- 不同:参数列表不同:1。参数个数不同2.参数类型不同
- 两个相同:同一个类,相同方法名。
-
注意:方法的重载与形参的名,权限修饰符,返回值类型都没有关系
怎么判断两个方法是相同呢?编译器如何确定:
- 先通过方法名确定了一波重载的方法,进而通过不同的形参列表,确定对应的方法
- 方法名,形参列表(参数个数与类型)都相同
-
要求:在一个类中,允许存在多个相同名字的方法,只要他们的形参列表不同。
所以一个类中不允许定义多个相同的方法。
2.可变个数形参的方法:
使用场景:
再调用方法时,可能会出现方法形参的类型是确定的,但形参的个数不确定。此时,我们就可以使用可变个数形参的方法。(把他当作数组对待就行了,不过是构建方法时没确定数组的大小)
格式:(参数类型...参数名)
注意点:
1.可变个数形参的方法在调用时,针对于可变的形参赋的实参的个数可以为0个,1个或多个。
2.与同类中同名的多个方法之间可以构成重载(因为形参不同嘛)
3.特例:可变个数形参的方法与同一个类中方法名相同,且与可变个数形参的类型相同的数组参数不构成重载。(你可以把现在这个功能当成数组)
4.可变个数的形参必须声明在形式列表之后:
仔细想一下,如果声明在前面的话,就不知道后面某个形参是不是属于可变个数形参里面
5.可变个数的形参最多在一个方法的形式列表中出现一次:你总不可能在形参列表里面定义多个吧,有什么意义?
3.方法值传递机制剖析:
总结:对于方法内声明的局部变量,赋值时:
1.基本数据类型:将此变量保存的数据传递出去
2.引用数据类型:将此变量保存的地址值传递出去
基本数据类型:传递本身所保存的数据值
引用数据类型:
? ? ? ? 对于数组:所存储地址值一样,都指向同一个数组
? ? ? ? 对于对象:地址值一样,指向同一份Order空间
实参与形参的传递:
1.如果形参的类型为基本数据类型的变量,则将实参保存的实际值赋给形参
2.如果形参的类型为引用数据类型的变量,则将实参保存的地址值赋给形参
4.方法的应用4:递归
这就不是这里要复习的内容了,可以看别的数据结构与算法
对象数组
定义
这样理解更容易:数组元素可以是基本数据类型也可以是引用数据类型,当元素是引用类型中的类时,我们称为对象数组。类似于c语言中的结构体数组
举例:
String[]:String是引用数据类型,数组里面的每个元素都是一个String的对象
案例:耐心看完
- 定义一个Student,包括三个属性,学号(number int ),年级(state int),成绩(score int)
- 创建20个学生对象,学号为1到20,年级和成绩都由随机数确定
- 需求:
- 1.打印出3年级(state)的学生的信息
- 2.使用冒泡排序按学生成绩排序,并遍历所有学生信息
- 需求:
类与对象:
这是面向对象的两个核心概念
对象:实际存在的该类事物的每个个体,是具体的,因而也被称为实例。??
类:具有相同特征的事物的抽象描述,是抽象的,概念上的定义。就比如我上面的Student类
?面向对象完成具体功能的三个步骤
1.创建类,并设计类的内部成员(现在只写属性和方法)
2.创建类的对象
3.通过对象,调用其内部声明的属性和方法,完成相关的功能?
类的实例化?
仅仅就是创建对象用它而已
类的实例化=创建类的对象=创建类的实例
格式:类的类型 对象名 = 通过new创建的对象实体
举例:Phone p1 = new Phone();
对象的内存解析(还是康师傅)
- 栈(stack):方法内定义的变量,存储在栈中
- 堆(heap):new 出来的结构(比如:数组实体,对象实体)。包括对象中的属性
- 方法区(method area):存放类的模板。比如:Phone的模
- 创建类的多个对象时,每个对象在堆空间中有一个对象是实体,每个对象实体中保存着一份类的属性。如果修改某个对象的属性时,不会影响其他对象此属性的值。
- 此时的p3,p1两个变量指向了堆空间中两个对象实体,通过其中某一个变量,修改其属性时会改变另一个
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!