#:个人学习java的笔记记录,参考课程为动力节点的:001-课程内容介绍_哔哩哔哩_bilibili
本文适合有一定c语言基础,没有java基础的同学。因此一些与c差别不大的地方不会着重介绍
一. 方法的简介
java中所说的方法其实就是c/c++中所说的函数,两者功能相同,在定义和使用上也有许多的相似点
1.方法可以实现代码的复用,让代码逻辑清晰,结构简明直观
2.一般来说,一个方法只实现一个功能
二.方法的使用
方法的使用大致上可以分为两步,分别是定义和调用(这一点和c/c++如出一辙);一定是先有方法的定义才会有方法的调用,且一个方法被定义后可以不被调用,亦可以被调用多次。
1.方法的定义:
方法的定义代码格式如下:
[修饰符列表] 返回值类型 方法名(形式参数列表){
方法体;
}
a.修饰符列表:可选项。目前固定写为public static。
b.返回值类型:用来指定方法返回值的数据类型(方法执行结束后的结果类型)。必须要用,若方法执行结束后不返回任何数据,则为void(空)
c.方法名:合法的标识符即可。但最好见名知意(方法通常反应行为,因此方法名一般为动词)
d.形式参数列表:简称形参。用来接收数据。参数个数0~N个。如果有多个,使用逗号隔开。(每一个形式参数都可以看做局部变量)
e.每个方法都有方法体,方法体是一对大括号。在大括号中编写Java语句。
2.方法的调用:
若修饰符列表中有static,则采用类名.方法名(实际参数列表)去调用
注意:
a.调用者和被调用者在同一个类中,“类名.”可以省略。
b.实际参数列表:简称实参,实参和形参要一一对应,个数对应,数据类型对应。
c.调用方法后,若方法执行结束后有返回值,可以采用变量接收该返回值。也可以选择不接收。
public class Main{
public static void main(String[] args){
// 调用方法m1——因为m1方法和被调用的在同一个类中;因此类名是可以省略的,可以直接用方法名()调用
Main.m1();
// 省略 类名.
m1();
// 调用m2方法——因为m2和被调用的地方不在同一个类中,因此类名不可忽略,必须是用 类名.方法名()去调用
A.m2();
// 编译报错。
//m2();
}
public static void m1(){
System.out.println("m1方法执行了");
}
}
class A{
public static void m2(){
System.out.println("m2方法执行了");
}
}
三.方法调用时内存变化:
1.方法只定义不调用是不会分配内存的。只是方法的字节码指令存储在元空间中。
2.方法调用时会给该方法在JVM的栈内存中分配空间,此时发生压栈动作。这个方法的空间被称为栈帧(栈帧中主要包括:局部变量表,操作数栈等)
3.方法执行结束时,该栈帧弹栈,方法内存空间释放。
四。方法重载
是编译阶段的一种机制(静态多态)
1.为什么要有方法重载:
如果我要写一个输出函数去完成两个数之和这个操作,我整个方法的方法体都是差不多的,差别只在传入的参数可能会有所不同(如 有些是int 有些是double)。
/*
当前代码先不使用方法重载,大家分析一下这样写的代码有什么缺点?
缺点一:代码不美观。
缺点二:不方便调用,程序员需要记忆更多的方法名。
*/
public class OverloadTest01{
public static void main(String[] args){
// 调用方法
sumInt(10, 20);
sumLong(10L, 20L);
sumDouble(3.0, 2.0);
}
public static void sumInt(int a, int b){
int c = a + b;
System.out.println(a + "+" + b + "=" + c);
}
public static void sumLong(long a, long b){
long c = a + b;
System.out.println(a + "+" + b + "=" + c);
}
public static void sumDouble(double a, double b){
double c = a + b;
System.out.println(a + "+" + b + "=" + c);
}
}
经过上面的分析发现这样会有很多缺点,如 代码不美观 要多记忆方法名;这也就引出了我们的方法重载。
2.方法重载的使用条件:
如果想使用方法重载,必须满足以下几个条件:
a.在同一个类中
b.方法名相同
c.参数列表不同(其中 类型,顺序,个数不同都算不同 )
3.方法重载的使用:
public class Main{
public static void main(String[] args){
m1();
m1("abc");
m2(10, 20);
m2(10L, 20L);
m3("x", 10);
m3(10, "x");
}
// 形参的个数不同
public static void m1(){
System.out.println("m1()");
}
public static void m1(String s){
System.out.println("m1(String s)");
}
// 形参类型不同
public static void m2(int a, int b){
System.out.println("m2(int a, int b)");
}
public static void m2(long a, long b){
System.out.println("m2(long a, long b)");
}
// 形参顺序不同
public static void m3(String s, int a){
System.out.println("m3(String s, int a)");
}
public static void m3(int a, String s){
System.out.println("m3(int a, String s)");
}
// 以下这两个方法没有构成方法重载,而是方法重复定义了是语法错误(因为这两个只是改变了形参的名字)
/*
public static void doSome(int a, int b){
}
public static void doSome(int x, int y){
}
*/
}