【方法】

方法基本内容

√访问修饰符

​ (作用是控制方法使用的范围)

​ 可选,[有四种:public\protected\默认\private],具体在后面说

√返回类型

​ 1.一个方法最多有一个返回值[思考,如何返回多个结果?]

​ 2.返回类型可以为任意类型,包含基本类型或引用类型(数组,对象)

​ 3.如果方法要求有返回数据类型,则方法体中最后的执行语句必须为return值;

​ 而且要求返回值类型必须和return的值类型一致或兼容

​ 4.如果方法是void,则方法体中可以没有return语句,或者只写return ;

√方法名

​ 遵循驼峰命名法

√形参列表

​ 1.一个方法可以没有参数,也可以有多个参数,中间用逗号开,比如getSum(int n1,int n2)

​ 2.参数类型可以为任意类型,包含基本类型或引用类型,比如 printArr(int]map)

​ 3.调用带参数的方法时,一定对应着参数列表传入相同类型或兼容类型的参数!【getSum】

​ 4.方法定义时的参数称为形式参数,简称形参;

​ 方法调用时的参数称为实际参数,简称实参。实参和形参的类型要一致或兼容、个数、顺序必须一致!

√方法体

​ 里面写完成功能的具体的语句,可以为输入、输出、变量、运算、分支、循环、方法调用,

​ 里面不能再定义方法!

​ 即:方法不能嵌套定义。

例子1

public class MethodDetail{
public static void main(String[] agrs){ AA a = new AA();
int[] res = a.getsumAndSub(1,3);
System.out.println("和="+res[0]);
System.out.println("差="+res[1]); //细节:调用带参数的方法时,一定对应着参数列表传入相同类型或兼容类型的参数
byte b1 = 1;
byte b2 = 2;
a.getSumAndSub(b1,b2);//byte -> int低精度给高精度类型是可以兼容的 }
} class AA{
//1.一个方法最多有一个返回值[思考,如何返回多个结果?返回数组]
//返回类型为int[]
public int[] getsumAndSub(int n1, int n2) {
int[] resArr = new int[2];//创建一个数组
resArr[0] = n1 + n2;
resArr[1] = n1 - n2;
return resArr;
}
} //如果方法是void,则方法体中可以没有return语句,或者只写return ;
public void f2(){
System.out.print1n("hello1");
System.out.print1n("hello1");
System.out.print1n("hello1");
int n = 10;
//return ;
}

例子2

public class MethodDetail02{
public static void main(String[] agrs){
/*
√方法细节调用说明
1.同一个类中的方法调用:直接调用即可。比如print(参数);
案例演示:A类sayOk调用print()
2.跨类中的方法A类调用B类方法:需要通过对象名调用。
比如对象名.方法名(参数);
案例演示:B类sayHello调用print()
3.特别说明一下:跨类的方法调用和方法的访问修饰符相关,先暂时这么提一下,
后面我们讲到访问修饰符时,还要再细说。
*/
A a = new A();
// a.sayok;
a.m1();
}
} class A {
//同一个类中的方法调用:直接调用即可
//
public void print(int n) {
System.out.println("print()方法被调用n=" + n);
} public void sayok() {//sayok调用print(查接调用即可)
print(10);
} //跨类中的方法A类调用B类方法:需要通过对象名调用
public void m1() {
//创建B对象,然后在调用方法即可
System.out.println("m1()方法被调用");
B b = new B();
b.hi();
} } class B {
public void hi() {
System.out.println("B类中的hi()被执行");
}
}

练习

习题一

1、编写方法:判断一个数是奇数odd还是偶数,返回boolean

2、根据行、列、字符打印对应行数和列数的字符

public class MethodExercise01{
public static void main(String[] agrs){
AA a = new AA();
if(a.isOdd(2)){
System.out.println("t");
}else{
System.out.println("f");
} a.print(10,10,"草");
}
} //1.编写类AA新方法:判断一个数是奇数odd还是偶数,返回boolean
class AA{
//思路
//1.方法的返回类型boolean
//2.方法的名字isodd
//3.方法的形参1(int num)
//4.方法体,判断
public boolean isOdd(int num){
//朴素思路
// if(num % 2 == 0){
// return false;
// }else{
// return true;
// } //还可以这么想
// return num % 2 ! = 0 ? true; false; return num % 2 ! = 0;//最后可以简化成这个 } //根据行、列、字符打印对应行数和列数的字符,
//比如:行:4,列:4,字符#,则打印相应的效果
/*
####
####
####
####
*/ //思路
//1.方法的返回类型void
//2.方法的名字print
//3.方法的形参(int row,int col, char c)
//4. 方法体,循环
public void print(int row, int col, String c){
for(int i = 0; i<row; i++){
for(int j = 0; j<col; j++){
System.out.print(c);
}
System.out.println();
} } }

习题二 方法克隆对象

编写一个方法copyPerson,可以复制一个Person对象,返回复制的对象。

克隆对象,注意要求得到新对象和原来的对象是两个独立的对象,只是他们的属性相同

public class MethodExercise02{
public static void main(String[] agrs){
Person p = new Person();
p.name = "m";
p.age = 100; MyTools tool = new MyTools();
Person p2 = tool.copyPerson(p); //到此 p和p2是Person对象,但是是两个独立的对象,属性相同
System.out.println("p的属性age=" + p.age+"名字=" + p.name);
System.out.println("p2的属性age=" + p2.age +"名字="+ p2.name);//提示:可以同对象比较看看是否为同一个对象
System.out.println(p == p2); //false }
} class Person{
String name;
int age;
} class MyTools{
//思路
//1.方法的返回类型Person
//2.方法的名字copyPerson
//3.方法的形参(Person p)
//4.方法体,创建一个新对象并复制属性,返回
public Person copyPerson(Person p){
//这里的形参传入一个对象名,还没有真的开辟新空间
//创建一个新对象p2,开辟新的内存空间
Person p2 = new Person();
p2.name = p.name;
p2.age = p.age; return p2; }
}

习题三

public class MethodParameter01{
public static void main(String[] agrs){
int a = 10;
int b = 20;
AA obj = new AA();
obj.swap(a,b); /*
main方法中的a、b与AA方法中的a、b存在于栈中不同的位置,因此使用时的值会不同
*/
System.out.println("main方法 a="+a+" "+"b="+b);//a 10 b 20
}
} class AA{
public void swap(int a, int b){ System.out.println("\na和b交换前的值\na=" + a + "\tb=" + b);
//完成了a和b的交换
int tmp = a;
a = b;
b = tmp;
System.out.println("\na和b交换后的值\na=" + a + "\tb=" + b); }
}

注意点:

不同方法中的变量位于不同的栈空间中,因此使用时是相互独立的

习题四 方法传入对象

B类中编写一个方法test100,可以接收一个数组,在方法中修改该数组,看看原来的数组是否变化?

答:会变化,该操作只是将数组地址传给方法,指向同一个数据内存空间

B类中编写一个方法test200,可以接收一个Person(age,sal)对象,在方法中修改该对象属性,看看原来的对象是否变化?

答:会变化,该操作只是将实例化后的对象的地址传给方法,也是指向同一个数据内存空间

public class MethodParameter02{
public static void main(String[] agrs){
//测试
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.print(arr[i] +"\t");
// }
// System.out.println(); Person p = new Person();
p.name = "jack";
p.age = 10;
b.test200(p);//把p的地址传给test200 //若test200执行的是p = null, 下面的输出是什么? 10
//原因:p = null只是把方法里的p置空,即指向一个空地址,
//不影响main中为p开辟的地址中的值(下面代码的p是main的) //若test200执行的是p = new Person();, 下面的输出是什么? 10
//原因:栈中,main实例化了一个p,其在堆中产生一个对象
//此时main实例化的b调用了test200,因为其传入的参数是p,故此时该p与main中p指向堆中的同一处(age 10)
//随后在test200中又实例化了一个p,那么test200中的p会指向一个新的堆空间(age 99)
//因为打印语句的p在main中调用,所以打的是age等于10的那个堆的数据
//然后堆空间(age 99)会被当成垃圾回收
System.out. println("main的p.age=" + p.age);//100000
}
} class Person{
String name;
int age;
} class B{ public void test200(Person p){
// p.age = 100000;
//思考
// p = null;
//思考
p = new Person();
p.name = "tom";
p.age = 99;
}
//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.print(arr[i] + "\t");
}
System.out.println();
}
}

【Java复健指南02】方法的注意事项的更多相关文章

  1. 【Java复健指南09】项目练习全解--房屋出租系统

    一个基于文本界面的综合练习,主要用于串联和回忆知识点,比较简单 各个界面的设计样式 主菜单 =============房屋出租系统菜单============ 1 新 增 房 源 2 查 找 房 屋 ...

  2. 【Java复健指南15】链表LinkedList及其说明

    链表LinkedList by Java 之前有写过一些记录(引用),但是忘了乱了,现在重新梳理一遍 链表是Java中List接口的一种实现 定义(引用) 链表(linked list)是一种物理存储 ...

  3. java字符流操作flush()方法及其注意事项

    java字符流操作flush()方法及其注意事项   flush()方法介绍 查阅文档可以发现,IO流中每一个类都实现了Closeable接口,它们进行资源操作之后都需要执行close()方法将流关闭 ...

  4. java Vamei快速教程02 方法和数据成员

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在Java基础01 从HelloWorld到面向对象,我们初步了解了对象(obje ...

  5. java安全编码指南之:方法编写指南

    目录 简介 不要在构造函数中调用可以被重写的方法 不要在clone()方法中调用可重写的方法 重写equals()方法 hashCode和equals compareTo方法的实现 简介 java程序 ...

  6. Java基础|02.方法的传递机制

    Java基础|02.方法传参机制 0x00 前言 Parameter:参数 java中只有传值,因为地址值也是值 0x01 基础数据类型的传参机制 基本数据类型的值传递,不改变原值.因为调用后会弹栈, ...

  7. Java工程师学习指南 完结篇

    Java工程师学习指南 完结篇 先声明一点,文章里面不会详细到每一步怎么操作,只会提供大致的思路和方向,给大家以启发,如果真的要一步一步指导操作的话,那至少需要一本书的厚度啦. 因为笔者还只是一名在校 ...

  8. Java工程师学习指南 中级篇

    Java工程师学习指南 中级篇 最近有很多小伙伴来问我,Java小白如何入门,如何安排学习路线,每一步应该怎么走比较好.原本我以为之前的几篇文章已经可以解决大家的问题了,其实不然,因为我写的文章都是站 ...

  9. Java工程师学习指南 初级篇

    Java工程师学习指南 初级篇 最近有很多小伙伴来问我,Java小白如何入门,如何安排学习路线,每一步应该怎么走比较好.原本我以为之前的几篇文章已经可以解决大家的问题了,其实不然,因为我之前写的文章都 ...

  10. Java工程师学习指南 入门篇

    Java工程师学习指南 入门篇 最近有很多小伙伴来问我,Java小白如何入门,如何安排学习路线,每一步应该怎么走比较好.原本我以为之前的几篇文章已经可以解决大家的问题了,其实不然,因为我之前写的文章都 ...

随机推荐

  1. Windows 可以操纵linux内文件,与本地一致的工具

    https://github.com/allanrbo/filesremote/releases/ 感觉挺好的.

  2. Spring 应用合并之路(二):峰回路转,柳暗花明 | 京东云技术团队

    书接上文,前面在 Spring 应用合并之路(一):摸石头过河 介绍了几种不成功的经验,下面继续折腾- 四.仓库合并,独立容器 在经历了上面的尝试,在同事为啥不搞两个独立的容器提醒下,决定抛开 Spr ...

  3. 学习下Redis内存模型

    作者:京东零售 吴佳 前言 redis,对于一个java开发工程师来讲,其实算不得什么复杂新奇的技术,但可能也很少人去深入了解学习它的底层的一些东西.下面将通过对内存统计.内存划分.存储细节.对象类型 ...

  4. 使用css 与 js 两种方式实现导航栏吸顶效果

    场景描述 简单的说一下场景描述:这个页面有三个部分组成的. 顶部的头部信息--导航栏--内容 当页面滚动的时候.导航栏始终是固定在最顶部的. 我们使用的第一种方案就是使用css的粘性定位 positi ...

  5. .NET 使用Camunda快速入门

    简介参考:https://www.cnblogs.com/lvdeyinBlog/p/16095603.html 一.工作流介绍 1. 什么是工作流 工作流(Workflow),是对工作流程及其各操作 ...

  6. c++基础之语句

    上一次总结了一下c++中表达式的相关内容,这篇博文主要总结语句的基础内容 简单语句 c++ 中语句主要是以分号作为结束符的,最简单的语句是一个空语句,空语句主要用于,语法上需要某个地方,但是逻辑上不需 ...

  7. Vue双向数据绑定原理-中

    defineProperty方法 defineProperty除了可以动态修改/新增对象的属性以外, 还可以在修改/新增的时候给该属性添加get/set方法, 从而实现数据劫持. defineProp ...

  8. C/C++ 实现简易HTTP服务器

    #include <stdio.h> #include <stdlib.h> #include <process.h> #include <WinSock2. ...

  9. Vulkan学习苦旅03:零号显卡,启动!(选择物理设备VkPhysicalDevcie)

    随着近几年AI的迅速发展,GPU变得越来越抢手.然而,GPU的全称为Graphics Processing Unit, 从名字中就可以看出,GPU是为了处理图形而诞生的,后来才被应用到科学计算等领域中 ...

  10. 除了mysql 和 sql server, 你还有另外一种选择 postgreSQL

    数据库的重要性,不用多说.数据库的名字,大家应该也知道很多.就国内来说,使用者最多的应该是mysql 和sql server,大企业用ORACLE的也不在少数. 就我个人而言,在使用.NET的时候,基 ...