数组
为什么使用数组:
如果储存的数据较多,一个个设置变量太麻烦,java针对此问题提供了有效的储存方式——数组
Java中的数组
在java中数组就是一个变量,用于将相同的数据类型的数据储存在内存中。数组中的每一个数据元素都属于同一数据类型。
数组的基本要素
-
标识符:数组和变量一样也需要一个名字,称为标识符,这用于区分不同的数组
-
数组元素:当数组有了标识符后要向数组中储存数据,这些数据就是数组的元素
-
数组下标:在数组中,为了正确的获得数组的元素,需要对他们经行编号,这样就能根据编号去存取数据,这个编号就是数组下标
-
元素类型:储存在数组中的数组元素应该是同一数据类型,就是存储在数组中的数据是相同数据,用于声明数组的时候确定数组每个元素数据类型
概念
-
数组变量可以储存多个值
-
数组的数据类型保持一致
-
数组存放的每一个值都有下标(从零开始排序)
-
数组有固定的长度,表示存放的数值的个数
数组的使用
声明
/*//声明数组
数据类型[] 数组名;
//或者
数据类型 数组名[]
//分配空间
数组的变量名 = new 数据类型[长度]
//赋值
数组名[长度] = 数据;
数据类型[] 数组名 = {数据}*/
package arr;
public class TestArr01 {
public static void main(String[] args) {
// 数组的声明
//1.字符串数组:存放姓名
//2.整数数组:存放积分
//3.小数数组:存放小数
//String[] names; // 声明
//names = new String[3]; // 分配空间
String[] name = new String[3]; // 声明加分配空间
int[] score = new int[5]; // int数组
double[] score2 = new double[2]; //doube类型
//数组存放的数据(赋值)
name[0] = "张三"; // 把数值存放到下标0,(表示第一个值)
name[1] = "李四"; //下标1的位置(表示第二个值)
// 第三个值默认是空值:null表示
// 打印
System.out.println("names的第一个值:"+name[0]);
System.out.println("names的第二个值:"+name[1]);
System.out.println("names的第三个值:"+name[2]); // null默认值
//整数的赋值和打印
score[0] = 1000;
score[1] = 2000;
System.out.println("score的第一个值:" + score[0]);
System.out.println("score的第二个值:" + score[1]);
System.out.println("score的第三个值:" + score[2]);
System.out.println("score的第四个值:" + score[3]);// 0默认值
System.out.println("score的第五个值:" + score[4]);
//小数数组的赋值和打印
score2[0] = 1.23;
System.out.println("score2的第一个值:" + score2[0]);
System.out.println("score2的第二个值:" + score2[1]);// 0.0默认值
}
}
循环输出数组
package arr;
import java.util.Scanner;
public class TestArr02 {
public static void main(String[] args) {
// 另外两种数组赋值的方法:
//1.分配数组空间的同时完成赋值
//2.循环输入赋值输出数组
//String[] names = new String[3]; 分配空间可以存放3个文本的数组
String[] names = {"张三","李四"}; //分配空间同时完成赋值,数组长度由数据的个数来决定
System.out.println("有" + names.length + "人");
System.out.println("------------------------------------------------------------");
Scanner input = new Scanner(System.in); //创建扫描器
int[] score = new int[3]; //分配数组的空间(3个整数)
//循环(for推荐)
for (int i = 0; i < score.length; i++) { //循环范围
score[i] = input.nextInt();
}
//循环打印(按下标从0开始逐个打印)
for (int i = 0; i < score.length; i++) {
System.out.println("第" + (i+1) + "个:" + score[i]);
}
//数组的长度:表示可以存放数据的个数
//length表示长度的值
System.out.println("共" + score.length + "条数据");
input.close();
}
}
使用数组求平均值和总分
package arr;
import java.util.Scanner;
public class TestArr03 {
public static void main(String[] args) {
// 计算数组的平均分和总分
//准备数组:使用一次性分配和赋值的数组
double[] score = new double[5];
Scanner input = new Scanner(System.in); //创建扫描器
double sum = 0; //创建总分变量
for (int i = 0; i < score.length; i++) { //循环输出每次成绩并给栈赋值
System.out.println("请输入第" + (i+1) + "成绩:"); //提示输入成绩
score[i] = input.nextDouble(); //把输入内容保存到栈中
sum += score[i]; //求出整数
}
System.out.println("总分为:"+sum); //打印出总分
System.out.println("平均分为:"+(sum/score.length)); //用总分除以长度求出平均值
input.close();
}
}
使用循环判断数组中的每个值
package arr;
import java.util.Scanner;
public class TestArr04 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int[] numbers = {8,4,2,1,23,344,12};
int sum = 0;
boolean ok = false;
System.out.println("请猜幸运数:");
int inNumbers = input.nextInt();
for (int i = 0; i < numbers.length; i++) {
System.out.println("他们的值为:" + numbers[i]);
sum += numbers[i];
if (inNumbers == numbers[i]) {
System.out.println("\n对了!奖励一个亿\n");
ok = true;
}
}
if (ok == false) {
System.out.println("猜错了,罚款一亿");
}
System.out.println("\n幸运数的和为"+sum);
input.close();
}
}
Arrays工具包给数组排序
package arr;
import java.util.Arrays;
public class TestArr05 {
public static void main(String[] args) {
//数组的字母排序
//分配数组空间
int[] score = {90,80,70,60,50};
//执行自动排序:Arrays是jdk的工具类,sort是排序方法,可以将数组排序
Arrays.sort(score);
for (int i = 0; i < score.length; i++) {
//打印效果和赋值顺序不同,sort排序了
System.out.println(score[i]);
}
}
}
循环输入数值,输出最大值
package arr;
import java.util.Scanner;
public class TestArr06 {
public static void main(String[] args) {
//找出数组的最大值
//步骤:
//1.准备一个整数数组
//2.假设数组的第一个值是最大值
//3.循环数组,将每个值与最大值比较,得出最终的最大值
Scanner input = new Scanner(System.in);
int[] num = new int[5];
int max = 0;
for (int i = 0; i < num.length; i++) {
System.out.println("请输入" + (i+1) + "个值:");
num[i] = input.nextInt();
if (num[i] > max) {
max = num[i];
}
}
System.out.println("最大值为:"+max);
input.close();
}
}
通过默认值执行继续输入系统
package arr;
import java.util.Scanner;
public class TestArr07 {
public static void main(String[] args) {
//动态数据
//在现有数据的后面接着输入
Scanner input = new Scanner(System.in);
int[] score = new int[5];//设有5个数值
score[0] = 98; //已经存在的数字有两个
score[1] = 79;
//通过循环判断找出继续输入的位置
// 原理:int数组没有值,用0作为默认值
for (int i = 0; i < score.length; i++) {
//按下表顺序一次判断,数组值是否是01,如果是0,表示当前下表还没有输入值
if(score[i] == 0) {
System.out.println("请输入数据:");
score[i] = input.nextInt();
}else {
System.out.println("数据:"+score[i]);
}
}
input.close();
}
}
双重for循环
外循环执行一次,内循环执行多次
格式
for(int i = 0;i <= 10;i++){
//循环操作1
for(int j = 0;j < 5; i++){
//循环操作2
}
}
效果
package loop;
public class Test01 {
public static void main(String[] args) {
//双循环的原理(for为例)
/*
* 结构:
* for(循环条件1){
*
* for(循环条件2){
*
* }
* }
*/
//外层循环:1 ~ 5
for (int i = 1; i <= 5; i++) {
System.out.println("i:"+i);
//内层循环:1 ~ 3
for (int j = 1; j <= 3; j++) {
System.out.println("\tj:"+j);
}
}
}
}
双重for循环打印九九乘法表
package loop;
public class Test02 {
public static void main(String[] args) {
// 九九乘法表(左下角的直角三角形)
//外循环:1 ~ 9的数字
//i和j相通结束内循环
for (int i = 1; i <= 9; i++) {
//内循环:控制第二个数字
for (int j = 1; j <= i; j++) {
System.out.print(i + "*" + j + "=" + (j*i) + "\t");
}
//换行
System.out.println("");
}
}
}
打印倒直角三角形
package loop;
public class Test03 {
public static void main(String[] args) {
//乘法表(左上角的倒三角)
//外循环:控制打印9行
for (int i = 9; i >= 1; i--) {
//内循环
//列的规则:第一行九列 第二行八列 第三行七列 .... 第九行一列
for (int j = 1; j <= i; j++) {
System.out.print(i + "*" + j + "\t");
}
System.out.println();
}
}
}
测算不同班级中不同的班级平均分
package ex;
import java.util.Scanner;
public class Test01 {
public static void main(String[] args) {
//若有三个班级各有四名学员参赛,如何计算每个班级参赛学员的平均分
//思路:
//1.循环3次,输入三个班级
//2.在每个班级里面循环4次,输入每个人的成绩
//3.为每个班级计算平均分
Scanner sc = new Scanner(System.in); //创建扫描器
int[] score = new int[4]; //分数数组
int sum = 0; //总分
for (int i = 1; i <= 3; i++) {
System.out.println("请输入第" + i +"个班级的成绩");
for (int j = 0; j < score.length; j++) {
System.out.print("第" + (j+1) + "学生的成绩为:");
score[j] = sc.nextInt();
sum += score[j];
}
System.out.println("平均分为:"+(sum/4));
sum = 0;
}
}
}
项目复习和实践
import java.util.Random;
import java.util.Scanner;
public class TeatGame1 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
Random rand = new Random();
/*
while (true) {
}
*/
String yn = "y";
int password = 0;
String user = "";
while("y".equals(yn)) {
System.out.println("********欢迎进入富翁系统*************");
System.out.println("\t\t\t1.注册");
System.out.println("\t\t\t2.登录");
System.out.println("\t\t\t3.抽奖");
System.out.println("***************************************");
System.out.print("请选择菜单:");
int num = input.nextInt();
if (num == 1) {
System.out.println("[奖客富翁系统 > 注册]");
System.out.println("\n请填写个人注册信息");
System.out.print("输入用户名:");
user = input.next();
System.out.print("输入密码:");
password = input.nextInt();
int card = rand.nextInt(9999);
System.out.println("注册成功,请记住会员卡号");
System.out.println("姓名:" + user + "\t" + "密码:" + password + "\t" + "卡号:" + card );
}else if (num == 2) {
System.out.println("[奖客富翁系统 > 登录]");
for (int i = 3; i >= 1; i--) {
System.out.print("请输入用户名:");
String user2 = input.next();
System.out.print("请输入密码:");
int password2 = input.nextInt();
if((password2 == password) && (user2.equals(user))) {
System.out.println("登录成功!");
break;
}else {
System.out.println("登陆失败,您还有" + (i-1) + "次机会");
if (i == 0) {
System.out.println("登录系统自动退出");
}
}
}
}else if (num == 3) {
System.out.println("[奖客富翁系统 > 抽奖]");
}else {
System.out.println("菜单号输入错误!");
}
}
}
}
`
对象
现实世界中客观存在的任何事物都可以被看作对象。对象可以是有形的,如一辆汽车;也可以是无形的,如一项计划
对象的属性和方法
属性:对象的静态特征的一个数据项,该数据项的值既是属性值
方法:对象的动态特征的行为用代码表示
封装
共同的事物特征(名词化)——属性
共同的行为动作(动词化)——方法
就是把一个事物包装起来,尽可能隐藏内部细节。
类(class)
现实世界中某一类事物,用程序模拟出来
类定义了对象将会拥有的特征(属性)和行为(方法)
类是对象的类型
方法和属性属于对象,对象属于类中的一个成员
类是抽象的模板化的。
java程序中以类为基本单位
java是面向对象的语言
在类中需要描述类所具有的属性和方法
在java中要创建一个类需要使用一个class,一个类名和一对大括号;
public:公有
class:类
private:私有
如何定义类
类定义了对象将会拥有属性和方法。定义一个类的步骤
通过定义类名,得到程序最外层的框架
public class 类名{
}
类的属性:通过在类的主体中定义变量来描述类所具有的静态特征(属性),这些变量称为类的成员变量
//属性
访问修饰符 数据类型 属性名称;
类的方法:通过在类中定义方法来描述这类所具有的行为,这些方法称为类的成员方法。
//方法
访问修饰符 返回值类型 方法名(){
//方法体
}
访问修饰符限定了访问方法的范围,如public;返回值类型是方法执行后返回的结果的类型,这个类型可以是基本类型,或者是引用类型,也可以是没有返回值,此时必须使用void来描述。方法名一般使用一个有意义的名字描述方法的作用,其命名应符合标识符的命名规则
方法的分类
-
无参无返回值(访问修饰符 void 方法名(){})
-
无参带返回值(访问修饰符 返回值类型 方法名(){})
-
带参无返回值(访问修饰符 void 方法名(形参){})
-
带参带返回值(访问修饰符 返回值类型 方法名 (形参){})
创建和使用对象
类名 对象名 = new 类名();
再创建类的对象时,需要使用Java的new关键字
再java中,要引用对象的属性和方法,需要用 “ . ” 操作符。其中对象名在圆点左边,属性或方法在圆点右边。
//使用属性和方法
对象名.属性 = 属性值; //引用对象的属性
对象名.方法; //引用对象的方法
成员变量和局部变量
成员变量:AutoLion类的方法可以直接使用该类定义的成员变量,如果其他类的方法要访问它,必须先创建该类的对象,然后才能通过操作符 “ . ”来引用
局部变量:他的作用域仅仅在定义该变量的方法内,因此只有在这个方法中才能使用。
注意内容
-
作用域不同。局部变量的作用域仅限于定义他的方法,在该方法外无法访问。成员变量的作用域在整个类内部都是可见的,所有的成员方法都可以使用,如果访问权限允许,还可以在类的外部使用成员变量
-
初始值不同。对于成员变量,如果在定义中没有给他赋值,Java会给他一个默认值,基本数据类型的值为0,引用类型的值为null。但是java不会给局部变量赋初始值,因此局部变量必须要定义赋值后再使用。
-
在同一个方法中,不允许有同名的局部变量,在不同的方法中,可以有同名的局部变量
-
局部变量可以和成员变量同名,并且在使用的时候,局部变量具有更高的优先级