1.方法就是一段可以完成特定功能的代码片段,方法可以被重复使用。
2.在一个类体中的方法之间相互调用可以省略“实例方法的对象(或引用).”或者“静态方法的类名.”。实例方法编译器会自动补全“this.”静态方法编译器会自动补全“类名.”。
3.方法定义在类体当中,在一个类当中可以定义多个方法,方法编写的位置没有先后顺序。在类体中无法编写Java语句,除了声明变量之外,在类体中声明变量的位置也没有先后顺序。方法体由Java语句构成,方法体当中的代码遵循自上而下的顺序依次执行。
4.方法体当中不能再定义方法。
5.方法定义的语法结构:
[修饰符列表] 返回值类型 方法名(形式参数列表) {
方法体;
}
5.1修饰符列表:可选项,不是必须的,目前统一写成public static【以后讲】
* 方法修饰符列表当中有static关键字的话,怎么调用这个方法? - 类名.方法名(实际参数列表);
5.2返回值类型
* 什么是返回值:一个方法是可以完成某个特定功能的,这个功能结束之后大多数都是需要返回最终执行结果的,执行结果可能是一个具体存在的数据,而这个具体存在的数据就是返回值。
* 返回值类型:返回值是一个具体存在的数据,数据都是有类型的,此处需要指定的是返回值的类型。
* 返回值类型可以是Java中的任意一种类型都可以,包括基本数据类型和所有的引用数据类型。
* 也可能这个方法执行结束之后不返回任何数据,此时返回值类型必须编写:void关键字
* 返回值类型若不是void,表示这个方法执行结束之后必须返回一个具体的数值。当方法执行结束的时候,没有返回任何数据的话编译器报错。
* 怎么返回值: 语法结构: return 值;,并且要求“值”的类型必须和返回值类型一致不然编译器报错。
* 返回值类型是void类型的时候,在方法体中不能编写“return 值;”这样的语句。但是要注意可以编写“return;”这样的语句,主要是用来终止当前方法的执行。
* 只要带有return关键字的语句执行,return语句所在方法结束。
5.3方法名
* 只要是合法的标识符就可以
* 见名知意
* 方法名最好是动词
* 方法名首字母要求是小写,后面每个单词首字母大写
5.4形式参数列表:简称形参
* 形参是局部变量。
* 形参的个数可以是:0~N个。
* 多个形参之间用“逗号”隔开
* 形参中起决定性作用的是形参的数据类型,形参的名字是局部变量的名字。
* 方法在调用的时候,实际给这个方法传递的真是数据被称为:实际参数,简称实参,多个实参之间用逗号分割。
* 实参列表和形参列表必须满足:
- 数量相同
- 类型对应相同(实参和形参类型不同的时候要求能够进行相应的自动类型转换【要求实参类型应该能自动转换成形参类型】:包括小容量转换成大容量和子类向上转型)
- 对应顺序相同
5.5方法体必须由大括号括起来,方法体当中的代码有顺序,遵循自上而下的顺序依次执行,并且方法体由Java语句构成。
* Java中语句包括6类:方法调用语句、表达式语句、复合语句(由{}扩区来的一组语句)、空语句、控制语句、package语句和import语句
6.方法调用
* 方法调用的时候,在参数传递的时候,如果实参是变量,实际上传递的是变量中保存的那个“值”传过去了。
* 方法只定义不调用是不会执行的。只有在调用的时候才会执行。
* 静态方法: 类名.方法名(实参列表);或者:引用.方法名(实参列表)。
* 实例方法:引用.方法名(实参列表)
* 在本类的主调方法中调用本类的实例方法可以省略前面的“引用.”例如“方法名(实参列表)”,编译器会在调用方法处自动补上“this.”
* 在本类的主调方法中调用本类的静态方法可以省略前面的“类名.”例如“方法名(实参列表)”,编译器会在调用方法处自动补上“本类名.”
* 静态方法和实例方法只有在主调函数和被调函数在同一个类中的时候才可以用这种省略的调用方式调用:方法名(实参列表)。【这种省略的调用方式默认从当前类中找被调函数是否能在】
7.深入return语句
* 一个方法由返回值的时候,当我们调用这个方法的时候,方法返回了一个值,但对于调用者来说这个值可以接收也可以不接收。
* 在“同一个作用域”当中,return语句下面不能编写任何代码,因为这些代码永远都不执行,编译报错。
* 当“return 值;”中的值的类型和方法定义的返回值类型不一致的时候,“值”的类型应该能自动转换成方法定义时的返回值类型。【包含小容量转换成大容量和子类对象向上转型】
* 用变量去接收方法的返回值,当变量的类型和方法的返回值类型不一致的时候,方法的返回值类型应该能自动转换成变量的类型,【包含小容量转换成大容量和子类对象向上转型】
8.访问类的属性
* 静态属性: 类名.变量名 。或者:引用.变量名 。
* 实例属性:引用.变量名
* 在本类的方法中访问本类的成员变量,可以省略前面的“引用.”,编译器在编译的时候会自动加上“this.”,例如:“this.成员变量名”
* 在本类的方法中访问本类的静态成员变量,可以省略前面的“类名.”,编译器在编译的时候会自动加上“类名.”,例如:“类名.静态成员变量名”
9.方法在执行的过程当中,在JVM中的内存是如何分配的呐,内存是如何变化的?
- 方法只定义不调用,是不会执行的,并且在JVM中也不会给该方法分配“运行所属”的内存空间。
- 在JVM内存划分上由这样三块主要的内存空间:(当然除了这三块还有其他的内存空间)
- 方法区内存(字节码文件,静态成员变量)
- 堆内存(对象,实例变量)
- 栈内存(方法运行需要压栈,局部变量)
- 关于栈数据结构:
- 栈:stack,是一种数据结构
- 数据结构反应的是数据的存储形态
- 方法代码片段存在哪里?方法执行的时候过程的内存在那里分配?
- 方法代码片段属于.class字节码文件的一部分,字节码文件在类加载的时候,将“方法代码片段“放到了方法区内存当中。所以JVM中三块主要的内存空间中方法区内存最先有数据。【因为.class不是真正的二进制文件,将.class文件加载到JVM中的时候,JVM会先将.class文件解释成二进制数据,然后将方法的代码片段加载到方法区内存当中(类加载属于运行阶段)】。
- 代码片段虽然在方法区内存当中只有一份,但是可以被重复调用。每一次调用这个方法的时候,需要给该方法分配独立的活动场所,在栈内存中分配。【在栈内存中分配方法运行所属的内存空间】
- 方法在调用的瞬间,会给该方法分配活动的栈内存空间,会在栈中发生压栈动作,方法执行结束之后,给该方法分配的栈内存空间全部释放,此时发生弹栈动作。
- 压栈:给方法分配内存
- 弹栈:释放该方法的栈内存空间
- 局部变量在“方法体“中声明。局部变量在运行阶段内存在栈中分配。