方法的定义
public 返回数据类型 方法名 (形参列表..) {
//方法体
语句;
return 返回值;
}
注意:
1.形参列表:表示成员方法输入cal(int n), getSum(int num1, int num2)
2.返回数据类型:表示成员方法输出,void表示没有返回值
3.方法主体:表示为了实现某一功能代码块
4.return语句不是必须的。
方法的调用机制
方法使用细节
- 在调用带参数的方法时,一定要对应着参数列表传入相同类型或兼容类型的参数
public class test01{
public double f1(){
double d1 = 1.1 * 3;
int n = 100;
return n; //int自动转换为double,编译通过
//return d1; 这里就不行了,double不能转换为int,会报错!不能把高精度的转为低精度的
}
}
- 一个方法最多有一个返回值,那如何返回多个结果?返回一个数组就好了
public class test02{
public void f3(int n1,int n2){
int[] resArr = new int[2];
resArr[0] = n1 + n2;
resArr[1] = n1 - n2;
return resArr;
}
}
- 方法不能嵌套定义!
public class test03{
//错误:方法不能这样嵌套定义!
public void m1(){
public void m2(){
}
}
//可以这样写:
public void m3(){
m4();
}
//在方法m3()外定义m4(),然后再m3里面调用方法m4()
public void m4(){
}
}
调用细节
- 同一个类中的方法调用:直接调用就好了
class Demo{
//同一个类中的方法调用:直接调用即可
public void print(int n){
System.out.println("调用print()方法 n=" + n);
}
public void sayOk(){
//sayOk调用 print
print(10);
}
}
- 跨类中的方法A类调用B类方法:需要对象名调用
class B{
public void hi(){
System.out.println("B类中的hi(被执行)");
}
}
class A{
public void m1(){
//创建B对象,然后再调用方法即可
System.out.println("m1()方法被执行");
B b = new B();
b.hi();
System.out.println("m1()方法继续执行");
}
}
public class test {
public static void main(String[] args) {
int a = 10;
int b = 20;
//创建AA对象 名字 obj
AA obj = new AA();
obj.swap(a,b); //调用swap
System.out.println("main方法 a="+a+" b="+b);//这个输出什么??
//输出 a=10 b=20,方法swap()没有改变main方法里的a和b,因为是值传递,具体原理如上图(在调用方法的时候会在栈区建立一个新的栈空间用于执行方法体,执行完之后销毁这个栈空间释放内存,从始至终都没有改变main中的a和b的地址,属于值传递,所以main中的a和b没有受到影响,System.out.println("main方法 a="+a+" b="+b)仍输出 a=10 b=20;
}
}
public class AA {
public void swap(int a,int b){
System.out.println("/na和b交换前的值/n"+a+"/tb="+b);//a=10 b=20
//完成了a和b的交换
int tmp = a;
a = b;
b = tmp;
System.out.println("/na和b交换后的值/na="+a+"/tb="+b);//a=20 b=10
}
}
对于基本数据类型,传递的是值(值拷贝),形参的任何改变不影响实参!!!
数组是引用数据类型(学C++时刻入DNA的一句话:数组名是数组的首地址,就是数组中第一个元素的地址,是常量)
public class Test {
public static void main(String[] args) {
B b = new B();
int[] arr = {1,2,3};
b.test100(arr);//调用方法
System.out.println(" main的 arr数组 ");
//遍历数组
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]+"/t");//输出什么呢?
}
System.out.println();
}
}
public class B {
//B类中编写一个方法test100,
//可以接收一个数组,在方法中修改该数组,看看原来的数组是否变化
public void test100(int[] arr){
arr[0] = 200;//修改元素
//遍历数组
System.out.println(" test100的 arr数组 ");
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]+"/t");//输出什么呢?
}
System.out.println();
}
}
//输出
test100的 arr数组
200 2 3
main的 arr数组
200 2 3
//同理
class test{
//测试
public static void main(String[] args) {
Person p = new Person();
p.name = "jack";
p.age = 10;
B b = new B();
b.test200(p);
System.out.println("main 的p.age"+p.age);//肯定输出了10000
}
}
class Person{
String name;
int age;
}
class B{
public void test200(Person p){
p.age = 10000; //修改了对象属性
}
}
韩老师挖坑题
将上面B类 test200()方法里的 p.age = 10000 改成 p=null后,测试类test里面的main方法的System.out.println(“main 的p.age为”+p.age);输出的是什么???
class test{
public static void main(String[] args) {
Person p = new Person();
p.name = "jack";
p.age = 10;
B b = new B();
b.test200(p);
System.out.println("main 的p.age为"+p.age);//这里输出什么???
}
}
class Person{
String name;
int age;
}
class B{
public void test200(Person p){
// p.age = 10000; 将这行换成下列代码
p = null;
}
答案是:main 的p.age为10
方法的编写思路:
按下列顺序思路编写方法:
- 方法的返回类型
- 方法的名字
- 方法的形参
- 方法体
练习题:
编写一个方法copyPerson, 可以复制一个Person对象, 返回复制的对象。克隆对象,注意要求得到新对象和原来的对象是两个独立的对象,只是他们的属性相同。
public class MyTools{
//编写一个方法copyPerson, 可以复制一个Person对象, 返回复制的对象。克隆对象,
//注意要求得到新对象和原来的对象是两个独立的对象,只是他们的属性相同
/* 编写方法的思路:
1. 方法的返回类型
2. 方法的名字
3. 方法的形参
4. 方法体
*/
public Person copyPerson(Person A){
Person B = new Person();
B.name = A.name;
B.age = A.age;
return B;
}
}
public class Person {
//编写一个方法copyPerson, 可以复制一个Person对象, 返回复制的对象。克隆对象,
//注意要求得到新对象和原来的对象是两个独立的对象,只是他们的属性相同
public String name;
public int age;
}
public class Test {
public static void main(String[] args) {
MyTools test = new MyTools();
Person I1 = new Person();
I1.name = "芒特";
I1.age = 25;
Person I2 = test.copyPerson(I1);
System.out.println("对象A的属性: 姓名:"+I1.name+" 年龄:"+I1.age);
System.out.println("对象B的属性: 姓名:"+I2.name+" 年龄:"+I2.age);
}
}
//结果:
对象A的属性: 姓名:芒特 年龄:25
对象B的属性: 姓名:芒特 年龄:25
以上是看韩顺平老师的Java课程做的随笔笔记
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/288709.html