前言
JVM
- JVM(Java Virtual Machine), Java虚拟机
- JVM 是 java 平台无关性实现的关键 (java程序在不同的平台上运行,因为有虚拟机所以不需要重新编译)
JDK
- JDK (Java Development Kit), Java 语言的软件开发工具包.
- 两个主要组件
- javac 编译器,将源代码转为字节码
- java 运行编译后的java程序(.class后缀的)
JRE
- JRE (Java Runtime Environment)
- 包括 Java 虚拟机(JVM), Java核心类库和支持文件
- 如果只需要运行 Java 程序,下载并安装 JRE 即可
- 如果要开发 Java 软件,需要下载 JDK
- 在 JDK 中附带有 JRE
JVM JDK JRE 之间的关系
- JRE = JVM + JavaSE 标准类库
- JDK = JRE + 开发工具集(例如 javac 编译工具等)
Java 平台
- Java SE (桌面程序) Java标准版
- Java EE (Web程序) Java企业版
- Java ME (移动设备) Java微型版 (随着安卓和ios的发展,现在用的很少.)
一、基本语法
1. java的常量与变量
1. 标识符
- 例如类名就是 标识符
- 标识符可以由字母,数字,下划线(_) 和美元符($) 组成,不能以数字开头
- 标识符是严格区分大小写的
- 标识符不能是java关键字和保留字
- 标识符的命名最好能反映出其作用
2. 关键字
abstract | boolean | break | byte | case | catch |
char | class | continue | default | do | double |
else | extends | false | final | finally | float |
for | if | implements | import | native | int |
interface | long | instanceof | new | null | package |
private | protect | public | return | short | static |
super | switch | synchronized | this | throw | throws |
transient | true | try | void | volatile | while |
3. 什么是变量
-
什么是变量
变量的三个元素: 变量类型,变量名和变量值. -
变量名的命名规则
2.1 满足标识符的命名规则
2.2 符合驼峰法命名规则 (如果是一个单词,都小写.如果是由多个单词组成,则第一个单词小写,其他单词的首字母大写!)
2.3 尽量简单,做到见名知意
2.4 变量名的长度没有限制 -
类的命名规则
3.1 满足 Pascal命名发规范 (如果是一个单词,首字母大写.如果是由多个单词组成,则所有单词的首字母大写!)
4. 基本数据类型
5. 基本数据类型详解
6. 整型字面值及变量声明
-
Java 中有三种表示整数的方法: 十进制, 八进制, 十六进制.
-
八进制: 以0开头,包括0-7的数字, 如 037, 056
-
十六进制: 以 0x或者OX开头,包括0-9的数字,及字母a-f, A-F (a表示10,以此类推), 如 0x12, 0xabcf, 0XABCFF
-
变量声明的格式: 数据类型 变量名
-
赋值: 使用"=" 运算符进行赋值 , “=” 叫做赋值运算符,将运算符右边的值赋给左边的变量.
7. 浮点型字面量
- 浮点型字面值默认情况下表示 double 类型,也可以在值后加 d或者D. 如 123.32d 或 123.32D
- 如想要表示 float 类型, 则需要在字面值后加 f 或 F. 如 23.4f 或 23.4F
定义一个单精度浮点型变量
float f = 1234.328f;
定义一个双精度浮点型变量
double d = 5623.345;
// 或者
double d = 5623.345d;
double d = 5623.345D;
8. 基本数据类型变量的存储
-
数据类型分为基本数据类型和引用数据类型
-
引用数据类型包括数组和类等
-
类定义的变量又叫对象
-
按照作用范围分为: 类级,对象实例级,方法级,块级.
9. 字符型字面值
- 字符型字面值用单引号内的单个字符表示.(只能有一个字符)
- 如: ‘a’, ‘b’, ‘$’
- 定义字符型变量: char a=‘a’ / char b = 65 (65对应ascii码表是 ‘A’)
10. ASCII 码
- ASCII (American Standard Code for Information Interchange, 美国标准信息交换代码)
- 基于拉丁字母的一套电脑编码系统
- 主要用于显示现代英语和其他西欧语言 (没有中文!)
- 使用 7位或8位二进制组合来表示128或256中可能的字符
- 7位二进制数组合 => 标准ASCII 码 (表示大小写字母,标点符号,美式英语中的控制字符等)
- 8位二进制数组合(后128位) => 扩展ASCII码 (表示特殊符号,外来语言的字母等)
11. Unicode 编码
- 由于 ASCII 码无法实现中文等很多其他国家的语言,后续就有了 Unicode 编码标准.
- unicode 编码又称为统一码,万国码
- Unicode 编码的目标是支持世界上所有的字符集
- char c = ‘\u055d’ ;
- Unicode表示法,在值前加前缀 \u
12. 布尔类型字面值
- 布尔值只能定义为 true 和 false
- 例: boolean b = true;
13. 字符串字面值
- 字符串不属于基本数据类型,它是类!
- 双引号引起来的0个或多个字符.
- String s = “abcdefg”;
14. 变量综合案例
- 转义字符
转义字符 | 描述 |
---|---|
\uxxxx | 四位16进制数所表示的字符 |
’ | 单引号字符 |
" | 双引号字符 |
\ | 反斜杠字符 |
\r | 回车 |
\n | 换行 |
\t | 横向跳格 |
\b | 退格 |
- 用科学计数法表示浮点数数据
- double d = 1.23E5; (表示 1.23*10的5次方)
- float f = 1.23e5f; (e 大小写都可)
- double d1 = .2; (表示 0.2)
15. 类型转换
- 类型转换分为自动类型转换和强制类型转换
-
自动类型转换 (又叫 隐式类型转换)
上述图片中, 实线表示的是 无信息丢失的数据类型转换, 虚线是可能在转换时,出现精度丢失! -
强制类型转换
- 如果A类型表示的范围比B类型大,则将A类型的值赋值给B类型,需要强制类型转换.
- 如: double d=123.4; float f=(float)d;
- 强制数据类型转换的格式: (数据类型) 数值
16. 数据类型转换案例
public static void main(String[] args) {
// char类型和int类型之间的转换
char c = (char) 65536;
int n;
n = c; // 隐式类型转换 char < int
c = (char) n;
// 整型和浮点型的类型转换问题
int x = 100;
long y = x; // 隐式转换, int < long
x = (int)y;
float f = 10000000000000L; //精度丢失
System.out.println(f); //精度丢失
}
17. 常量
- final int N = 5;
- 常量值一旦定义,就不允许被修改
- 常量值的字面量一般都是 大写字母来表示.
public static void main(String[] args) {
int m = 5;
final int N = 6;
m = 10;
// n = 10; //常量不允许别修改
final double PI = 3.14159;
final double MIN_VALUE = 0;
}
2.java运算符
1. 表达式
- 表达式由运算符和操作数组成
例如: sum = num1 + num2
2. 运算符
描述 | 运算符 |
---|---|
算术运算符 | +,-,*,/,%,++,– |
赋值运算符 | =,+=,-=,*=,/=,%= |
关系运算符 | ==, !, <, <=, >, >= |
逻辑运算符 | !, &, &&, |, || |
条件运算符 | ?: |
3. 赋值运算符
- 格式: 变量 = 表达式 ;
例如: int n = 3; // 将3赋值给变量n
注意: 赋值运算符是从右往左运算!
运算符 | 表达式 | 计算 | 结果(假设x=15) |
---|---|---|---|
+= | x += 5 | x = x + 5 | 20 |
-= | x -= 5 | x = x - 5 | 10 |
*= | x *= 5 | x = x * 5 | 75 |
/= | x /= 5 | x = x / 5 | 3 |
%= | x %= 5 | x = x%5 | 0 |
4. 自增自减运算符
++ | 自增1 | int n=3; n++ |
– | 自减1 | int n=4; ++n |
表达式 | 执行方式 | 结果(num1=1) |
---|---|---|
num2=++num1 | num1=num1+1; num2=num1; | num1=2;num2=2; |
num2=num1++ | num2=num1; num1=num1+1; | num1=2;num2=1; |
num2=–num1 | num1=num-1; num2=num1; | num1=0; num2=0; |
num2=num1–; | num2=num1; num1=num1-1; | num1=0; num2=1; |
5. 算术运算符
- 算术运算符主要用于基本的算术运算, 如 加法,减法,乘法和除法等.
算术运算符 | 名称 | 举例 |
---|---|---|
+ | 加法 | 5+10=15 |
- | 减法 | 10-5=5 |
* | 乘法 | 3*6=18 |
/ | 除法 | 36/4=9 |
% | 求余数 | 13%3=1 |
++ | 自增1 | int n=3; n++ |
– | 自减1 | int n=4; --n |
6. 关系运算符
- 比较运算符用于判断两个数组的大小,如 大于, 小于, 等于, 不大于, 不小于 等
- 比较的结果是 一个布尔值
运算符 | 名称 | 表达式 | 结果 |
---|---|---|---|
> | 大于 | 5>3 | true |
< | 小于 | 5<3 | false |
>= | 大于等于 | 5>=3 | true |
<= | 小于等于 | 5 <= 3 | false |
== | 等于 | 5==3 | false |
!= | 不等于 | 5 != 3 | true |
7. if条件结构
- if 后面如果只有一条语句,可以省略大括号! 如果是多条,则不能省略.
if(条件){
<语句块>
}
8. if-else条件结构
if(条件){
<语句块>
}else{
<语句块>
}
9. 逻辑与运算符介绍
-
逻辑运算符用来连接一个或多个条件, 判断这些条件是否成立
-
逻辑运算符的结果是布尔类型
-
|| 运算符又叫 短路运算符,如果第一个表达式的值就能决定表达式最后的结果,运算符右边的表达式就不再计算了.
名称 | 运算符 | 表达式 |
---|---|---|
与 | &&或& | operator1&&operator2 |
或 | ||或| | operator1 || operator2 |
非 | ! | !operator |
10. 逻辑"非"运算符及案例
- ! 运算符
- 对原条件进行取反
- 例如: !(3<5), 结果为 false
11. 条件运算符
- Java 中的条件运算符是 三目运算符
- 语法: 布尔表达式 ? 表达式1 : 表示式2
- 当布尔表达式的值为 true, 则返回表达式1的值, 否则返回表达式2的值
int a=10,b=7;
int max;
max = a>b?a:b;
12. 运算符的优先级
- 下表,从上到下, 优先级越来越小
运算符 | 秒速 |
---|---|
() | 圆括号 |
!,++,– | 逻辑非,自增,自减 |
*,/,% | 乘法,除法,取余 |
+,- | 加法,减法 |
<,<=,>,>= | 小于,小于等于,大于,大于等于 |
==, != | 等于,不等于 |
&& | 逻辑与 |
|| | 逻辑或 |
=,+=,*=,/=,%=,-= | 赋值运算符,复合赋值运算符 |
13. 闰年问题案例
package com.imooc.operator;
import java.util.Scanner;
public class LeapYearDemo {
public static void main(String[] args) {
// 闰年 能被4整除,但是不能被100整除。或者可以被400整除。
System.out.println("请输入年份:");
Scanner sc = new Scanner(System.in);
int year = sc.nextInt();
if (((year % 4 == 0) & (year % 100 != 0)) | year % 400 == 0) {
System.out.println(year + "是闰年!");
} else {
System.out.println(year + "不是闰年!");
}
}
}
3.java流程控制之选择控制
1. 流程控制概述
- 三大流程控制语句: 顺序,选择,循环
- 顺序结构: 从上往下依次执行
- 选择结构: 根据条件执行对应的内容
2. 多重if结构
if(表达式一){
语句1;
}else if(表达式二){
语句2;
}else if(表达式三){
语句3;
}...
else{
语句n;
}
3. 嵌套if结构
if(表达式一)
if(表达式二)
if(表达式三)
语句;
else
语句;
4. switch结构简介
- 判断条件是常量值
switch(表达式){
case 常量表达式1:
语句1;
break;
case 常量表达式2:
语句2;
break;
...
default:
语句n;
}
- JDK 7.0以后表达式的值可以是基本数据类型的 byte, short, int, char ,以及 String 类型.
5. 星期的表示案例及总结
package com.imooc.flow;
import java.util.Scanner;
public class WeekDemo1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
switch (n) {
case 1:
System.out.println("星期一");
break;
case 2:
System.out.println("星期二");
break;
case 3:
System.out.println("星期三");
break;
case 4:
System.out.println("星期四");
break;
case 5:
System.out.println("星期五");
break;
case 6:
System.out.println("星期六");
break;
case 7:
System.out.println("星期七");
break;
default:
System.out.println("该数字超出了1-7的范围!");
}
}
}
4.java流程控制之循环结构
1. 循环结构概述
- while 循环
- do-while 循环
- for 循环
- 循环嵌套
- break语句
- continue 语句
2. while循环
- 语法结构
while(循环条件)
{
语句;
}
- 执行流程: 打印小于5的所有值.
int n=1;
while(n<5)
{
//输出n的值
n++;
}
上述代码注意点:
- n 的值必须先进行初始化.
- 循环变量 n 的值必须被改变.
3. 案例:循环输出英文字母
package com.imooc.flow1;
public class CharDemo {
public static void main(String[] args) {
// 循环输出26个英文小写字母,分两行输出
char ch = 'a';
int count = 1; // 控制循环
while (ch <= 'z') {
System.out.print(ch+" ");
if(count%13 == 0) {
System.out.println();
}
count++;
ch++;
}
}
}
4. do-while循环介绍及应用
- 语法格式
do
{
语句;
}while(循环条件);
注意事项:
- do-while 循环至少执行一次
- 循环条件后的分号不能丢
例题如下
int n=1;
do
{
//输出n的值
n++;
}while(n<5);
5. 案例:猜字游戏
package com.imooc.flow1;
import java.util.Scanner;
public class GuessDemo {
public static void main(String[] args) {
// 设置要猜的数
int number = (int) (Math.random() * 10 + 1); // use random to get a number from 1 to 10
int guess;
System.out.println("guess a number from 1 to 10");
do {
System.out.println("guess a number");
Scanner sc = new Scanner(System.in);
guess = sc.nextInt();
if (guess > number) {
System.out.println("too big");
} else if (guess < number) {
System.out.println("too small");
}
} while (number != guess);
System.out.println("get it! " + number);
}
}
6. for循环
- 语法格式
for(表达式1; 表达式2; 表达式3)
{
语句;
}
for(int n=1; n<5; n++)
{
//输出语句;
}
- 注意: for循环的大括号里面如果只有一条语句,则大括号可以省略,反之不能.
7. for循环的注意事项
- for 循环中的 小括号里面有 3个表达式,都是可以省略的.
8. 嵌套循环
- 求 1! + 2! + 3! + … + 10!
package com.imooc.flow1;
public class JieChenPlus {
public static void main(String[] args) {
// 求 1!+2!+...10!
int s = 1, sum = 0;
for (int i = 1; i <= 10; i++) {
s = 1;
for (int j = 1; j <= i; j++) {
s = s * j; // s存放阶乘计算的结果
}
sum = sum + s;
}
System.out.println("1!+2!+...10!=" + sum);
}
}
9. 嵌套while循环应用
while(循环条件)
{
......
while(循环条件)
{
......
}
......
}
package com.imooc.flow1;
public class StarDemo1 {
public static void main(String[] args) {
// 使用嵌套 while 循环输出10行10列的星号
int i = 1, j = 1;
while (i <= 10) {
j = 1;
while (j <= i) {
System.out.print("*");
j++;
}
System.out.println();
i++;
}
}
}
10. break语句
- break 语句可以结束当前循环的执行
- 执行完 break 语句后,循环体中位于 break 语句后面的语句就不会被执行了
- 在多重循环中,break 语句只会向外跳一层
11. continue语句
- continue 语句只能用在循环里
- continue 语句可以结束当前循环的执行, 但是要继续下一次循环的执行
例: 1+3+5+7+9
public static void main(String[] args){
int sum=0;
for(int i=1;i<=9;i++){
if(i%2 == 0) continue;
sum = sum + i;
}
System.out.println("sum=" + sum);
}
12. debug入门
调试的作用:
让程序员能看清程序每一步的效果, 在需要查看结果的时候,使用 debug 查看实际结果是否与预期结果一致.
步骤:
- 设置断点
- 执行调试
- 进行单步调试
- Step Into / F5 跳转到方法内部
- Step Over / F6 一步一步执行
- Step Return / F7 从方法内部跳出
13. debug-多断点调试
新的快捷键
- Resume / F8 跳到下一个断点处
5.Java数组
1. 数组的概念
- 数组是相同类型的数据按顺序组成的一种引用数据类型
2. 数组的声明
- 语法格式 (2种方式):
数据类型[] 数组名; (第一种形式 推荐!)
数据类型 数据名[]; (第二种形式 )
3. 数组的创建
- 语法格式一: 先声明后创建
数据类型[] 数据名;
数据名 = new 数据类型[数组长度];
int[] arr;
arr = new int[10];
- 语法格式二: 声明的同时创建数组
数据类型[] 数据名 = new 数据类型[数组长度]
int[] arr = new int[10];
注意:
- 数组长度是必须指定的.
4. 数组在内存中的存储
- 数组会被分配连续的内存空间
5. 数组的初始化
- 声明数组的同时给数组赋值, 叫做数组的初始化.
- 用的是大括号
int[] arr = {1,2,3,4,5,6,7,8,9,10};
- 数组的长度就是初始化时所给数组元素的个数
6. 数组元素的引用
- 语法格式:
- 数组名[下标]
- 注意: 下标从0开始
7. 数组的长度
- int[] a = {1,2,3,4,5,6,7,8,9,10};
- 属性 length 表示数组的长度, 如 a.length
8. 数组例子
package com.imooc.array;
public class ArrayDemo {
public static void main(String[] args) {
// 声明一个整形数组
int[] intArray;
// 声明一个字符串型的数组
String strArray[];
// 创建数组
intArray = new int[5];
strArray = new String[10];
// 声明数组的同时进行创建
float[] floatArray = new float[4];
// 初始化数组
char[] ch = { 'a', 'b', 'c', 'd' };
System.out.println("数组的长度为:" + ch.length);
System.out.println("intArray数组的第2个元素为: " + intArray[1]);
System.out.println("strArray数组的第5个元素为: " + strArray[4]);
System.out.println("floatArray数组的第3个元素为: " + floatArray[2]);
System.out.println("ch数组的的第2个元素为: " + ch[1]);
// 循环为整型数赋值
for (int i = 0; i < 5; i++) {
intArray[i] = i + 1;
}
// 循环输出整型数组中的元素
for (int i = 0; i < intArray.length; i++) {
System.out.print(intArray[i] + " ");
}
}
}
9. 案例:求数组元素的累加和
package com.imooc.array;
import java.util.Scanner;
public class ArrayDemo1 {
public static void main(String[] args) {
// 请整型数据的累加和
// 定义整型数组
int[] a = new int[5];
Scanner sc = new Scanner(System.in);
// 从键盘接受数据,为数组元素赋值
for (int i = 0; i < a.length; i++) {
System.out.println("请输入第" + (i + 1) + "个元素:");
a[i] = sc.nextInt();
}
System.out.println();
System.out.println("使用增强型for循环输出数组内容: ");
for (int n : a) {
System.out.print(n + " ");
}
System.out.println();
System.out.println("数组元素的内容为:");
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
System.out.println();
// 求数组元素的累加和
int sum = 0;
for (int i = 0; i < a.length; i++) {
sum += a[i];
}
System.out.println("数组元素的累加和为:" + sum);
}
}
10. 案例:求数组元素的最大值
package com.imooc.array;
public class ArrayDemo2 {
public static void main(String[] args) {
// 求数组元素的最大值
int[] a = { 34, 23, 45, 45, 21 };
int max = a[0];
for (int i = 1; i < a.length; i++) {
if (max < a[i]) {
max = a[i];
}
}
System.out.println("最大值为:" + max);
}
}
11. 增强型for循环
- 又叫 foreach 循环
- foreach 循环应用
int[] arr = {1,2,3,4,5};
for(int n:arr)
{
System.out.println(n);
}
12. 如何对变量 a,b 的值进行交换
int a=3,b=5;
int temp;
temp=a;a=b;b=temp;
6.java方法
1. 方法简介
- 所谓方法,就是用来解决一类问题的代码的有序组合,是一个功能模块.
- 语法格式
访问修饰符 返回类型 方法名(参数列表){
方法体
}
- 根据方法是否带参数,是否有返回值,可分为四类
- 无参无返回值方法
- 无参带返回值方法
- 带参无返回值方法
- 带参带返回值方法
2. 无参无返回值方法
package com.imooc.method;
public class MethodDemo {
// 打印输出星号的方法
public void printStar() {
System.out.println("**********");
System.out.println("1java1");
System.out.println("**********");
}
public static void main(String[] args) {
// 创建一个 MethodDemo 类的对象 myMethodDemo
MethodDemo myMethodDemo = new MethodDemo();
// 对象名.方法名() 去调用方法
myMethodDemo.printStar();
}
}
3. 无参有返回值方法
package com.imooc.method;
public class Rectangle {
// 求长方形面积的方法
public int area() {
int length = 10;
int width = 5;
int getArea = length * width;
return getArea; // 返回语句
}
public static void main(String[] args) {
// 调用方法
Rectangle myRectangle = new Rectangle();
int area = myRectangle.area();
System.out.println(area);
}
}
4. 有参无返回值方法
package com.imooc.method;
public class MaxDemo {
// 求最大值的方法
public void max(float a, float b) {
float max;
if (a > b) {
max = a;
} else {
max = b;
}
System.out.println("2个数最大的是" + max);
}
// 求最大值的方法
public void max(double a, double b) {
double max;
if (a > b) {
max = a;
} else {
max = b;
}
System.out.println("2个数最大的是" + max);
}
public static void main(String[] args) {
MaxDemo myMaxDemo = new MaxDemo();
myMaxDemo.max(1.2, 21.3);
}
}
5. 有参有返回值的方法
package com.imooc.method;
public class FacDemo {
// 求阶乘的方法
public int fac(int n) {
int s = 1;
for (int i = 1; i <= n; i++) {
s *= i;
}
return s;
}
public static void main(String[] args) {
FacDemo myFacDemo = new FacDemo();
int fac = myFacDemo.fac(3);
System.out.println("3!=" + fac);
int sum = 0;
// 求 1!+2!+3!+4!+5!
for (int i = 1; i <= 5; i++) {
fac = myFacDemo.fac(i);
sum += fac;
}
System.out.println("1!+2!+3!+4!+5!=" + sum);
}
}
6. 数组作为方法参数(上)
package com.imooc.method;
public class ArrayMethod {
// 打印输出数组元素的值
public void printArray(int[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
System.out.println();
}
public static void main(String[] args) {
int[] arr = { 10, 20, 30, 40, 50 };
ArrayMethod am = new ArrayMethod();
am.printArray(arr);
}
}
7. 数组作为方法参数(下)
package com.imooc.method;
import java.util.Scanner;
public class ArraySearch {
// 查找数组元素值的方法
public boolean search(int n, int[] arr) {
boolean flag = false; // 默认是没有找到
for (int i = 0; i < arr.length; i++) {
if (arr[i] == n) {
flag = true;
break;
}
}
return flag;
}
public static void main(String[] args) {
int[] arr1 = { 10, 20, 30, 40, 50 };
Scanner sc = new Scanner(System.in);
int n1 = sc.nextInt();
ArraySearch myArraySearch = new ArraySearch();
boolean b1 = myArraySearch.search(n1, arr1);
if (b1) {
System.out.println("ok");
} else {
System.out.println("no");
}
}
}
8. 方法重载
- 方法名相同,参数列表不同
package com.imooc.method;
public class MathDemo {
// 求2个int类型数的和
public int plus(int m, int n) {
return m + n;
}
// 求2个double类型数的和
public double plus(double m, double n) {
return m + n;
}
// 求数组元素的累加和
public int plus(int[] arr) {
int sum = 0;
for (int i = 0; i < arr.length; i++) {
sum = sum + arr[i];
}
return sum;
}
public static void main(String[] args) {
int m = 5, n = 10;
int[] arr = { 1, 2, 3, 4, 5, 6 };
MathDemo mathDemo = new MathDemo();
System.out.println(mathDemo.plus(1, 2));
System.out.println(mathDemo.plus(1.1, 2.2));
System.out.println(mathDemo.plus(arr));
}
}
9. 方法的传值问题
-
基本数据类型的传值
方法中对参数的修改,会对主方法中传来的数组产生影响. -
引用数据类型的传值
方法中对数组的改变,会影响主方法中传来的数组 -
例: 对两个变量的值进行交换并打印输出.
package com.imooc.method;
public class ExchangeDemo {
// 交换方法
public void swap(int a, int b) {
int temp;
System.out.println("交换前:a=" + a + ",b=" + b);
temp = a;
a = b;
b = temp;
System.out.println("交换后:a=" + a + ",b=" + b);
}
public static void main(String[] args) {
int m = 4, n = 5;
ExchangeDemo ed = new ExchangeDemo();
ed.swap(m, n);
}
}
- 注意: 在主方法中调用其他自定义方法的时候,需要先实例化,然后再用实例去调用.而在类中的自定义方法中调用其他自定义方法,则可以直接调用,不需要实例化.
10. 数组的传值
package com.imooc.method;
public class ArrayDemo {
// 定义一个用于修改某个数组元素值的方法
public void updateArray(int[] a) {
a[3] = 15;
System.out.println("数组a的元素为:");
for (int n : a) {
System.out.print(n + " ");
}
System.out.println();
}
public static void main(String[] args) {
ArrayDemo ad = new ArrayDemo();
int[] a1 = { 1, 2, 3, 4, 5 };
System.out.println("方法调用前数组a1的元素为:");
for (int n : a1) {
System.out.print(n + " ");
}
System.out.println();
ad.updateArray(a1);
System.out.println("方法调用后数组a1的元素为:");
for (int n : a1) {
System.out.print(n + " ");
}
System.out.println();
}
}
- 数组传值的时候,修改数组的值,对原来的数据也产生了影响! 这个和之前普通变量传值并不同.
11. 可变参数列表
- 例: public void sum(int… n){}
package com.imooc.method;
public class ArgsDemo {
// 求和
public void sum(int... n) {
int sum = 0;
for (int i : n) {
sum += i;
}
System.out.println("sum=" + sum);
}
public static void main(String[] args) {
ArgsDemo ad = new ArgsDemo();
ad.sum(1);
ad.sum(1, 2);
ad.sum(1, 2, 3);
}
}
- 参数列表中如果有两个以上的参数,可变参数一定是在最后的.
package com.imooc.method;
public class ArgsDemo2 {
// 查找
public void search(int n, int... a) {
boolean flag = false;
for (int i : a) {
if (a[i] == n) {
flag = true;
break;
}
}
if (flag) {
System.out.println("find it");
} else {
System.out.println("find nothing");
}
}
public static void main(String[] args) {
ArgsDemo2 ad = new ArgsDemo2();
ad.search(3, 1, 2, 3, 4, 5);
int[] a = { 1, 2, 3, 4, 5 };
ad.search(2, a);
}
}
- 如上: 可以将数组传递给可变参数列表
- 一个方法中 只能有一个可变参数
12. 可变参数列表作为方法参数的重载问题
package com.imooc.method;
/**
* 关于可变参数列表和重载的问题
* @author zhangqiang
* @version 1.0
*
*/
public class ArgsDemo3 {
public int plus(int a, int b) {
System.out.println("不带可变参数的方法被调用!");
return a + b;
}
public int plus(int... a) {
int sum = 0;
for (int n : a) {
sum = sum + n;
}
System.out.println("带可变参数的方法被调用!");
return sum;
}
public static void main(String[] args) {
ArgsDemo3 ad = new ArgsDemo3();
ad.plus(1, 2);
}
}
- 结论: 可变参数列表所在的方法是最后被访问的!
13. 文档注释
/**
* 关于可变参数列表和重载的问题
* @author zhangqiang
* @version 1.0
*
*/