/* 成员方法
在某些情况下,我们需要定义成员方法(简称方法)。比如人类:除了属性外(姓名、年龄)
还有一些行为(说话、跑步、学习等),这时就要用成员方法才能完成
方法的好处:
1.提高代码复用性
2.将实现的细节封装起来,供其他用户调用
基本语法:
访问修饰符(4种) 返回数据类型 方法名 (形参列表){
方法体语句;
return 返回值;
}
1.形参列表:表示成员输入的值
2.返回数据类型:表示成员方法输出,void表示没有返回值
3.方法主体:表示为实现某一功能的代码块
4.return语句不是必须的
相关细节:
访问修饰符
1.访问修饰符作用是控制方法使用的范围,如果不写为默认访问修饰符default
返回数据类型
1一个方法最多有一个返回值,若要返回多个值,可以返回数组
2.返回类型可以为任意类型,包括基本类型和引用类型
3.如果方法要求有返回数据类型,则最后执行句必须为return值,
且要求返回值类型必须和return的值类型一致或兼容(自动转换)
4.如果方法为void,则方法体中可以没有return语句,或者只写return
方法名
最好见名知义,表达除该功能的意思,开发中按照规范
参数列表
1.一个方法可以有0个参数,也可以有多个参数,中间用逗号隔开,如getSum(int n1,int n2)
2.参数类型可以为任意类型
3.调用带参数的方法时,一定对应着参数列表传入相同类型或兼容类型的参数
4.方法定义时的参数称为形式参数,方法调用时的参数称为实际参数,实参和形参类型个数、顺序要一致
方法体
里面写完成功能的具体语句,可以为输入、输出、变量、运算、循环....但不能再定义方法,即方法不能嵌套定义
方法调用
1.同一个类中的方法可直接调用
2.跨类中的方法A类调用B类需要通过对象名调用:对象名.方法名(参数)
方法调用机制:
1.当程序执行到方法时,就会开辟一个独立的空间(栈空间)
2.当方法执行完毕,或者执行到return语句时,就会返回,返回是返回到调用的方法
3.返回后继续执行方法后面的代码
4.当main方法(栈)执行完毕,整个程序退出
*/
// 演示:添加study成员方法,输出“我正在学Java”
/*
public class Method{
public static void main(String[] args) {
//先创建对象,然后调用方法即可
Person p1 = new Person();
p1.study();//调用方法
}
}
class Person{
String name;
int age;
public void study(){
System.out.println("我正在学Java");
}
}
// 1.public表示方法是公开的
// 2.void表示方法没有返回值
// 3.study():study是方法名,()形参列表
// 4.{}为方法体,写执行的代码块
// 5.方法写好后不去调用就不会输出
/* 练习:编写类AA,有一个方法:方法名为judge 判断一个数时奇数还是偶数,返回Boolean
思路
1.返回类型为Boolean
2.方法名 judge
3.形参(int num)
4.方法体 判断
*/
/*
public class Method{
public static void main(String[] args) {
AA a = new AA();
if(a.judge(1)){
System.out.println("是奇数");
}else{
System.out.println("是偶数");
}
}
}
class AA{
public boolean judge(int num){
if(num % 2 != 0){
return true;
}else{
return false;
}
//或者使用三元运算符 return num % 2 != 0 ? true;false;
}
}
/* 练习:根据行、列、字符打印对应的行数和列数的字符
如:打印4行4列的字符#
####
####
####
####
思路
1.方法返回类型void
2.方法名字 print
3.方法形参(int row,int col,char c)
4.方法体 循环
*/
/*
public class Method{
public static void main(String[] args) {
AA a = new AA();
a.print(4,4,'#');
}
}
class AA{
public void print(int row,int col,char c){
for(int i = 0;i < row;i++){
for(int j = 0;j < col;j++){ //输出每一行
System.out.print(c);
}
System.out.println(); //换行
}
}
}
*/
// 成员方法传参机制
// 1.基本数据类型,传递的是值(值拷贝),形参的任何改变不影响实参
/*
public class Method{
public static void main(String[] args) {
int a = 10;
int b = 20;
AA a1 = new AA(); //创建对象
a1.swap(a,b); //调用方法swap
System.out.println("main方法中a=" + a + "b=" + b); //a=10 b=20
}
}
class AA{
public void swap(int a,int b){
int temp = a;
a = b;
b = temp;
System.out.println("swap方法中a=" + a + "b=" + b); //a=20 b=10
}
}
*/
// 2.引用数据类型,传递的是地址(传递也是值,但值是地址),形参的改变影响实参
/*
public class Method{
public static void main(String[] args) {
BB b1 = new BB();
int[] arr = {1, 2, 3};
b1.test(arr);
System.out.println("main数组为");
for(int i = 0;i < arr.length;i++){
System.out.print(arr[i] + "\t");
}
System.out.println();
}
}
class BB{
public void test(int[] arr){
arr[0] = 200;
System.out.println("test数组为");
for(int i = 0;i < arr.length;i++){
System.out.print(arr[i] + "\t");
}
System.out.println();
}
}
*/
// 克隆对象(两个对象相互独立,属性相同)
public class Method{
public static void main(String[] args) {
Person p1 = new Person();
p1.name = "huang";
p1.age = 20;
Tools tool = new Tools();
Person p2 = tool.copyPerson(p1);
System.out.println("p的属性 name=" + p1.name + " age=" + p1.age);
System.out.println("p2的属性 name=" + p2.name + " age=" + p2.age);
System.out.println(p1 == p2); //比较是否相同
}
}
class Person{
String name;
int age;
}
/* 思路
1.返回类型 Person
2.名字 copyPerson
3.形参(Person p)
4.方法体,创建新对象并复制属性,返回
*/
class Tools{
public Person copyPerson(Person p1){
Person p2 = new Person();
p2.name = p1.name;
p2.age = p1.age;
return p2;
}
}