1.Java简介
1.1什么是Java
简单地说,Java 是由 Sun Microsystems 公司于 1995 年推出的一门面向对象程序设计语言。2010 年 Oracle 公司收购 Sun Microsystems,之后由 Oracle 公司负责 Java 的维护和版本升级。Java 平台已经嵌入了几乎所有的操作系统。这样 Java 程序只编译一次,就可以在各种系统中运行。
Java最常用的版本是Java8.
1.2Java的特点
Java语言的风格与C语言、C++类似,但是Java是一门纯粹的面向对象语言,它在继承了C++的面向对象的特点之外,还摒弃了C++一些缺点,如指针和多继承等。Java还增加了垃圾回收机制,释放掉不被使用的内存空间,不需要我们手动释放内存。总之,Java有许多优良特性:
-
面向对象
Java 是一种面向对象的语言,它对对象中的类、对象、继承、封装、多态、接口、包等均有很好的支持。为了简单起见,Java 只支持类之间的单继承,但是可以使用接口来实现多继承。使用 Java 语言开发程序,需要采用面向对象的思想设计程序和编写代码。
-
平台无关性
平台无关性的具体表现在于,Java 是“一次编写,到处运行(Write Once,Run any Where)”的语言,因此采用 Java 语言编写的程序具有很好的可移植性,而保证这一点的正是 Java 的虚拟机机制。在引入虚拟机之后,Java 语言在不同的平台上运行不需要重新编译。
-
解释执行
Java 程序在 Java 平台运行时会被编译成字节码文件,然后可以在有 Java 环境的操作系统上运行。在运行文件时,Java 的解释器对这些字节码进行解释执行,执行过程中需要加入的类在连接阶段被载入到运行环境中。
-
多线程
Java 语言是多线程的,这也是 Java 语言的一大特性,它必须由 Thread 类和它的子类来创建。Java 支持多个线程同时执行,并提供多线程之间的同步机制。任何一个线程都有自己的 run() 方法,要执行的方法就写在 run() 方法体内。
-
分布式
Java 语言支持 Internet 应用的开发,在 Java 的基本应用编程接口中就有一个网络应用编程接口,它提供了网络应用编程的类库,包括 URL、URLConnection、Socket 等。Java 的 RIM 机制也是开发分布式应用的重要手段。
-
健壮性
Java 的强类型机制、异常处理、垃圾回收机制等都是 Java 健壮性的重要保证。对指针的丢弃是 Java 的一大进步。另外,Java 的异常机制也是健壮性的一大体现。
-
安全性高
Java 通常被用在网络环境中,为此,Java 提供了一个安全机制以防止恶意代码的攻击。除了 Java 语言具有许多的安全特性以外,Java 还对通过网络下载的类增加一个安全防范机制,分配不同的名字空间以防替代本地的同名类,并包含安全管理机制。
1.3JDK、JRE、JVM
-
JVM(Java Virtual Machine),Java虚拟机,java程序需要在jvm上运行
-
JRE(Java Runtime Environment),Java运行环境,包含了JVM和Java的核心类库(可供我们直接使用的代码)
-
JDK(Java Development Kit)称为Java开发工具,包含了JRE和开发工具
2.Java入门
2.1常用Dos命令
win + R 输入cmd进入Dos命令窗口,以下是常用的Dos命令
操作 | 说明 |
---|---|
盘符名称: | 盘符切换。E:回车,表示切换到E盘。 |
dir | 查看当前路径下的内容。 |
cd 目录 | 进入单级目录。cd java |
cd … | 回退到上一级目录。 |
cd 目录1\目录2… | 进入多级目录。cd java\JavaSE |
cd \ | 回退到盘符目录。 |
cls | 清屏。 |
exit | 退出命令提示符窗口。 |
2.2JDK下载及安装
首先我们需要下载 java 开发工具包 JDK,下载地址:https://www.oracle.com/java/technologies/downloads/,在下载页面中根据自己的系统选择对应的版本,傻瓜式安装点击下一步,安装时可以自定义安装目录,如E:\jdk\jdk1.8.0_241,同时也可以自定义JRE的目录
2.3Java环境变量的配置
打开高级程序设置,点击环境变量,在系统变量中新建变量名JAVA_HOME,路径选择JDK安装路径,如E:\jdk\jdk1.8.0_241,点击保存
点击path,在path中新建%JAVA_HOME%\bin和%%JAVA_HOME%\jre\bin,点击确定
2.4第一个程序HelloWorld
新建文本文档,在文件中书写如下代码,把文件命名为HelloWorld.java
public class HelloWorld {
public static void main(String[] args) {
System.out.println("HelloWorld");
}
}
打开Dos窗口,分别执行
javac HelloWorld.java //生成.class文件
java HelloWorld //运行HelloWorld.class文件
输出结果HelloWorld
3.注释、数据类型、标识符、关键字
3.1注释
注释是对代码的解释和说明,可以提高代码的可读性,注释中的内容不会被执行,注释包括以下三种
3.1.1.单行注释
单行注释的格式是使用//,从//开始至本行结尾的文字将作为注释的内容
例如:
//我写在双斜杠的后面,我是注释内容
3.1.2.多行注释
多行注释的格式是使用/* 和 */将一段较长的注释括起来,即使中间的内容有多行也不会出问题。
例如:
/*我是多行注释,虽然我只有一行*/
/*
_ooOoo_
o8888888o
88" . "88
(| -_- |)
O\ = /O
____/`---'\____
.' \\| |// `.
/ \\||| : |||// \
/ _||||| -:- |||||- \
| | \\\ - /// | |
| \_| ''\---/'' | |
\ .-\__ `-` ___/-. /
___`. .' /--.--\ `. . __
."" '< `.___\_<|>_/___.' >'"".
| | : `- \`.;`\ _ /`;.`/ - ` : | |
\ \ `-. \_ __\ /__ _/ .-` / /
======`-.____`-.___\_____/___.-`____.-'======
`=---='
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
佛祖保佑 永无BUG
佛曰:
写字楼里写字间,写字间里程序员;
程序人员写程序,又拿程序换酒钱。
酒醒只在网上坐,酒醉还来网下眠;
酒醉酒醒日复日,网上网下年复年。
但愿老死电脑间,不愿鞠躬老板前;
奔驰宝马贵者趣,公交自行程序员。
别人笑我忒疯癫,我笑自己命太贱;
不见满街漂亮妹,哪个归得程序员?
*/
3.1.3.文档注释
文档注释以/**
开始,以*/
结束。
/**
我是神秘的文档注释,
等你们学习了方法,我再让你看看我的强大。
*/
3.2数据类型
3.2.1基本数据类型
在Java基本数据类型中,整型默认为int,浮点型默认为double
数据类型 | 关键字 | 所占字节 | 范围 | 默认值 |
---|---|---|---|---|
整形 | byte | 1 | -27~27 - 1 | 0 |
short | 2 | -215~215- 1 | 0 | |
int | 4 | -231~231 - 1 | 0 | |
long | 8 | -263~263 - 1 | 0L | |
浮点型 | float | 4 | 0.0F | |
double | 8 | 0.0 | ||
布尔型 | boolean | 2 | true,false | false |
字符型 | char | 2 | \u0000-\uffff | ‘\u0000’与0 |
3.2.2引用数据类型
String类、集合以及各种类都是引用数据类型,在后续会详细介绍
3.3标识符
Java 所有的组成部分都需要名字。类名、变量名以及方法名都被称为标识符。在使用标识符时需要注意:
- 所有的标识符都应该以字母(A-Z 或者 a-z),$、或者 _ 开始
- 首字符之后可以是字母(A-Z 或者 a-z),$,_ 或数字的任何字符组合
- 关键字不能用作标识符
- 标识符是大小写敏感的
3.4关键字
Java中具有特殊含义的单词叫做关键字,这些关键字不能用作变量,关键字包括:
- 数据类型:byte、short、int、long、float、double、boolean、char、class、interface
- 流程控制:if、else、do、while、for、switch、case、default、break、continue、return、try、catch、finally
- 修饰符:public、protected、private、final、void、static、strict、abstract、transient、synchronized、volatile、native。
- 动作:package、import、throw、throws、extends、implements、this、supper、instanceof、new。
- 保留字:true、false、null、goto、const
4.常量和变量
4.1常量
常量就是一个确定的值,通过数据直接进行表示,包括整型、浮点型、字符型、布尔型。
4.1.1常量的定义
在Java中用关键字final来定义一个常量,用来表示一个不变的量,如
public class Demo {
// 静态常量
public static final int MIN_VALUE = 0x80000000;
public static final int MAX_VALUE = 0x7fffffff;
// 声明成员常量
final int y = 10;
public static void main(String[] args) {
// 声明局部常量
final double x = 3.3;
}
}
4.1.2常量的分类
如上述代码所示,常量分为三种
-
静态常量
在类中用static final修饰,无需创建对象就可使用,如用public修饰,在类外部可以通过类名.常量的方法使用
-
成员常量
在类中用final修饰
-
局部常量
在方法中final修饰,只能在方法内部使用
4.1.3使用常量的注意点
- 为了与变量进行区分,常量在使用时通常全大写;
- 常量在定义时就要初始化;
- final在修饰基本数据类型时表示是常量,在修饰类时表示该类不能继承
4.2变量
变量表示可以进行修改,在变量使用时要注意先声明后使用
4.2.1变量的声明及使用
int x;
x = 1;
double y = 3.14
String cxk = "练习时长两年半的个人练习生";
变量可以先声明后赋值,也可以在声明时直接进行赋值
4.2.2变量的分类
public class Demo {
// 静态变量
public static String cxk = "练习时长两年半的个人练习生";
// 声明全局常量
int y = 10;
}
4.2.2.1静态变量
在类中用static修饰,与静态常量相似,可通过Demo.cxk进行访问,无需创建对象
4.2.2.2全局变量
在类中可以直接使用,在类外通过创建对象的方式进行使用
4.2.2.3局部变量
public static void main(String[] args) {
for(int i = 0;i < 10;i++){
//局部变量
int x = 0;
System.out.println("唱,跳,rap,篮球")
}
String cxk = "练习时长两年半的个人练习生";
try {
int x = 10 / 0;
} catch (Exception e) {//局部代码块变量
e.printStackTrace();
} finally {
System.out.println("cxk");
}
}
-
方法形参变量
作为方法的参数变量使用,作用域是整个方法
-
方法内部变量
在方法内进行定义,在定义到方法结束的这一段时间有效
-
局部代码块变量
在局部代码块内进行定义,从定义这个变量开始到代码块结束这一段时间内有效。
5.运算符
计算机的最基本用途之一就是执行数学运算,作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量。我们可以把运算符按照数量分成单目运算符,双目运算符和三目运算符,最基本的运算符包括算术运算符、赋值运算符、逻辑运算符和关系运算符等
5.1运算符分类
5.1.1算数运算符
操作符 | 描述 | 例子 |
---|---|---|
+ | 加法 - 相加运算符两侧的值 | a+b |
- | 减法 - 左操作数减去右操作数 | a-b |
* | 乘法 - 相乘操作符两侧的值 | a*b |
/ | 除法 - 左操作数除以右操作 | a/b |
% | 取余 - 左操作数除以右操作数的余数 | a%b |
++ | 自增: 操作数的值增加1 | a++或++a |
– | 自减: 操作数的值减少1 | a–或–a |
public static void main(String[] args) {
int a = 2;
int b = 1;
System.out.println(a + b);
System.out.println(a - b);
System.out.println(a * b);
System.out.println(a / b);
System.out.println(a % b);
System.out.println(a++);//先运算再自增
System.out.println(++a);//先自增再运算
System.out.println(b--);//先运算再自减
System.out.println(--b);//先自减再运算
}
5.1.2关系运算符
运算符 | 描述 | 例子 |
---|---|---|
== | 检查如果两个操作数的值是否相等,如果相等则条件为真。 | a == b |
!= | 检查如果两个操作数的值是否相等,如果值不相等则条件为真。 | a != b |
> | 检查左操作数的值是否大于右操作数的值,如果是那么条件为真。 | a > b |
< | 检查左操作数的值是否小于右操作数的值,如果是那么条件为真。 | a < b |
>= | 检查左操作数的值是否大于或等于右操作数的值,如果是那么条件为真。 | a >= b |
<= | 检查左操作数的值是否小于或等于右操作数的值,如果是那么条件为真。 | a <= b |
public static void main(String[] args) {
int a = 2;
int b = 1;
System.out.println(a == b);//
System.out.println(a != b);
System.out.println(a > b);
System.out.println(a < b);
System.out.println(a >= b);
System.out.println( a <= b);
}
5.1.3位运算符
假设a = 60,b = 13;它们的二进制格式表示将如下:
a = 0011 1100
B = 0000 1101
-----------------
a&b = 0000 1100
a | B = 0011 1101
a ^ B = 0011 0001
~a= 1100 0011
操作符 | 描述 | 例子 |
---|---|---|
& | 按位与,如果相对应位都是1,则结果为1,否则为0 | (a&B),得到12,即0000 1100 |
| | 按位或如果相对应位都是 0,则结果为 0,否则为 1 | (a | B)得到61,即 0011 1101 |
^ | 如果相对应位值相同,则结果为0,否则为1 | (a ^ B)得到49,即 0011 0001 |
〜 | 按位取反运算符翻转操作数的每一位,即0变成1,1变成0。 | (〜a)得到-61,即1100 0011 |
<< | 按位左移运算符。左操作数按位左移右操作数指定的位数。 | a << 2得到240,即 1111 0000 |
>> | 按位右移运算符。左操作数按位右移右操作数指定的位数。 | a >> 2得到15即 1111 |
>>> | 按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。 | a>>>2得到15即0000 1111 |
public static void main(String[] args) {
int a = 60;
int b = 13;
System.out.println(a & b);//12
System.out.println(a | b);//61
System.out.println(a ^ b);//49
System.out.println(~a);//-61
System.out.println(a<<2);//240
System.out.println(a>>2);//15
System.out.println(a>>>2);//15
}
5.1.4逻辑运算符
若A = true,B = false
操作符 | 描述 | 例子 |
---|---|---|
&& | 逻辑与,当且仅当两个操作数都为真,条件才为真。 | (A && B)为假。 |
| | | 逻辑或,如果任何两个操作数任何一个为真,条件为真。 | (A | | B)为真。 |
! | 逻辑非,用来反转操作数的逻辑状态。如果条件为true,则逻辑非运算符将得到false。 | !(A && B)为真。 |
public static void main(String[] args) {
boolean a = true;
boolean b= false;
System.out.println(a && b);//false
System.out.println(a || b);//true
System.out.println(!a);//false
}
5.1.5赋值运算符
操作符 | 描述 | 例子 |
---|---|---|
= | 简单的赋值运算符,将右操作数的值赋给左侧操作数 | C = A + B将把A + B得到的值赋给C |
+ = | 加和赋值操作符,它把左操作数和右操作数相加赋值给左操作数 | C + = A等价于C = C + A |
- = | 减和赋值操作符,它把左操作数和右操作数相减赋值给左操作数 | C - = A等价于C = C - A |
* = | 乘和赋值操作符,它把左操作数和右操作数相乘赋值给左操作数 | C * = A等价于C = C * A |
/ = | 除和赋值操作符,它把左操作数和右操作数相除赋值给左操作数 | C / = A,C 与 A 同类型时等价于 C = C / A |
(%)= | 取模和赋值操作符,它把左操作数和右操作数取模后赋值给左操作数 | C%= A等价于C = C%A |
<< = | 左移位赋值运算符 | C << = 2等价于C = C << 2 |
>> = | 右移位赋值运算符 | C >> = 2等价于C = C >> 2 |
&= | 按位与赋值运算符 | C&= 2等价于C = C&2 |
^ = | 按位异或赋值操作符 | C ^ = 2等价于C = C ^ 2 |
| = | 按位或赋值操作符 | C | = 2等价于C = C | 2 |
5.1.6三目运算符
? :
该运算符有3个操作数,并且需要判断布尔表达式的值。该运算符的主要是决定哪个值应该赋值给变量。
int a = 2;
int b = 1;
int x = a == b ? a : b;//如果a == b为真,将a赋值给x,如果a == b为假,将b赋值给x
5.1.7 instanceof
该运算符用于操作对象实例,检查该对象是否是一个特定类型(类类型或接口类型)
public static void main(String[] args) {
String cxk = "练习时长两年半的个人练习生";
boolean iKun = cxk instanceof String;
System.out.println(iKun);
}
5.2运算符优先级
一般而言,单目运算符优先级较高,赋值运算符优先级较低。算术运算符优先级较高,关系和逻辑运算符优先级较低。多数运算符具有左结合性,单目运算符、三目运算符、赋值运算符具有右结合性。
优先级 | 运算符 | 结合性 |
---|---|---|
1 | ()、[]、{} | 从左向右 |
2 | !、+、-、~、++、– | 从右向左 |
3 | *、/、% | 从左向右 |
4 | +、- | 从左向右 |
5 | <<、>>、>>> | 从左向右 |
6 | <、<=、>、>=、instanceof | 从左向右 |
7 | ==、!= | 从左向右 |
8 | & | 从左向右 |
9 | ^ | 从左向右 |
10 | | | 从左向右 |
11 | && | 从左向右 |
12 | || | 从左向右 |
13 | ?: | 从右向左 |
14 | =、+=、-=、*=、/=、&=、|=、^=、~=、<=、>=、>>>= | 从右向左 |
6.流程控制语句
在Java中,我们需要对不同的情况进行不同的处理,此时我们就需要流程控制语句进行处理,流程控制语句分为if语句和switch语句
6.1if语句
6.1.1if
if即为条件判断语句,格式如下
if(布尔表达式){
//如果为true执行的操作
}
int a = 2;
int b = 2;
if(a == b){
System.out.println("你干嘛~~~");
}
6.1.2if else
if(布尔表达式){
//如果为true执行的操作
}else{
//如果为false执行的操作
}
int a = 2;
int b = 1;
if(a == b){
System.out.println("你干嘛~~~");
}else{
System.out.println("你好烦~~~");
}
6.1.3if else if else
if(布尔表达式1){
布尔表达式1为true时执行;
}else if(布尔表达式2){
布尔表达式2为true时执行;
}else if(布尔表达式3){
布尔表达式3为true时执行;
...
}else{
以上布尔表达式都为false时执行;
}
int a = 2;
int b = 1;
if(a == b){
System.out.println("你干嘛~~~");
}else if(a > b){
System.out.println("鸡你太美");
}else{
System.out.println("你好烦~~~");
}
注意:
一旦执行了一个大括号中的语句体,整个if语句就结束了.不可能出现执行两个语句体的情况.
如果大括号中的语句体只有一行代码的时候可以把大括号省略.但是建议永远不要省略
6.2switch语句
使用switch也可以根据判断不同的情况做不同的处理。
switch (表达式) {
case 值1:
语句体1;
break;//跳出
case 值2:
语句体2;
break;
case 值3:
语句体3;
break;
...
default:
语句体n+1;
break; // 最后一个break语句可以省略,但是推荐不要省略
}
switch语句从上到下依次执行,直到遇到与表达式值相等的case,此时将会执行case中的语句,如若遇不到则执行default
public class Test {
public static void main(String[] args) {
System.out.println("ikun等级考试,请输入1~5分成绩");
int score = 0;
boolean temp = true;
while (temp) {
Scanner scanner = new Scanner(System.in);
score = scanner.nextInt();
temp = false;
if (score > 5 || score < 0) {
System.out.println("您的输入有误,请重新输入");
temp = true;
}
}
test(score);
}
static void test(int score){
switch (score){
case 5 :
System.out.println("骨灰级ikun");
break;
case 4 :
System.out.println("真爱粉");
break;
case 3 :
System.out.println("漏出鸡脚");
break;
default:
System.out.println("小黑子");
break;
}
}
}
注意:
如果在case语句中不写break,则会造成case穿透的问题,使程序遇到符合条件的case后一直向下执行,直到遇到break或整个switch执行结束
default可以不写,但是最好写上
if适用于条件复杂的判断,switch适合个数确定的简单判断
7.循环结构
顺序结构的语句只能执行一次,而很多时候我们想重复执行一些语句,这时候就需要使用到循环结构了
循环结构分为以下三种
7.1for循环
for循环的结构如下所示,适用于循环次数确定的情况
for(初始化语句;布尔表达式语句;运算操作){
循环执行语句
}
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
System.out.println("小黑子你食不食油饼");
}
}
①先执行初始化语句,
②然后看布尔表达式的结果,
如果为false 循环结束,
如果为true 执行循环体.
③循环体执行完后执行步进语句.然后继续执行②判断布尔表达式的结果(PS:注意,不是初始化语句)
以此类推.
注意:
初始化语句,布尔表达式,运算操作之间用分号进行分隔,但是多个初始化语句和多个运算操作之间用逗号分隔,如
for(int i = 0,j = 1;i < 5;i++,j++){ System.out.println("cxk rap了" + j + "次"); }
for循环中括号内可以不进行各种操作,但是;不能省略
for(;;){ System.out.println("小黑子漏出鸡脚了吧"); }
小练习:
1.分别输出1-100和100-1
2.输出1-100的和
3.分别输出1-100内的所有奇数和偶数
7.2while循环
while循环的结构如下所示,适用于循环次数不确定的情况
while(布尔表达式){
循环执行语句;
}
int i = 0;
while(i < 5){
System.out.println(i + ".别发那些清朝老图了");
i++;
}
while循环在执行时,遵循以下规则
①看布尔表达式的结果
如果为false循环结束
如果为true,则执行循环体.
②循环体执行完后继续执行①以此类推
7.3do while
do while和while类似,格式如下,但基本不用
do{
循环执行语句;
}while(布尔表达式)
int i = 0;
do{
System.out.println(i);//0 1 2 ...5
}while(i <= 5)
do while在执行时,遵循以下流程
①执行循环体
②然后看布尔表达式的结果
如果为true则继续执行①循环体
如果判断表达式的结果为false则循环结束
以此类推
do while 与 while 的区别就是while先判断后执行,do while先执行再判断
7.4 break continue
在进行循环操作时,有时我们希望跳出某次循环或跳出当前循环,此时我们就需要使用到continue和break
7.4.1 continue
跳过本次循环,只能用在循环中
String cxk = "鸡你太美";
for(int i = 0;i < 10;i++){
if(cxk.length == 4){
System.out.println(i);//0 1 2 3 5 ...9
continue;
}
}
7.4.2 break
跳过当前循环,只能用于循环和switch语句中
String cxk = "鸡你太美";
for(int i = 0;i < 10;i++){
if(cxk.length == 4){
System.out.println(i);//0 1 2 3 4
break;
}
}
7.4.3 break跳转到指定标签
Java 提供了一种带标签的 break 语句,用于跳出多重嵌套的循环语句
String cxk = "鸡你太美";
tag:for(int i = 0;i < 10;i++){
for(int i = 0;i < 10;i++){
if(cxk.length == 4){
System.out.println(i);//0 1 2 3 4
break tag;
}
}
}
循环练习:
1.打印九九乘法表
2.用*打印一个等腰三角形,要求输入数字几,就能打印几层
//输入数字4
*
***
*****
*******
8.数组
当我们需要存储多个同种数据类型的数据时,一个变量一个变量来声明显然太麻烦了,所以此时我们需要使用数组来解决这个问题
8.1 数组的特点
-
数组只能保存相同类型的数据,可以是任意数据类型
-
数组中的数据是有序的,通过数组下标进行访问,数组的下标都是从0开始的
-
数组的内存空间的地址是连续的
-
数组一旦初始化,其长度就不能修改
8.2数组的声明和创建
int[] arr = new int[10];//动态初始化,适用于数组长度确定,但是值不确定的情况
int[] arr = new int[]{1,2,3,4};静态初始化,在声明时将值赋给数组
int[] arr = {1,2,3,4};//简单写法,推荐使用
8.3获取数组元素(遍历)
数组中的元素可以通过访问数组下标来获取
int[] arr = {1,2,3,4};
System.out.println(arr[2]);//获取单个元素
char[] str = {'小','黑','子','你','干','嘛'};
for (int i = 0; i < str.length; i++) {//获取全部元素
System.out.print(arr[i]);
}
//数组中的数据可以进行覆盖
arr[2] = 5;
8.4 For-Each 循环
JDK1.5 引进了一种新的循环类型,被称为 For-Each 循环或者加强型循环,它能在不使用下标的情况下遍历数组。
语法格式如下:
for(type element: array){
System.out.println(element);
}
//例:
char[] str = {'小','黑','子','你','干','嘛'};
for (char str1 : str) {//获取全部元素
System.out.print(str1);
}
8.5二维数组(多维数组)
多维数组可以看做数组的数组,以二维数组为例,可以把二维数组看做一个一维数组,其中每一个元素都是一个一维数组
8.5.1二维数组的声明和赋值
int[][] arr1 = new int[2][3];//直接为每一维分配空间,动态初始化
int[][] arr1 =new int[][]{{1,2,3},{4,5,6}};//静态初始化
String s[][] = new String[2][];//从最高维开始,为每一维分配空间
s[0] = new String[2];
s[1] = new String[3];
s[0][0] = new String("Good");
s[0][1] = new String("Luck");
s[1][0] = new String("to");
s[1][1] = new String("you");
s[1][2] = new String("!");
8.5.2二维数组的遍历
int[][] arr1 =new int[][]{{1,2,3},{4,5,6}};
for (int i = 0; i < arr1.length; i++) {
for (int j = 0; j < arr1[i].length; j++) {
System.out.println(arr1[i][j]);
}
}
练习:
1.定义一个长度为100的int数组,要求里面的元素分别为1,3,5,7,9…最后还要把数组里面的每个元素都打印出来
2.从键盘录入一个数组,要求使用代码对该数组进行从大到小的排序,输出排序后的结果
9.方法
为了解决某一类问题,我们需要学习方法,与C语言中的函数类似
9.1什么是方法
方法是封装的为了解决某一问题的语句集合,方法有以下优点
- 使程序变得更简短而清晰。
- 以提高程序开发的效率。
- 提高了代码的复用性,降低了程序的耦合度。
9.2方法的定义
修饰符 返回值类型 方法名(参数类型 参数名){
...
方法体
...
return 返回值;
}
//例:计算 0 ~ num 的和
public static int test(int num){
if(num > 0){
int sum = 0;
for(int i = 0;i <= num;i++){
sum += i;
}
return sum;
}else{
int sum = 0;
for(int i = 0;i <= num;i--){
sum += i;
}
return sum;
}
}
方法包含以下部分:
- 修饰符:这是可选的,告诉编译器如何调用该方法。定义了该方法的访问类型
- 返回值类型:方法可能会返回值,返回值要与返回值类型是一样的数据类型
- 方法名:方法的实际名称
- 形参列表:方法括号中定义的变量,方法可以没有形参
- 实参列表:调用方法时实际传入的值,与形参列表的数据类型一致
- 方法体:方法执行的语句,是具体解决问题的语句
9.3方法的调用
方法的调用可以分为有返回值的调用和无返回值的调用
无返回值的方法调用是一条语句,当方法返回一个值的时候,方法调用通常被当做一个值。
//
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;
}
/** 返回两个整数变量较大的值 */
public static void maxNum(int num1, int num2) {
int result;
if (num1 > num2)
result = num1;
else
result = num2;
System.out.println("最大值是" + result );
}
}
9.4方法的重载
在Java中,在同一个类中方法名可以相同,只要方法形参的数据类型不同,形参数量不同即可,即需要形参列表不同
//计算和
public static void add(int a,int b){
System.out.println(a + b);
}
public static void add(double a,double b){
System.out.println(a + b);
}
public static void add(int a,int b,int c){
System.out.println(a + b + c);
}
}
9.5可变参数
JDK 1.5 开始,Java支持传递同类型的可变参数给一个方法。
方法的可变参数的声明如下所示:
数据类型... 变量名
typeName... parameterName
在方法声明中,在指定参数类型后加一个省略号(…) 。
一个方法中只能指定一个可变参数,它必须是方法的最后一个参数。任何普通的参数必须在它之前声明。
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);
}
}