Java 方法

在前面几个章节中我们经常使用到 System.out.println(),那么它是什么呢?

println() 是一个方法。

System 是系统类。

out 是标准输出对象。

这句话的用法是调用系统类 System 中的标准输出对象 out 中的方法 println()。

那么什么是方法呢?

Java方法是语句的集合,它们在一起执行一个功能。

方法是解决一类问题的步骤的有序组合

方法包含于类或对象中

方法在程序中被创建,在其他地方被引用

方法的优点

1. 使程序变得更简短而清晰。

2. 有利于程序维护。

3. 可以提高程序开发的效率。

4. 提高了代码的重用性。

方法的命名规则1. 必须以字母、'_'或'$'开头。

2. 可以包括数字,但不能以它开头。

方法的定义

一般情况下,定义一个方法包含以下语法:

修饰符 返回值类型 方法名(参数类型 参数名){

...

方法体

...

return 返回值;

}

方法包含一个方法头和一个方法体。下面是一个方法的所有部分:

修饰符:修饰符,这是可选的,告诉编译器如何调用该方法。定义了该方法的访问类型。

返回值类型 :方法可能会返回值。returnValueType 是方法返回值的数据类型。有些方法执行所需的操作,但没有返回值。在这种情况下,returnValueType 是关键字void。

方法名:是方法的实际名称。方法名和参数表共同构成方法签名。

参数类型:参数像是一个占位符。当方法被调用时,传递值给参数。这个值被称为实参或变量。参数列表是指方法的参数类型、顺序和参数的个数。参数是可选的,方法可以不包含任何参数。

方法体:方法体包含具体的语句,定义该方法的功能。

如:

public static int age(int birthday){...}

参数可以有多个:

static float interest(float principal, int year){...}

注意: 在一些其它语言中方法指过程和函数。一个返回非void类型返回值的方法称为函数;一个返回void类型返回值的方法叫做过程。

实例

下面的方法包含 2 个参数 num1 和 num2,它返回这两个参数的最大值。

/** 返回两个整型变量数据的较大值 */

public static int max(int num1, int num2) {

int result;

if (num1 > num2)

result = num1;

else

result = num2;

return result;

}

方法调用

Java 支持两种调用方法的方式,根据方法是否返回值来选择。

当程序调用一个方法时,程序的控制权交给了被调用的方法。当被调用方法的返回语句执行或者到达方法体闭括号时候交还控制权给程序。

当方法返回一个值的时候,方法调用通常被当做一个值。例如:

int larger = max(30, 40);

如果方法返回值是void,方法调用一定是一条语句。例如,方法println返回void。下面的调用是个语句:

System.out.println("欢迎访问菜鸟教程!");

示例

下面的例子演示了如何定义一个方法,以及如何调用它:

TestMax.java 文件代码:

public class TestMax {

/** 主方法 */

public static void main(String[] args) {

int i = 5;

int j = 2;

int k = max(i, j);

System.out.println( i + " 和 " + j + " 比较,最大值是:" + k);

}

/** 返回两个整数变量较大的值 */

public static int max(int num1, int num2) {

int result;

if (num1 > num2)

result = num1;

else

result = num2;

return result;

}

}

以上实例编译运行结果如下:

5 和 2 比较,最大值是:5

这个程序包含 main 方法和 max 方法。main 方法是被 JVM 调用的,除此之外,main 方法和其它方法没什么区别。

main 方法的头部是不变的,如例子所示,带修饰符 public 和 static,返回 void 类型值,方法名字是 main,此外带个一个 String[] 类型参数。String[] 表明参数是字符串数组。

void 关键字

本节说明如何声明和调用一个 void 方法。

下面的例子声明了一个名为 printGrade 的方法,并且调用它来打印给定的分数。

示例

TestVoidMethod.java 文件代码:

public class TestVoidMethod {

public static void main(String[] args) {

printGrade(78.5);

}

public static void printGrade(double score) {

if (score >= 90.0) {

System.out.println('A');

}

else if (score >= 80.0) {

System.out.println('B');

}

else if (score >= 70.0) {

System.out.println('C');

}

else if (score >= 60.0) {

System.out.println('D');

}

else {

System.out.println('F');

}

}

}

以上实例编译运行结果如下:

C

这里printGrade方法是一个void类型方法,它不返回值。

一个void方法的调用一定是一个语句。 所以,它被在main方法第三行以语句形式调用。就像任何以分号结束的语句一样。

通过值传递参数

调用一个方法时候需要提供参数,你必须按照参数列表指定的顺序提供。

例如,下面的方法连续n次打印一个消息:

TestVoidMethod.java 文件代码:

public static void nPrintln(String message, int n) {

for (int i = 0; i < n; i++) {

System.out.println(message);

}

}

示例

下面的例子演示按值传递的效果。

该程序创建一个方法,该方法用于交换两个变量。

TestPassByValue.java 文件代码:

public class TestPassByValue {

public static void main(String[] args) {

int num1 = 1;

int num2 = 2;

System.out.println("交换前 num1 的值为:" +

num1 + " ,num2 的值为:" + num2);

// 调用swap方法

swap(num1, num2);

System.out.println("交换后 num1 的值为:" +

num1 + " ,num2 的值为:" + num2);

}

/** 交换两个变量的方法 */

public static void swap(int n1, int n2) {

System.out.println("\t进入 swap 方法");

System.out.println("\t\t交换前 n1 的值为:" + n1

+ ",n2 的值:" + n2);

// 交换 n1 与 n2的值

int temp = n1;

n1 = n2;

n2 = temp;

System.out.println("\t\t交换后 n1 的值为 " + n1

+ ",n2 的值:" + n2);

}

}

以上实例编译运行结果如下:

交换前 num1 的值为:1 ,num2 的值为:2

进入 swap 方法

交换前 n1 的值为:1,n2 的值:2

交换后 n1 的值为 2,n2 的值:1

交换后 num1 的值为:1 ,num2 的值为:2

传递两个参数调用swap方法。有趣的是,方法被调用后,实参的值并没有改变。

方法的重载

上面使用的max方法仅仅适用于int型数据。但如果你想得到两个浮点类型数据的最大值呢?

解决方法是创建另一个有相同名字但参数不同的方法,如下面代码所示:

public static double max(double num1, double num2) {

if (num1 > num2)

return num1;

else

return num2;

}

如果你调用max方法时传递的是int型参数,则 int型参数的max方法就会被调用;

如果传递的是double型参数,则double类型的max方法体会被调用,这叫做方法重载;

就是说一个类的两个方法拥有相同的名字,但是有不同的参数列表。

Java编译器根据方法签名判断哪个方法应该被调用。

方法重载可以让程序更清晰易读。执行密切相关任务的方法应该使用相同的名字。

重载的方法必须拥有不同的参数列表。你不能仅仅依据修饰符或者返回类型的不同来重载方法。

变量作用域

变量的范围是程序中该变量可以被引用的部分。

方法内定义的变量被称为局部变量。

局部变量的作用范围从声明开始,直到包含它的块结束。

局部变量必须声明才可以使用。

方法的参数范围涵盖整个方法。参数实际上是一个局部变量。

for循环的初始化部分声明的变量,其作用范围在整个循环。

但循环体内声明的变量其适用范围是从它声明到循环体结束。它包含如下所示的变量声明:

你可以在一个方法里,不同的非嵌套块中多次声明一个具有相同的名称局部变量,但你不能在嵌套块内两次声明局部变量。

命令行参数的使用

有时候你希望运行一个程序时候再传递给它消息。这要靠传递命令行参数给main()函数实现。

命令行参数是在执行程序时候紧跟在程序名字后面的信息。

实例

下面的程序打印所有的命令行参数:

CommandLine.java 文件代码:

public class CommandLine {

public static void main(String args[]){

for(int i=0; i

System.out.println("args[" + i + "]: " + args[i]);

}

}

}

如下所示,运行这个程序:

$ javac CommandLine.java

$ java CommandLine this is a command line 200 -100

args[0]: this

args[1]: is

args[2]: a

args[3]: command

args[4]: line

args[5]: 200

args[6]: -100

构造方法

当一个对象被创建时候,构造方法用来初始化该对象。构造方法和它所在类的名字相同,但构造方法没有返回值。

通常会使用构造方法给一个类的实例变量赋初值,或者执行其它必要的步骤来创建一个完整的对象。

不管你与否自定义构造方法,所有的类都有构造方法,因为Java自动提供了一个默认构造方法,它把所有成员初始化为0。

一旦你定义了自己的构造方法,默认构造方法就会失效。

实例

下面是一个使用构造方法的例子:

// 一个简单的构造函数

class MyClass {

int x;

// 以下是构造函数

MyClass() {

x = 10;

}

}

你可以像下面这样调用构造方法来初始化一个对象:

ConsDemo.java 文件代码:

public class ConsDemo {

public static void main(String args[]) {

MyClass t1 = new MyClass();

MyClass t2 = new MyClass();

System.out.println(t1.x + " " + t2.x);

}

}

大多时候需要一个有参数的构造方法。

实例

下面是一个使用构造方法的例子:

// 一个简单的构造函数

class MyClass {

int x;

// 以下是构造函数

MyClass(int i ) {

x = i;

}

}

你可以像下面这样调用构造方法来初始化一个对象:

ConsDemo.java 文件代码:

public class ConsDemo {

public static void main(String args[]) {

MyClass t1 = new MyClass( 10 );

MyClass t2 = new MyClass( 20 );

System.out.println(t1.x + " " + t2.x);

}

}

运行结果如下:

10 20

可变参数

JDK 1.5 开始,Java支持传递同类型的可变参数给一个方法。

方法的可变参数的声明如下所示:

typeName... parameterName

在方法声明中,在指定参数类型后加一个省略号(...) 。

一个方法中只能指定一个可变参数,它必须是方法的最后一个参数。任何普通的参数必须在它之前声明。

实例

VarargsDemo.java 文件代码:

public class VarargsDemo {

public static void main(String args[]) {

// 调用可变参数的方法

printMax(34, 3, 3, 2, 56.5);

printMax(new double[]{1, 2, 3});

}

public static void printMax( double... numbers) {

if (numbers.length == 0) {

System.out.println("No argument passed");

return;

}

double result = numbers[0];

for (int i = 1; i < numbers.length; i++){

if (numbers[i] > result) {

result = numbers[i];

}

}

System.out.println("The max value is " + result);

}

}

以上实例编译运行结果如下:

The max value is 56.5

The max value is 3.0

finalize() 方法

Java 允许定义这样的方法,它在对象被垃圾收集器析构(回收)之前调用,这个方法叫做 finalize( ),它用来清除回收对象。

例如,你可以使用 finalize() 来确保一个对象打开的文件被关闭了。

在 finalize() 方法里,你必须指定在对象销毁时候要执行的操作。

finalize() 一般格式是:

protected void finalize()

{

// 在这里终结代码

}

关键字 protected 是一个限定符,它确保 finalize() 方法不会被该类以外的代码调用。

当然,Java 的内存回收可以由 JVM 来自动完成。如果你手动使用,则可以使用上面的方法。

实例

FinalizationDemo.java 文件代码:

public class FinalizationDemo {

public static void main(String[] args) {

Cake c1 = new Cake(1);

Cake c2 = new Cake(2);

Cake c3 = new Cake(3);

c2 = c3 = null;

System.gc(); //调用Java垃圾收集器

}

}

class Cake extends Object {

private int id;

public Cake(int id) {

this.id = id;

System.out.println("Cake Object " + id + "is created");

}

protected void finalize() throws java.lang.Throwable {

super.finalize();

System.out.println("Cake Object " + id + "is disposed");

}

}

运行以上代码,输出结果如下:

$ javac FinalizationDemo.java

$ java FinalizationDemo

Cake Object 1is created

Cake Object 2is created

Cake Object 3is created

Cake Object 3is disposed

Cake Object 2is disposed

java 方法_Java 方法 | 菜鸟教程相关推荐

  1. java 可变参数方法_Java方法中的参数太多,第7部分:可变状态

    java 可变参数方法 在我的系列文章的第七篇中,有关解决Java方法或构造函数中过多参数的问题 ,我着眼于使用状态来减少传递参数的需要. 我等到本系列的第七篇文章来解决这个问题的原因之一是,它是我最 ...

  2. java方法_Java方法

    java方法 Java is an Object Oriented Programming language. Java Methods are defined in the class and th ...

  3. java 覆盖_Java 方法覆盖

    方法覆盖 1.什么时候考虑使用覆盖? 子类继承父类之后,当继承过来的方法无法满足当前子类的业务需求时, 子类有权利对这个方法进行重新编写,有必要进行"方法的覆盖" 方法覆盖又叫做: ...

  4. 0基础java语法_Java零基础教程(二)基础语法

    Java 基础语法 一个 Java 程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作.下面简要介绍下类.对象.方法和实例变量的概念. 对象:对象是类的一个实例,有状态和行为.例如 ...

  5. java做法_Java方法

    方法包含一个方法头和一个方法体.下面是一个方法的所有部分: 1.修饰符:暂时写成public static.修饰符,这是可选的,告诉编译器如何调用该方法.定义了该方法的访问类型. 2.返回值类型 :方 ...

  6. java题编写一个方法_Java方法面向对象习题

    1.编写一个无参方法,输出Hello. package Dongruan; public class ktlx1 { public static void main(String[] args) { ...

  7. java 建模_Java设计模式菜鸟系列(两)建模与观察者模式的实现

    观察者(Observer)模式定义:在对象之间定义了一对多的依赖关系,这样一来.当一个对象改变状态时,依赖它的对象都会收到通知并自己主动跟新.Java已经提供了对观察者Observer模式的默认实现, ...

  8. java数组定义便利,java数组的定义(菜鸟教程)

    数组 数组有两种定义形式. 数组的定义: 这一种形式使用的频率高,推荐使用. int[] ints={1,2,3}; 第二种形式(容易使人混淆因为在开发中可能把这个看成一个数组类型而不是变量名) in ...

  9. Java 8 新特性-菜鸟教程 (7) -Java 8 Nashorn JavaScript

    Java 8 Nashorn JavaScript Nashorn 一个 javascript 引擎. 从JDK 1.8开始,Nashorn取代Rhino(JDK 1.6, JDK1.7)成为Java ...

最新文章

  1. each(callback)与each(object[,callback])的区别
  2. 第二章: 第二课 内容处理-插入图片
  3. 天津理工大学 计算机网络综合实验,天津理工大学计算机网络 实验二
  4. java实现人脸识别V3版本开发
  5. 有关正则表达式的一些用法总结
  6. Lync2010服务器的高可用性部署测试
  7. 按键编码ASCII对照表
  8. WebService的简单实现
  9. dijikstra 旅行商问题_车辆路径问题与算法
  10. 抖音神器---python实现图片转字符
  11. 【Photoshop 教程系列第 3 篇】如何在 PS 中修改图片的分辨率和大小(一步一步详细说明)
  12. linux在123目录下找文件,linux在当前目录下根据文件名查找文件
  13. 迅捷fw310uh驱动下载_迅捷FW150UH驱动程序官方版
  14. 【Unity使用UGUI实现王者荣耀UI界面(四)】游戏开始界面
  15. mysql 1032错误_如何快速解决MySQL 1032 主从错误
  16. jquery 将下拉框重置_select下拉框之默认选项清空
  17. (附源码)计算机毕业设计SSM大学生互动交流论坛
  18. IDEA中MAVEN项目如何打包JAR包
  19. 游戏反外挂技术首次公开
  20. 漫反射体各向同性和朗伯体遵循余弦定律之间矛盾吗?

热门文章

  1. yeoman、bower、grunt 开发收集
  2. 宕昌一中2021高考成绩查询,2020届毕业生:宕昌一中“拍了拍”你 | 青春不散场 扬帆再起航...
  3. java 动态加载ztree_JAVAEE——BOS物流项目02:学习计划、动态添加选项卡、ztree、项目底层代码构建...
  4. python可以做哪些小工具_用Python写过哪些「脑洞大开」的小工具?
  5. lambda函数if_Python中lambda的使用,与它的三个好基友介绍
  6. nyoj8-一种排序
  7. 洛谷P1074 靶形数独 [搜索]
  8. (五)cobbler自定义系统安装
  9. 软件测试 第三次作业
  10. 烟花散尽漫说无(參考资料)