Java(9)Java方法
Java方法
Java 方法简介:
在前面几个章节中我们经常使用到
System.out.println()
,那么它是什么呢?
println()
是一个方法。System 是系统类。
out 是标准输出对象。
这句话的用法是调用系统类 System 中的标准输出对象 out 中的方法
println()
。
那么什么是方法呢?
- Java方法是语句的集合,它们在一起执行一个功能。
- 方法是解决一类问题的步骤的有序组合
- 方法包含于类或对象中
- 方法在程序中被创建,在其他地方被引用
方法的优点
-
使程序变得更简短而清晰。
-
有利于程序维护。
-
可以提高程序开发的效率。
-
提高了代码的重用性。
方法的命名规则
方法的名字的第一个单词应以小写字母作为开头,后面的单词则用大写字母开头写,不使用连接符。例如:addPerson
方法的定义:
修饰符 返回值类型 方法名(参数类型 参数名){
...
方法体
...
return 返回值;
}
方法的调用:
1、 当方法由返回值时,方法调用通常被当作一个值赋给变量,如:
`int large=max(30,40);`
2、 当方法没有返回值时,方法调用是一条语句
`System.out.println(“Hello world”);`
- 案例
public class HelloJimmy {
public static void main(String[] args) {
int maxNumber;
int a=30;
int b=40;
maxNumber=max(a,b);
System.out.printf("The max number is %d" ,maxNumber);
}
public static int max(int num1, int num2) {
int result;
if (num1>num2) {
result=num1;
}else {
result=num2;
}
return result;
}
}
//最终输出了The max number is 40
这个程序包含了main和max方法,max方法没有什么特别的,唯一不同地方在于main方法是被JVM调用的。
main 方法的头部是不变的,如例子所示,带修饰符 public 和 static,返回 void 类型值,方法名字是 main,此外带个一个 String[] 类型参数。String[] 表明参数是字符串数组。
修饰符:
修饰符,这是可选的,告诉编译器如何调用该方法。定义了该方法的访问类型。
返回值类型
方法返回值的类型,如果方法不返回任何值,则返回值类型指定为 void ;如果方法具有返回值,则需要指定返回值的类型,并且在方法体中使用 return 语句返回值
方法的参数传递方式
Java里方法的参数传递方式只有一种:值传递(pass by value), 所谓值传递,就是讲实际参数的影分身传入到方法内,而参数本身不会发生任何变化。
可以理解为你在画图工具上画了一个图,再复制一份,你对复制品的任何涂改不会影响之前原版的画。
1、 将八大基本数据类型作为传递的参数
- 以int类型为例子:
public class HelloJimmy {
public static void main(String[] args) {
int a = 40;
changeInt(a);
System.out.println(a);
}
public static void changeInt(int b) {
b=30;
}
}//输出了40,可以看到将a作为参数传入,main方法中的a值并未受到影响
2、 将引用数据类型作为传递的参数
- 以数组类型为例子
import java.util.Arrays;
public class HelloJimmy {
public static void main(String[] args) {
int[] a = { 23, 4, 5, 142 };
changeInt(a);
System.out.println(Arrays. toString (a));
}
public static void changeInt( int [] b) {
b[0] = 100;
}
}//输出结果为[100, 4, 5, 142],数组的内容受到了影响
不是说值传递吗,参数本身不会发生变化吗,为什么引用数据类型的值会受到影响?
首先我们来看一下Java的内存知识:
Java虚拟机在运行的时候时要开辟内存空间的,启动时在自己的内存区域中还要进行更细致的划分。
JVM内存的划分有5片:
1、寄存器
2、本地方法区
3、方法区
4、栈内存:栈的优势是,存取速度比堆要快,仅次于寄存器
栈 存储的都是局部变量,凡是定义在方法中的都是局部变量(方法之外的是全局变量),主要存放8大基本类型的变量。变量都有自己的作用域,一旦程序离开作用域,变量就会被释放。栈内存的更新速度很快,因为局部变量的生命周期都很短。
5、堆内存:存储的是数组和对象(其实数组就是对象 )
数组的父类也是Object, java中数组的创建使用了关键字new,凡是new建立的都是在堆中,堆中存放的都是实体(对象),实体用于封装数据,而且是封装多个(实体的多个属性),如果一个数据消失,这个实体也没有消失,还可以用,所以堆是不会随时释放的,但是栈不一样,栈里存放的都是单个变量,变量被释放了,那就没有了。堆里的实体虽然不会被释放,但是会被当成垃圾,Java有垃圾回收机制不定时的收取。
因此,根据Java内存机制,我们有图,数组对象存放在了堆里:
在上面数组作为参数传递的例子中,在方法中传递引用的时候,引用被复制了两份,因此a引用的对象会被修改,数组a本身的值受到了影响。
3、 将String这一特殊引用类型作为传递的参数
String是一种特殊的引用类型,作为参数传递时,实参的值不会受到影响。如:
public class HelloJimmy {
public static void main(String[] args) {
String str = "Hello world";
changeString(str);
System.out.println(str);
}
public static void changeString(String s) {
s = "Hello Krystal";
}
}//结果输出为Hello world
此时s和str引用的对象一样,都是“hello world”,但经过s = "Hello Krystal"
;操作后,由于字符串的不可变性,此时s会引用一个新对象,s指向”Hello Krystal”
的位置,s的hashcode值变化了,但str依旧引用着对象”Hello world”
。
可变参数
方法的可变参数声明如下:
typename...parametername//在指定类型后加一个省略号(...)
//一个方法中只能指定一个可变参数,它必须是方法的最后一个参数。任何普通的参数必须在它之前声明。
案例:
package test;
public class PrintMaxNumber {
public static void main(String[] args) {
ReturnMaxNumber a=new ReturnMaxNumber();
System.out.println(a.findM(12.5,23,45,7.8,3));
//结果输出了45.0
}
}
class ReturnMaxNumber{
public double findM(double...numbers){ //在类内写一个返回最大值的方法
double maxNunber=numbers[0];//初始化最大值为第一个数字
for (int i = 1; i < numbers.length; i++) {
if (maxNunber<numbers[i]){
maxNunber=numbers[i];
}
}
return maxNunber; //返回最终的最大值
}
}