前言
今天我们要探讨的问题,是java
基础语法的最后一个问题,也就是java
中的方法,今天主要从以下几个方面来介绍:
- 方法是什么(定义)
- 方法的分类
- 方法的调用
应该说,学完今天的知识,你至少应该看懂java
代码的大概结构,能够写一些简单的java
程序,来处理一些简单的问题,如果还没达到这个高度,那你可要好好学习,多动手练习,我记得我那会开始学习的时候,就是靠着一本二手的java
教材,然后看着课后练习题,不断敲代码,然后才入门的,刚开始的时候好多概念也不知道,也没看视频教程,走了好多弯路,所以我觉得你也可以,加油吧!
正文
什么是方法
在最开始我们讲到java
的基本结构的时候,我们说方法是某个对象的行为,比如对于人这个class
:
class 人 {
名字;
电话;
年龄;
吃饭() {
}
睡觉() {
}
打豆豆() {
}
}
吃饭、睡觉、打豆豆都是人这个class
的行为,也就是方法,现在我们要对方法进行扩展和更精确的定义。从实际应用开发的角度来说,方法就是一系列操作的集合,但这一系列组合操作要尽可能相关,因为实际应用开发的原则是一个方法只做一件事。
当然你也可以在一个方法中做多件事,但是这样不够优雅,对于后期维护极其不方便,你能想象一个方法里面有上百行,甚至上千行的代码吗?我们的项目中还真有,后期修改那个业务的时候,我想死的心都有,因为那已经是经过N手的代码,没有注释,业务逻辑只能靠debug
和自己猜,所以各位小伙伴一定要养成编写优雅代码的好习惯,这样才会你好我好大家好。
方法的创建语法是这样的:
访问控制符 特殊修饰符 返回值类型 方法名(参数类型 参数1名称, 参数类型 参数2名称...) {
// 方法内部的操作
// 返回语句,对于返回值类型为void的语句,返回语句为【return ;】,当然返回语句可以省略
return 类型为返回值类型的变量
}
其中,访问控制符就是我们上周说的,主要有private
、public
、protected
、默认,访问控制权限和修饰class
类似:
访问修饰符 | 本类 | 同包 | 子类 | 其他 |
---|---|---|---|---|
private | √ | × | × | × |
默认 | √ | √ | × | × |
protected | √ | √ | √ | × |
public | √ | √ | √ | √ |
无修饰符的方法在实际开发中应用很少(反正我没见过),需要注意的是接口中的方法并非是无修饰符的,它的方法默认修饰符是public
,只是是隐式的。
特殊修饰符指的是为了一些特殊需求而加的修饰符,只要有final
、static
、abstract
,这里不做过多说明,后面在面向对象的继承部分会详细说明。
返回值类型指的是方法执行完成要返回的结果的类型,如果当前方法不需要返回结果,返回结果类型就是void
。返回值类型,除了基本类型外,还可以是任意引用类型,比如String
、Object
。
方法名就是我们定义的操作集合的名称,从代码规范的角度来说,名称要尽可能反映该方法集合要做的事情,比如吃东西的方法集合,为了让其他人看了也知道,那我起的名字就是eat
参数是方法内部要用到的变量,但是这些变量必须要方法外部传入,比如我定义了一个eat
方法:
public void eat(String food) {
System.out.println("吃" + food);
}
现在我的参数是食物,但如果我还想再增加一个参数,增加餐具,你这样定义方法就可以:
public void eat(String food, String eatTool) {
System.out.println("用" + eatTool + "吃" + food);
}
如果需要更多参数,你自行添加即可。参数的次序没有任何要求,可以自己调整,但是参数名称一定要尽可能真实表达参数的意义,这样对于方法的调用方,他就可以更清楚地传值。
方法的分类
方法的分类简单来讲有三类:
-
类(静态)方法:
static
特殊修饰符修饰的方法,比如main
方法就是最典型的静态方法:public static void main(String[] args) { Person person = new Person(); person.age = 20; System.out.println(person.age); double pi = Math.PI; float pif = (float) pi; System.out.println(pi); System.out.println(pif); }
-
实例方法:顾名思义,实例方法,就是要先创建方法所在的类的实例,然后才能调用的方法。这类方法最常见,也是实际开发中应用最广的方法,我们上面定义的
eat
方法就是此类 -
构造方法:这类方法是在创建某个类的对象是调用的,和上面两个不同的是,这个方法没有返回值类型,不可以加特殊修饰符,该方法默认返回类的实例对象:
public class You { public String name; public int age; public String gender; public You() { // 方法操作 System.out.println("you被创建"); } You(String name) { // 方法操作 System.out.println("you被创建,you的名字" + name); } private You(int age) { // 方法操作 System.out.println("you被创建,you的年龄" + age); } protected You(String name, int age) { // 方法操作 System.out.println("you被创建,you的名字" + name + "you的年龄" + age }
上面的这些方法,都是
you
的构造方法,需要注意的是,构造方法的名字必须和类名保持一致(区分大小写),构造方法也可以说它是静态方法,只是它的static
是隐式的,至于为什么,我们在方法的调用再来探讨。
方法的调用
方法也叫函数,但是在java
中我们习惯叫他方法,方法的调用就是方法的使用,一个方法如何使用,首先取决于它的类型(它是哪种方法),所以这里我们也分三块来讲:
静态方法的调用
静态方法可以被实例方法、构造方法和静态方法调用,调用方法也很简单:
类名.方法名(方法入参);
// 如果是在同一个类中调用,可以省略类名:
方法名(方法入参)
示例代码:
public static void testSatatic(String name) {
System.out.println("我是一个静态方法,我被调用了,name=" + name);
}
/**
* 在静态方法中调用静态方法
*/
public static void main(String[] args) {
String name = "静态方法";
You.testSatatic(name);
}
/**
* 在实例方法中调用
*/
public void test(String name) {
System.out.println("我是一个实例方法,我被调用了,name=" + name);
testSatatic("实例方法");
}
/**
* 在构造方法中调用
*/
public You() {
// 方法操作
System.out.println("you被创建");
testSatatic("构造方法");
}
实例方法的调用
我们前面说了,实例方法必须先创建类的实例,才能调用实例方法,所以实例方法的调用是这样的:
类名 实例名 = new 构造方法();
实例名.实例方法名(方法入参)
// 如果是在同一个类中调用,可以省区实例化操作:
实例方法名(方法入参)
示例代码:
public void test(String name) {
System.out.println("我是一个实例方法,我被调用了,name=" + name);
}
/**
* 在静态方法中调用实例方法
*/
public static void main(String[] args) {
You you = new You();
you.test("静态方法");
}
/**
* 在实例方法中调用
*/
public void test2() {
System.out.println("我是一个实例方法");
test("实例方法");
}
/**
* 在构造方法中调用
*/
public You() {
// 方法操作
System.out.println("you被创建");
test("构造方法");
}
构造方法的调用
构造方法的调用也很简单:
类名 实例名 = new 构造方法();
示例代码:
public You() {
// 方法操作
System.out.println("you被创建");
}
/**
* 在静态方法中调用
*/
public static void main(String[] args) {
You you = new You();
}
/**
* 在实例方法中调用
*/
public void test2() {
System.out.println("我是一个实例方法");
You you = new You();
}
/**
* 在构造方法中调用
*/
public You(String name) {
// 方法操作
System.out.println("you被创建,you的名字" + name);
You you = new You();
}
/**
* 如果是同一个类的构造方法之间的调用,也可以这样写:
*/
public You(String name) {
// 调用无参构造方法
this();
// 方法操作
System.out.println("you被创建,you的名字" + name);
}
这里需要注意的是,在构造方法中通过this
调用自己的构造方法时,调用操作必须写在第一行,否则会报编译错误:
结语
java
方法部分的内容到这里就结束了,当然方法这里还有很多知识点没有讲到:方法的重写、重载、方法传参等,内容还有很多,后面等面向对象部分的内容讲解完后,我们再来进一步剖析。希望看完今天内容的小伙伴,能对方法有个更清晰的认知和了解,我刚才翻了下之前自己的学习笔记,我发现我那会对方法这块认识的还不够,所以希望正在学习的你,能少走弯路,最后附上我之前的笔记,大家看下是不是认识不够:
实例方法可以调用该类中的实例方法或者类方法,类方法只能调用该类的类方法或者静态方法,不能调用实例方法(静态方法只能调用静态方法,不能调用非静态方法)
方法声明中用关键字static修饰的均为类方法或者静态方法,不用static修饰的方法称为实例方法;
最后,放上最近刚开源的一个小仓库,里面有我日常开发整理形成的工具类,目前确实详细的说明文档,后续会逐步补充,如果只是参考使用的话,代码的注释应该已经可以了。
项目地址:
https://github.com/Syske/syske-common-utils
项目目录: