面向对象
一、基本概念
类(class):对一类具有相同特征事务的抽象,比如人 对象(object):实际存在的该类事务的每个个体,是具体的,也称实例 (类的实例实际就是设计类的成员)
属性:也叫成员变量,该类事务的状态信息 行为(方法):该类事务要做什么操作,或者基于事务的状态能做什么
创建对象的三个步骤: 一:创建类并设计类 二:创建对象 三:通过对象调用内部声明的属性和方法,完成相关的功能
在内存中的结构:
堆:new出来的结构,包括对象中的属性 栈:方法内定义的变量,存储在栈中 方法区:用来存放类的模板,
内存中的过程 每一个方法的调用实际上就是往栈内存中压入一个栈帧,只要是局部变量就在栈帧当中,只要是成员变量就在堆当中 栈中压入一个栈帧 用来存放变量名,这个变量是指方法内声明的变量也叫局部变量;在堆中开辟一段空间来存放对象的属性也叫成员变量,然后成员变量名指向堆中的对象的地址
创建类的多个对象时,每个对象在堆空间中有一个对象实体,每个对象实体中保存着一份类的属性,修改某一对象属性的值时,不会影响其他对象此属性的值
声明类的两个对象的变量,指向堆空间的同一个对象实体,如果通过其中一个对象变量修改对象的属性值时,会影响另一个对象的属性值
二、属性
变量: 角度一:基本数据类型(8种),引用数据类型(数组,类,接口,枚举,注解,记录)
角度二:成员变量(属性),局部变量
注意:形参也属于局部变量
1.属性和变量的比较
变量声明的格式相同: 作用域不同,出了作用域就失效了 先声明,再赋值,后使用
在内存中的位置: 属性:在堆空间中 局部变量:在栈空间中
生命周期: 属性:随着对象的创建而创建,随着对象的消亡而消亡 ( 随着类的创建而产生放在堆里面) 局部变量:随着方法对应的栈帧入栈,局部变量在栈中分配空间,随着方法对应的栈帧出栈,局部变量消亡
作用域的范围: 属性:在整个类的内部都有效 局部变量:仅限于声明此局部变量的方法(或者构造器,代码块)内
权限修饰符:public 、protected、缺省、private (用于表明所修饰的结构可调用的范围大小)
属性:可以使用权限修饰符进行修饰
局部变量:不可以使用任何权限修饰符修饰
是否有默认值:
属性:都有默认初始化值,意味着没有给属性进行显示的赋值,则会有默认的初始化值
局部变量:都没有初始化值,使用之前必须要显示的赋值进行初始化
注意:对于方法的形参而言,在调用方法的时候,给形参赋值即可(传参)
引用数据类型的变量都存的是地址值,指向实体的首地址值
自定义的类也可以作为属性的类型,调用的时候要进行new操作
三、方法
方法是类或对象行为特征的抽象,用来完成某个功能操作
好处:减少代码的重复使用,代码的冗余,简化代码
1.方法声明的格式
权限修饰符 [其他修饰符] 返回值类型 方法名(形参列表) [throws 异常类型] {//方法头
// 方法体
}
注意:[ ]中的内容不是必须的
2.方法声明的具体细节
权限修饰符:public、protected、缺省、private(权限依次减小)
返回值类型:当我们调用完此方法时,是否需要返回一个结果
无返回值类型:使用void即可
有具体的返回值类型:需要指明返回的数据的类型,可以是基本数据类型,也可以是引用数据类型
需要在方法内部配合使用“return+返回值类型的变量或常量”
经验:我们在声明方法时根据方法实现的功能来决定
根据题目的要求
方法名:属于标识符,需要满足标识符的规范,见名知意
形参列表:形参属于局部变量,且可以声明多个
格式:(形参类型1 形参1,形参类型2 形参2)
有形参列表:根据方法调用时,需要的不确定的变量的类型和个数,确定形参的类型和个数
无形参列表:没有形参但是不能省略括号
方法体:调用方法时,真正执行的代码
注意:Java里的方法不能独立存在,所有的方法都必须定义在类里面
1.先声明后使用
2.Java中的方法不调用不执行,调用一次执行一次
3.方法内可以调用贝类中的自己或其他方法或属性 (自己调用自己可能会发生栈溢出的异常)
4.方法里面不能定义方法
3.关键字 return
returen的作用
1.结束一个方法,无返回值也可以加return
2.结束一个方法的同时,可以返回数据给方法的调用者(方法声明时如果有返回值类型,则方法内需要搭配return使用)
注意:return后面不能有执行语句
方法调用的内存解析
形参:方法在声明时,一对()内声明的一个或多个形式参数
实参:方法在调用时,实际传递给形参的变量或常量,成为实际参数
注意:引用数据类型记录的是地址值,存放在堆中的常量池中
在main方法中 返回给方法的调用者:调用者其实是main方法
栈里面没有回收机制,堆里面有回收机制
每一个对象都有一套自己的属性,谁调用改变的就是谁的属性
对象数组:
对象数组的元素可以是基本数据类型,也可以是引用数据类型,当元素是引用数据类型时,我们称为对象数组
比如:String[]
四、方法的重载
1.定义:
在同一个类中,允许存在一个以上的同名方法,只要它们的参数列表不同即可。满足这样特征的多个方法,彼此之间构成方法的重载
总结为两同一不同
两同:同一个类,同一个方法名
一不同:参数列表不同---->参数个数不同、参数类型不同 (和不同类型的参数先后顺序也有关)
注意:方法的重载于形参名、权限修饰符、返回值类型都没有关系
同一个类中不允许有两个相同的方法
如何判断两个方法是不是同一个方法?
相同的方法是指:方法名相同且形参列表相同的方法为相同的方法(形参列表相同是指形参个数和类型都相同,与形参名无关,形参的顺序也得相同)
编译器先通过方法名确定一波方法的重载,进而通过不同的形参列表确定方法
println()方法有很多重载的方法,当参数是char[]数组时回自动遍历数组并输出,其他的一般都是输出地址值
可变个数形参的方法
在调用方法时,可能会出现方法形参的类型是确定的,但是形参个数不确定,此时我们就可以使用可变个数形参的方法
public class Test { public static void main(String[] args) { //创建当前类的对象 Test test = new Test(); test.print(); } //声明可变参数个数的方法 //格式:(参数类型...参数名) public void print(int ...nums){ } }
说明:
可变形参个数的方法在调用时,针对于可变形参赋的实参的个数可以为,0个,1个或多个,如果具体存在确定个形参的方法则优先调用
//优先调用形参为i的方法 public void print(int ...nums){ } public void print(int i){ }
可变形参个数的方法与同一个类中同名的多个方法之间可以构成重载
特例:可变形参个数的方法与同一个类中方法名相同,且与可变个形参的类型相同的数组参数不构成重载
//它两不构成重载 public void print(int ...nums){ } public void print(int[] arr){ }
可变个数的形参必须声明在形参列表的最后面
//正确的写法,开发不会这么用 public void print(int i,int ...nums){ } //形如下面会编译不通过 public void print(int ...nums,int i){ }
可变个数的形参最多在一个方法的形参列表里出现一次
五、方法的值传递机制
方法内声明的局部变量的赋值:
基本数据类型的变量 传递的是变量的数据值
引用数据类型(包括数组类型对象类型)的变量 传递的是变量的地址值
方法的参数的传递机制: 值传递机制
实参给形参赋值的过程
如果是基本数据类型的变量,则将实参保存的数据值传递给形参
如果是引用数据类型的变量,则将实参保存的地址值传递给形参
写if条件的时候把已知的变量写在前面,未知的写在后面