1.类的第二个成员:成员方法
1.一个方法代表一个独立的可复用的功能。
2.如何声明方法
要求:必须再类中,方法的外面,和成员变量是平级的
语法格式:
【修饰符】class类{
【修饰符】 数据类型 成员变量名;
【修饰符】返回值 方法名【形参列表】{
方法体语句块;//实现方法的功能
}
}
返回值的类型:
(1)void 表示没有返回值,这个方法运行结束之后不会返回结果
(2)其他Java数据类型,包括基本数据类型和引用数据类型:表示有返回值,这个方法运行结束之后有结果返回,
调用者在调用这个方法之后,可以接收和处理结果
方法名:
(1)见名知意
(2)第二个单词首字母大写
形参列表
再调用方法时,用来接受参数/数据时用的,这个数据时用于辅助完成功能。
3.如何调用方法
强调:方法调用一次执行一次,不调用,不会执行。
1.格式:
(1)在其它类中:
非静态的方法:
(1)先new这个类的对象
(2)通过对象.调用方法
静态的方法:
直接:类名.方法
在本类中:
静态方法中用静态方法:直接使用
非静态方法中使用非静态方法:直接使用
非静态方法中使用静态方法:直接使用
静态方法中使用非静态方法:不能直接使用,除非有对象
形参与实参
形参:在定义方法是()中参数类型
实参:在调用方法时()中的参数值
形参与实参的关系:
(1)实参时给形参传值用的
(2)实参的类型、个数、顺序与形参列表要一一对应
返回值
如果被调用的方法是void,调用时不能接收返回值,也不能打印返回值
如果被调用的方法是其他类型,调用时可以(但不是必须)用变量接收返回值,或直接打印返回值,或者让返回参与表达式计算
方法调用的内存分析:
(1)方法区: 储存加载的类信息,包括静态变量、常量等
(2)堆:new 出来的对象
(3)栈
java虚拟机栈:运行java代码写的方法
本地方法栈:运行c语言实现的方法
(4)程序计数器:记录每一个线程吓一跳指令等基本信息
栈的特点:先进后出
每一个方法每一次运行/调用时,会在栈中开辟一块独立的内存空间,成为”入栈“
在这个方法的栈空间中,会分配一些内存给该方法的局部变量来存储值。
方法运行结束之后,释放它在栈中的内存,称为“出栈”
(1)先在栈中开辟main空间
(2)出现调用sum方法,再开辟sum空间,sum运行完之后,释放sum内存
(3)出现调用println方法,在开辟println空间,println运行完之后,释放println内存
(4)main后面没有代码了,释放main的空间,程序结束
方法的参数传递机制:
1.传递的什么东西?
(1)基本数据类型的形参:实参–>形参,数据值,copy一份
(2)引用数据类型的形参:实参–>形参。地址值,相同的地址值意味着指向同一个对象
2.在方法体中,对形参做修改,会不会反过来影响实参?
(1)基本数据类型的形参
形参的修改和实参完全无关。因为实参时copy了一份数据值给形参,他俩的内存也没关系。
(2)引用数据类型的形参
修改了形参对象的成员变量值,会影响实参对象的成员变量的值,因为此时形参和实参就是指向同一个对对象。
特别注意:如果形参指向了”新对象“,那么就和实参对象无关了。
1)String是引用数据类型
(2)String类型的对象非常特殊,它是属于不可变对象。
每一次修改都会产生新对象
public class TestPassParam {
//swap交换
static void swap(int a, int b){
int temp = a;
a = b;
b = temp;
}
public static void main(String[] args) {
int x = 1;
int y = 2;
swap(x, y);
System.out.println("x = " + x);
System.out.println("y = " + y);
}
}
主题:可变参数
参数:形参和实参
可变:个数
1、什么情况下需要用到可变参数?
举例:
要找出多个整数中的最大值,但是整数的个数不知道,这个时候就可以使用可变参数。
如果没有可变参数的概念,如何解决以上问题呢?找出多个整数中的最大值
int max(int[] arr){
....
}
使用可变参数,可以简化原来用数组来解决的部分问题。
2、声明语法格式
【修饰符】 返回值类型 方法名(【其他形参,】 数据类型… 可变参数名){
}
3、如何使用可变参数
(1)在声明它的方法中,如何使用?
当成数组使用
(2)在调用它的时候,如何使用?
A:当成数组一样用也可以
B:可以传入0到n个对应类型的实参值
4、要求/注意点
(1)一个方法最多只能有一个可变参数
(2)可变参数必须是在形参列表的最后一个
变量:
(1)变量的作用:存储数据
(2)变量的本质:代表一块内存区域
(3)变量的三要素:数据类型、变量名、变量值
-
变量的分类
(1)根据数据类型:
基本数据类型的变量:储存的是数据值
引用数据类型的变量:储存的地址值,储存的是对象的首地址(包括数组)
(2)根据变量声明的位置不同划分:
成员变量:
在类中,方法和代码块外面
局部变量:
在方法,或代码块里面
包括形参
5.成员变量和局部变量的区别
(1)声明位置不同
(2)内存中的位置不同
成员变量:
静态变量:方法区
实例变量:堆
局部变量:栈
(3)是否有默认值
成员变量:有
局部变量:没有,必须手动初始化
(4)作用域
成员变量:
(1)静态变量:在本类中任意位置使用,在其他类中,通过“类名.”和对象名.都可以用。
(2)实例变量:在本类中只能在非静态的方法和代码块中可以使用,在其他类中,通过“对象名.”可以使用
局部变量:有作用域
从声明它的位置开始,到它所属的}结束。
(5)声明周期
成员变量:
静态变量和类一样
实例变量和对象一样,每一个对象都是独立的
局部变量:每一个调用都是独立的,而且旨在作用域范围内有效
(6)修饰符不同
成员变量:很多,例如:static,public等
局部变量:只能有一个修饰符final