菜鸡的Java笔记 第六 - java 方法
前提:现在所讲解的方法定义格式,只属于JAVA 方法定义的其中一种组成方式。而完整的组成方式将随着学习逐步渗透。
1.方法的基本定义
方法(Method)在一些书中也会有人将其说是 函数(Function) 。但是两者的含义完全相同的,那什么是方法?为什么需要有方法?实际上所谓的方法指的就是一段代码封装在一个结构体之中,并且可以重复调用。
方法的定义语法原则(本次所讲解的语法指的是在主类中定义的方法,并且由主方法直接调用。)
2.方法调用
java中的方法分为(1)静态方法 直接使用 类名.方法名 调用
(2)普通方法 通过new创建对象 然后使用 对象.方法 调用
public static 返回值类型 方法名称([参数类型 变量,参数类型 变量,...]){
方法中包含的代码;
[return 返回值;]
}
返回值类型可以设置为两种:
JAVA 中的数据类型:基本数据类型,引用数据类型;如果现在有返回的内容则需要通过 retum 返回
不返回任何的结果:void;
方法就是留给用户进行重复调用的。
public class TestDemo{
public static void main(Srting args[]){
printlnfo(); // 调用方法
printlnfo(); // 调用方法
}
public static void printlnfo(){ // 此方法没有参数没有返回值
System.out.println(".........................");
System.out.println("-- Hello World! --");
System.out.println(".........................");
}
}
范例:定义一个可以接收参数的方法
public class TestDemo{
public static void main(Srting args[]){
printlnfo(10); // 调用方法
printlnfo(100); // 调用方法
}
public static void printlnfo(int age){
if(age > 250){
System.out.println("您是人吗?");
}else{
System.out.println("您的年龄是:"+ age);
}
}
}
实际上在进行方法编写的时候有其自己的定义格式:要求定义方法的单词第一个单词字母小写,而后每个单词的首字母大写。
那么以上定义了无参无返回值,有参无返回值的方法,那么下面在来定义有参数有返回值的方法
范例:定义一个加法操作
public class TestDemo{
public static void main(Srting args[]){
int result = add(10,20); // 由于返回的是int型数据,所以可以利用变量接收
System.out.println(result);
System.out.println(add(100,300)); // 直接将方法的返回值输出
}
public static int add(int x,int y){
if(x<0){
return 0; // 只要有返回值类型声明,那么必须使用return 返回
}
if(y<0){
return 0; // 只要有返回值类型声明,那么必须使用return 返回
}
return x + y; // 只要有返回值类型声明,那么必须使用return 返回
}
}
在学习循环语句的时候学习过 break 与 continue语句,这两个语句主要是进行循环控制,合理的利用可以让循环语句之后的代码不在执行,但是必须与 if 判断一起使用。
而同样的操作在方法中也提供,如果说你的方法使用了 void 声明,那么就是可以
在方法执行过程之中直接利用“return”来结束方法调用。
范例:利用return 结束方法调用
public class TestDemo{
public static void main(Srting args[]){
print(10);
print(100);
}
public static void print(int age){ // 此时方法没有返回值
if(age > 250){
return; // 后续代码不再执行,前提:方法必须返回 void
}
System.out.println("年龄是:" + age);
}
}
不管什么情况,只要是在return之后的代码都不再执行,但是需要区分的是,如果方法返回的是 void,那么就可以直接写 return,但是如果方法本身有返回值,那么就必须在编写return的同时返回内容。
return的常用作用有以下两种
一种是返回参数所用的关键字,假如一个有返回值的方法执行完了之后需要返回一个参数,示例:
public string functionTest(){
String a = "abc";
return a;
}
那么这个方法被调用之后就会返回一个值为abc的字符串,string result = functionTest();
第二种用法是,代码执行到此处终止。
比如当代码执行到某个地方会出现几种结果,然后其中一种结果就不能执行后续代码,这时候在那里加上一个return就可以终止后面的代码执行
实际的开发之中是否使用方法有两个决定性的原则:
主方法里的代码是不是太多了,如果多了,可以将其拆分到方法之中;
在你编写代码的过程之中总是在不断的进行复制和粘贴;就可以考虑将这部分代码封装为方法
3. 方法重载(重点)
方法重载指的是方法名称相同,参数的类型或个数不同。为了理解方法重载的意义 要求:
现在要求定义有三个加法操作,包括两个整型相加,三个整型相加,两个小数相加。
public class TestDemo{
public static void main(Srting args[]){
System.out.println("两个整数相加:" + add1(10,20));
System.out.println("三个整数相加:" + add2(10,20,30));
System.out.println("两个小数相加:" + add3(10.2,30.4));
}
public static int add1(int x,int y){
return x+y;
}
public static int add2(int x,int y,int z){
return x + y + z;
}
public static double add3(double x,double y){
return x+y;
}
}
如果说功能相同的方法名字不一样,那么在调用的时候实在是很麻烦的,这种情况下最好的解决方案就是方法重载(像这样有几十个就会很麻烦,要自己去找合适的方法,不过现在可以用方法重载来解决)
范例:利用重载解决
调用重载方法时会根据传递的参数类型以及个数调用不同的方法执行。
public class TestDemo{
public static void main(Srting args[]){
System.out.println("两个整数相加:" + add(10,20));
System.out.println("三个整数相加:" + add(10,20,30));
System.out.println("两个小数相加:" + add(10.2,30.4));
}
public static int add(int x,int y){
return x+y;
}
public static int add(int x,int y,int z){
return x + y + z;
}
public static double add(double x,double y){
return x+y;
}
}
两类操作完成的是同一个功能,但是很明显,在调用的时候利用方法重载的操作会更加简单。
但是在进行方重载的时候有一项重要的说明----关于 返回值的问题。在方法重载的时候本身只规定了参数的类型与个数的不同,但是并没有针对于返回值的类型是否相同进行限制。但是在实际来讲,方法重载时返回值类型一定要相同。
方法重载时返回值类型可以不同,但是从开发的标准来讲应该相同的。
2.3 方法的递归调用
如果以开发中出现的代码为主的画,那么递归操作几乎不会出现,但是如果你要想分析一些开发工具原理的话那么就必须使用递归。递归是迈入数据结构的第一步,但是这并不是说一下子就就可以理解递归,相反,如果真的想理解递归操作,那么可以将本次的代码自己编写50遍以上。
所谓的递归指的是方法自己调用自己的情况。而对于递归操作一般都要满足如下操作。
递归必须在方法上进行
递归中必须有明确的结束条件
递归的过程之中必须进行结束条件的变更。
范例:利用while循环实现一个累加操作。
public class TestDemo{
public static void main(Srting args[]){
int x = 1;
int sum = 0;
while(x <= 100){
sum += x;
x ++;
}
System.out.println(sum);
}
}
那么下面讲此代码修改为递归的调用形式。
public class TestDemo{
public static void main(Srting args[]){
System.out.println(sum(100));
}
public static int sum(int num){ // 进入到方法之中
if(num == 1){ // 已经到了最后一个数据
return 1; // 直接返回1
}
// 100+99+98+...+2+1;
return num + sum(num -1); // 每次修改接收条件
对于此代码的调用分析如下:
第一次调用(主方法调用):retum 100 + sum(99);
第二次调用(sum(99)方法):retum 99 + sum(98);
第三次调用(sum(98)方法):retum 98 + sum(97);
...............................
倒数第二次调用(sum(2)方法):retum 2 + sum(1);
最后一次调用(sum(1)方法):if 判断条件满足,retum 1。
最终变为了:retum 100 +99+98+......+3+2+1(if 语句);
实际上递归操作有一件很可怕的影响:由于其操作所占用的时间(包括内存占用)的时间过长,那么有可能会造成内存的溢出。导致程序出现问题。所以不是必须用到的情况下,不建议使用递归操作。
3.总结
方法的定义结构,但是本次的方法有限制性:只能够在主类中定义由主方法进行调用;
方法的重载:方法名称相同,参数的类型和个数不同,方法重载对返回值类型没有要求,但是一定要统一返回值类型。
菜鸡的Java笔记 第六 - java 方法的更多相关文章
- Java笔记(六)
IO流: 字符流和字节流: 字符流两个基类: InputStream OutputStream 字节流两个基类: Reader Writer FileWriter: import java.io.Fi ...
- java并发系列(六)-----Java并发:volatile关键字解析
在 Java 并发编程中,要想使并发程序能够正确地执行,必须要保证三条原则,即:原子性.可见性和有序性.只要有一条原则没有被保证,就有可能会导致程序运行不正确.volatile关键字 被用来保证可见性 ...
- 【Java笔记】配置文件java.util.Properties类的使用
配置文件的路径:项目名/src/main/resources/mmall.properties mmall.properties的内容是键值对.例如假设写了ftp服务器的一些信息. ftp.serve ...
- Java笔记12:Java对象排序
代码: import java.util.Arrays; import java.util.Comparator; class Person { private String name; privat ...
- 【Java笔记】【Java核心技术卷1】chapter3 D1JavaStandard
package chapter3;/*有包名,命令行编译javac -d . 名字.java(注意空格)运行时用java chapter3.JavaStandard*/ public/*访问修饰符*/ ...
- 菜鸡的Java笔记 第四 - java 基础运算符
数学运算符,逻辑运算,三目运算,位运算 double d2 = 314e2; //采用科学计数法的写法,表示10的2次方.= 31400.0 代码写的越简单越好 简化运算符 代码:x=x+y 可以 ...
- 菜鸡的Java笔记 第十 - java 类与对象
(局部变量需要初始化,全局变量不初始化系统也会帮忙初始化而局部变量系统不会帮忙初始化)>>> 2.1 类与对象基本概念 在现实生活之中,类指的就是具备某一共性的群 ...
- 菜鸡的Java笔记 第二十三 - java 抽象类的概念
abstractClass 抽象类的概念 1.抽象类的基本定义 2.抽象类的使用原则 不会抽象类与接口,java = 没学 ...
- 菜鸡的Java笔记 第八 - java 面向对象
面向对象的特点以及开发过程. java中最大的特点是其支持面向对象编程设计思想.在面向对象之前广泛流传的是面向过程的编程思想,例如:C语言的开发就属于面向过程 如果要想更简单的去理解面向过 ...
随机推荐
- react-native移动端设置android闪屏页
前言 因为app启动时会白屏一段时间,导致让人用起来非常的不舒服,后来了解一下知道这叫做闪屏 于是着手解决这个白屏的问题,换个颜色?不行,不如用一张好看的图片来替换,这样才让人看起来更加舒服. 那么该 ...
- Django整理(四) - URL配置
1. URL配置 一.需求 1. 需求:在浏览器访问URL地址 http://127.0.0.1:8000/users/index 时,显示hello django信息 2. 实现 i. 需要编写一个 ...
- C++学习 3 结构体
结构体基本概念: 结构体属于用户自定义的数据类型,允许用户存储不同的数据类型: 结构体定义和使用: 语法:struct 结构体名 { 结构体成员列表 }: 通过结构体创建变量名的方式有三种: ...
- JUC多线程之ThreadPoolExecutor类任务执行流程
ThreadPoolExecutor类: ThreadPoolExecutor是我们最常用的一个线程池类,它实现了AbstractExecutorService接口.首先来看一下它的构造器及相关关键变 ...
- go 连接MSSQLServer数据库【遇到的坑】
前言:项目测试需要用到mssqlserver数据库连接,遇到坑,自己爬直接上代码: package main import ( "database/sql" " ...
- 基于TLS证书手动部署kubernetes集群
一.简介 Kubernetes是Google在2014年6月开源的一个容器集群管理系统,使用Go语言开发,Kubernetes也叫K8S. K8S是Google内部一个叫Borg的容器集群管理系统 ...
- Eureka使用总结
关于Eureka: 提供基于 REST的服务,在集群中主要用于服务管理.使用该框架,可以将业务组件注册到Eureka容器中,这些组件可进行集群部署,Eureka主要维护这些服务的列表并自动检查他们的状 ...
- PAT (Basic Level) Practice (中文)1022 D进制的A+B (20分)
1022 D进制的A+B (20分) 输入两个非负 10 进制整数 A 和 B ( ≤ 230 −1),输出 A+B 的 D (1<D≤10)进制数. 输入格式: 输入在一行中依次给出 3 ...
- 分割迭代器Spliterator源码文档翻译
前言 身体是革命的本钱,不舒服了2周,现在好点了. 学习JDK8的Stream,Spliterator这个分割迭代器是必须要重视的. Notes:下方蓝色文字是自己的翻译(如果有问题请指正).黑色文字 ...
- Shiro反序列化的检测与利用
1. 前言 Shiro 是 Apache 旗下的一个用于权限管理的开源框架,提供开箱即用的身份验证.授权.密码套件和会话管理等功能. 2. 环境搭建 环境搭建vulhub 3. 如何发现 第一种情况 ...