JavaSe

Base01

HelloWorld 案例

NotePad/… 文件类型 Dos指令
编写 .java  
编译 .class(字节码文件) javac 文件名.java
运行   java 类名.class
public class HelloWorld{
public static void main(String[] args){
System.out.println("HelloWorld!");
}
}

注释

  1. 程序指定位置添加的说明性信息,不参与运行,仅起到说明作用

  2. 分类

    • 单行注释 //

    • 多行注释 /* */

    • 文档注释 /** */

/* 
Java程序中最基本的组成单位是类

类的定义格式:
public class 类名{}

*/
public class HelloWorld{
/*
主方法 main
main方法是程序的入口方法,代码的执行是从main方法开始的
*/
public static void main(String[] args){
// 程序的输出语句,"" 引号内容可改变
System.out.println("HelloWorld!");
}
}

关键字

  1. 被Java语言赋予了特定含义的单词

  2. 特点

    • 关键字母全小写

    • 常见的代码编辑器,针对关键字有特殊的颜色标记,非常直观

/*
关键字
1.public
2.class
3.void
...
*/
public class HelloWorld{
public static void main(String[] args){
System.out.println("HelloWorld!");
}
}

 

常量

  1. 在程序运行过程中,其值不可以发生改变的量

  2. 分类

    • 字符串常量 “”

    • 字符常量 ”

    • 整数常量

    • 小数常量

    • 布尔常量 true/false

    • 空常量 null 空常量不能直接输出

public class HelloWorld{
public static void main(String[] args){
// 字符串常量
System.out.println("HelloWorld!");
System.out.println("-----------");
// 字符常量
System.out.println('A');
System.out.println("-----------");
// 整数常量
System.out.println(15);
System.out.println("-----------");
// 小数常量
System.out.println(3.14);
System.out.println("-----------");
// 布尔常量
System.out.println(true);
System.out.println("-----------");
// 空常量
// 空常量不能直接输出
// System.out.println(null);
System.out.println("-----------");
}
}

数据类型

  1. Java语言是强类型语言,对于每一种数据都给出了明确的数据类型,不同的数据类型也分配了不同的内存空间,所以它们表示的数据大小也是不一样的

  2. 分类

    基本数据类型     占用字节
    数值类型 整数类型 byte 1
        int 默认 2
        short 4
        long 8
      浮点类型 float 4
        double 默认 8
      字符型 char 2
    非数值类型 布尔类型 boolean 1
    引用数据类型  
    class
    接口 interface
    数组 []

变量

  1. 在程序运行过程中,其值可以发生改变的量,本质上讲,变量是内存中一小块区域

  2. 三要素

    • 数据类型

    • 变量名

    • 变量值

  3. 先声明后使用

public class HelloWorld{
public static void main(String[] args){
// 声明变量
int a = 15;
// 使用变量
System.out.println(a);
// 修改变量的值
a = 13777;
// 再次使用变量
System.out.println(a);
}
}
  1. 变量使用的注意事项

    • 声明时变量名不能重复

    • 变量时未赋值不能使用

    • long类型赋值时须在值后加L,防止整数过大

    • float类型赋值时须在值后加F,防止不兼容的类型

标识符

  1. 给类,方法,变量等命名的符号

  2. 定义规则

    • 由数字、字母、下划线_和美元夫$组成

    • 不能以数字开头

    • 不能是关键字

    • 区分大小写

  3. 常见命名规定

    • 小驼峰命名法 方法、变量

    • 大驼峰命名法 类

类型转换

  1. 分类

    • 自动类型转换 数据范围小的数值或者变量赋值给另一个数据范围大的变量

    • 强制类型转换 数据范围大的数值或者变量赋值给另一个数据范围小的变量

public class HelloWorld{
public static void main(String[] args){
// 自动类型转换
// byte -> short -> int -> long -> float -> double
// char -> int -> long -> float -> double
double a = 10; // 10 int a double
System.out.println(a);
// 强制类型转换
int x = (int)88.88;
System.out.println(x);
}
}

运算符和表达式

  1. 运算符:对常量或者变量进行操作的符号

  2. 表达式:用运算符把常量或者变量连起来符合java语法的式子就可以称为表达式,不同运算符连接的表达式体现的是不同类型的表达式

算数运算符

  1. 加减乘除取余

public class HelloWorld{
public static void main(String[] args){
/*
算数运算符 + - * / %
*/
int x = 6;
int y = 4;
System.out.println(x + y); // 加 10
System.out.println(x - y); // 减 2
System.out.println(x * y); // 乘 24
System.out.println(x / y); // 除 1 被除数和除数为整数,商也为整数,被除数和除数存在浮点数,商为浮点数
System.out.println(x % y); // 模 2

}
}

字符的+操作

  1. 算数表达式中包含多个基本数据类型的值的时候,整个算数表达式的类型会自动进行提升

  2. ‘A’ -> 65 A-Z是连续的’,a’ -> 97 a-z是连续的,’0′ -> 48 0-9是连续的

public class HelloWorld{
public static void main(String[] args){
/*
字符的 + 操作
'A' -> 65 A-Z是连续的
'a' -> 97 a-z是连续的
'0' -> 48 0-9是连续的
算数表达式中包含多个基本数据类型的值的时候,整个算数表达式的类型会自动进行提升
*/
int a = 10;
char c = 'A';
System.out.println(a + c); // 10+65
c = 'a';
System.out.println(a + c); // 10+97
c = '0';
System.out.println(a + c); // 10+48
}
}

字符串的+操作

  1. 在 + 操作中,如果出现了字符串,就是连接运算符,否则就是算术运算,当连续进行 + 操作时,从左到右做个执行

public class HelloWorld{
public static void main(String[] args){
/*
字符串的+操作
当 + 操作符出现字符串时,这个 + 是字符串连接符,而不是算数运算符
在 + 操作中,如果出现了字符串,就是连接运算符,否则就是算术运算,当连续进行 + 操作时,从左到右做个执行
*/
System.out.println("it" + "heima"); // itheima
System.out.println("it" + 666); // it666
System.out.println(666 + "heima"); // 666heima
System.out.println("it" + 6 + 66); // it666
System.out.println(6 + 66 + "heima"); // 72heima
}
}

赋值运算符

public class HelloWorld{
public static void main(String[] args){
/*
赋值运算符 = += -= *= /= %=
扩展的赋值运算符隐含强制类型转换
*/
int i =10; // 将10赋值给int类型的变量i
System.out.println("i:" + i);
System.out.println("---------");
i += 20; // i = i + 20 左右数据相加,结果赋值给左边
System.out.println("i:" + i);
System.out.println("---------");
// x+=y 与 x=x+y 不完全等价 前者隐含强制类型转换
short x = 1;
// x = x + 10; 此时输出x,则报错不兼容的类型,算数表达式的类型会自动进行提升,此时x+10为int型,而x为short型
x+=10; // 隐含强制类型转换,即该表达式等价于 x=short(x+10)
System.out.println("short:" + x );
}
}

自增自减运算符

  1. 参与操作时,如果是后置自增自减,先拿变量参与操作,后拿变量单独进行自增自减

  2. 参与操作时,如果是前置自增自减,先拿变量单独进行自增自减,后拿变量参与操作

public class HelloWorld{
public static void main(String[] args){
/*
自增自减运算符 ++ --
参与操作时,如果是后置自增自减,先拿变量参与操作,后拿变量单独进行自增自减
参与操作时,如果是前置自增自减,先拿变量进行自增自减,后拿变量参与操作
*/
// ++ -- 单独使用 前置与后置效果相同
int i = 10;
System.out.println("i:" + i); // 10
System.out.println("----------");
i++;
System.out.println("i:" + i); // 11
System.out.println("----------");
++i;
System.out.println("i:" + i); // 12
System.out.println("----------");
i--;
System.out.println("i:" + i); //11
System.out.println("----------");
--i;
System.out.println("i:" + i); // 10
System.out.println("----------");
// ++ -- 参与操作使用
int j = i++; // 此时 j = 10,i = 11,执行完此行代码后,进行i++;
System.out.println("i:" + i); // 11
System.out.println("j:" + j); // 10
int j = ++i; // // 此时 j = 12,i = 12,执行此行代码时,进行++i;
}
}

关系运算符

public class HelloWorld{
public static void main(String[] args){
/*
关系运算符 == != > < >= <=
*/
int i = 10;
int j = 20;
int k = 10;
// ==
System.out.println(i == j); // false
System.out.println(i == k); // true
System.out.println("----------");
// !=
System.out.println(i != j); // true
System.out.println(i != k); // false
System.out.println("----------");
// >
System.out.println(i > j); // false
System.out.println(i > k); // false
System.out.println("----------");
// >=
System.out.println(i >= j); // false
System.out.println(i >= k); // true
System.out.println("----------");
// 将 j 的值 赋值给 i 并输出 i 的值
System.out.println(i = j); // 20
}
}

逻辑运算符

public class HelloWorld{
public static void main(String[] args){
/*
逻辑运算符 & | ^ !/ 与 或 异或 非
*/
int i = 10;
int j = 20;
int k = 30;

//& 有f则f
System.out.println(i > j & i > k); // f&f f
System.out.println(i < j & i > k); // t&f f
System.out.println(i > j & i < k); // f&t f
System.out.println(i < j & i < k); // t&t t
System.out.println("--------------");
//| 有t则t
System.out.println(i > j | i > k); // f|f f
System.out.println(i < j | i > k); // t|f t
System.out.println(i > j | i < k); // f|t t
System.out.println(i < j | i < k); // t|t t
System.out.println("--------------");
//^ 相同为f,不同为t
System.out.println(i > j ^ i > k); // f^f f
System.out.println(i < j ^ i > k); // t^f t
System.out.println(i > j ^ i < k); // f^t t
System.out.println(i < j ^ i < k); // t^t f
System.out.println("--------------");
//!
System.out.println(!(i > j | i > k)); // !(f|f) t
System.out.println("--------------");

短路逻辑运算符

  1. 逻辑与或,无论左边真假,右边都要执行

  2. 短路逻辑与或,左边为假真,右边不执行

public class HelloWorld{
public static void main(String[] args){
/*
短路逻辑运算符 && || 短路与 短路或
*/
int i = 10;
int j = 20;
int k = 30;

//& 有f则f
System.out.println(i > j && i > k); // f&f f
System.out.println(i < j && i > k); // t&f f
System.out.println(i > j && i < k); // f&t f
System.out.println(i < j && i < k); // t&t t
System.out.println("--------------");
//| 有t则t
System.out.println(i > j || i > k); // f|f f
System.out.println(i < j || i > k); // t|f t
System.out.println(i > j || i < k); // f|t t
System.out.println(i < j || i < k); // t|t t
System.out.println("--------------");
// 结果相同,但有短路效果,即短路与,有f则f的前提条件下,如第一个逻辑表达式结果为f,则不执行第二个逻辑表达式
System.out.println(i++ > 100 && j++ > 100); // f&&f f&&f
System.out.println("i:" + i); // 10+1
System.out.println("j:" + j); // 20
}
}

三元运算符

public class HelloWorld{
public static void main(String[] args){
/*
三元运算符 关系表达式?表达式1:表达式2
首先计算关系表达式的值
如果值为true,表达式1的值为运算结果
如果值为false,表达式2的值为运算结果
*/
int a = 10;
int b = 20;
// 获取两个数中的较大值
int max = a > b ? a : b;
System.out.println("max:" + max);
}
}

数据输入

  1. 导包 import java.util.Scanner; 导包的动作必须出现在类定义的上边

  2. 创建对象 Scanner sc = new Scanner(System.in);

  3. 接收数据 int i = sc.nextInt();

import java.util.Scanner;
public class HelloWorld{
public static void main(String[] args){
/*
数据输入 Sannner
导包 import java.util.Scanner; 导包的动作必须出现在类定义的上边
创建对象 Scanner sc = new Scanner(System.in);
接收数据 int i = sc.nextInt();
*/
// 创建对象
Scanner sc = new Scanner(System.in);
// 接收数据
int x = sc.nextInt();
// 输出变量
System.out.println(x);
}
}

Base02

流程控制语句分类

  1. 顺序结构

  1. 顺序结构是程序中最简单最基本的流程控制,没有特定的语法结构,按照代码的先后顺序,依次执行

public class HelloWorld{
public static void main(String[] args){
/*
顺序结构
*/
System.out.println("开始");
System.out.println("A");
System.out.println("B");
System.out.println("C");
System.out.println("结束");
}
}
  1. 分支结构

  1. if 语句

import java.util.Scanner;
public class HelloWorld{
public static void main(String[] args){
/*
if 语句
1.if(关系表达式){语句体}; true 执行语句体,false 不执行语句体 单分支
2.if(关系表达式){语句体1} else{语句体2}; true 执行语句体1,false 不执行语句体2 双分支
3.if(关系表达式1){语句体1}
else if(关系表达式2){语句体2}
else if(关系表达式3){语句体3}
else if(关系表达式4){语句体4}
...
else{语句块n};
关系表达式为true 执行该语句体,false 不执行该语句体
*/
// 1 单分支
int a = 10;
int b = 20;
if(a == b)
{
System.out.println("a=b");
}
// 2 双分支
// 奇偶数
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个整数:");
int number = sc.nextInt();
if(number % 2 == 0)
{
System.out.println(number + "为偶数");
}
else{
System.out.println(number + "为奇数");
}
// 3 多分支
// 星期几
Scanner sc1 = new Scanner(System.in);
System.out.println("请输入一个星期数(1-7)");
int day = sc1.nextInt();
if(day == 1)
{
System.out.println("星期一");
}
else if(day == 2)
{
System.out.println("星期二");
}
else if(day == 3)
{
System.out.println("星期三");
}
else if(day == 4)
{
System.out.println("星期四");
}
else if(day == 5)
{
System.out.println("星期五");
}
else if(day == 6)
{
System.out.println("星期六");
}
else if(day == 7)
{
System.out.println("星期天");
}

// 成绩
import java.util.Scanner;
public class HelloWorld{
public static void main(String[] args){
Scanner sc2 = new Scanner(System.in);
System.out.println("请输入成绩:");
// 接收数据
int score = sc2.nextInt();
// 逻辑判断
// 正确数据 边界数据 错误数据 保证程序的健壮性
if(score > 100 && score < 0)
{
System.out.println("你输入的数据有误");
}
else if(score >= 95)
{
System.out.println("山地自行车一辆");
}
else if(score >= 90)
{
System.out.println("游乐场一次");
}
else if(score >= 80)
{
System.out.println("变形金刚玩具一个");
}
else{
System.out.println("胖揍一顿");
}
}
}
  1. switch 语句

import java.util.Scanner;
public class HelloWorld{
public static void main(String[] args){
/*
switch 语句
switch(表达式)
{
case 值1:
语句体1;
break;
case 值2:
语句体2;
break;
...
default:
语句体n+1;
[break;]
}
表达式:取值可以是byte,short,int,char,jdk5新增枚举,jdk7新增String
case:后面跟的是要与表达式进行比较的值
break:表示中断,结束的意思,用来结束switch语句
default:表示所有情况都不匹配的时候,就执行该处的内容
*/
// 键盘录入一个星期数,输出对应的星期一...
// 创建对象
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个星期数");
// 接收数据
int day = sc.nextInt();
// 逻辑判断
switch(day){
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("你输入的星期数有误");
break;
}
}

}
import java.util.Scanner;
public class HelloWorld{
public static void main(String[] args){
/*
case穿透:case控制的语句体后面不屑break,将出现穿透现象,在不判断下一个case值的情况下,向下运行直到遇见break,或者整体switch遇语句结束
*/
// 键盘录入一个月份数,输出对应的季节...
// 创建对象
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个月份");
// 接收数据
int day = sc.nextInt();
// 逻辑判断
switch(day){
case 12:
case 1:
case 2:
System.out.println("冬季");
break;
case 3:
case 4:
case 5:
System.out.println("春季");
break;
case 6:
case 7:
case 8:
System.out.println("夏季");
break;
case 9:
case 10:
case 11:
System.out.println("秋季");
break;
default:
System.out.println("你输入的月份有误");
}
}

}
  1. 正确值,边界值,错误值,保证程序的健壮性

  1. 循环结构

    初始化语句:用于表示循环开启时的起始状态

    条件判断语句:用于表示循环反复执行的条件

    循环体语句:用于表示循环反复执行的内容

    条件控制语句:用于表示循环执行中每次变化的内容

    1. for 循环语句

    public class HelloWorld{
    public static void main(String[] args){
    /*
    for 循环语句
    for(初始化语句;条件判断语句;条件控制语句)
    {
    循环体语句;
    }
    */
    // 需求:在控制台输出五次 HelloWorld
    for(int i = 0; i < 5; i++)
    {
    System.out.println("HelloWorld");
    }
    // 需求:输出1-5和5-1的数据
    for(int i = 1; i <= 5; i++)
    {
    System.out.println(i);
    }
    System.out.println("----------");
    for(int i = 5; i >=1; i--)
    {
    System.out.println(i);
    }
    // 需求:求1-5之间的数据和,并把求和结果在控制台输出
    int sum = 0;
    for(int i = 1; i <= 5; i++)
    {
    sum+=i;
    }
    System.out.println(sum);
    // 需求:求1-100之间的偶数和,并把求和结果在控制台输出
    int sum1 = 0;
    for(int i = 1; i <= 100; i++)
    {
    if(i % 2 == 0){
    sum1+=i;
    }
    }
    System.out.println(sum1);
    // 需求:在控制台输出所有的水仙花数
    // 水仙花数是一个三位数,水仙花数的个位、十位、百位的数字立方和等于原数
    // 最高位整除,最低位则取余
    // 求任意数在指定位上的数:先使用整数操作将要求的数字移动到个位上,再使用取余操作取出最后一位上的值
    for(int i = 100; i <= 999; i++)
    {
    int x = i % 10; // 个位
    int y = i / 10 % 10; // 十位
    int z = i / 100;
    int sum2 = x * x * x + y * y * y + z * z * z;
    if(sum2 == i)
    {
    System.out.println(i);
    }
    }
    // 需求:统计水仙花数一共有多少个,并在控制台输出个数
    int count = 0;
    for(int i = 100; i <= 999; i++)
    {
    int x = i % 10; // 个位
    int y = i / 10 % 10; // 十位
    int z = i / 100;
    int sum2 = x * x * x + y * y * y + z * z * z;
    if(sum2 == i)
    {
    count++;
    System.out.println(i);
    }
    }
    System.out.println(count);
    }

    }
    1. while 循环语句

    public class HelloWorld{
    public static void main(String[] args){
    /*
    while 循环语句
    初始化语句;
    while(条件判断语句)
    {
    循环体语句;
    条件控制语句
    }
    */
    // 需求:在控制台输出五次HelloWorld
    int i = 0;
    while(i < 5)
    {
    System.out.println("HelloWorld");
    i++;
    }
    // 需求:世界最高山峰是珠穆朗玛峰8844430毫米,假如我有一张足够大的纸,它的厚度是0.1毫米,请问我折叠多少次到达珠穆朗玛峰的高度
    double h = 0.1;
    int count = 0;
    while(h <= 8844430)
    {
    count++;
    h*=2;
    }
    System.out.println(count);
    // 需求:
    }
    }
    1. do…while 循环语句

    public class HelloWorld{
    public static void main(String[] args){
    /*
    do...while 循环语句
    初始化语句;
    do
    {
    循环体语句;
    条件控制语句;

    }while(条件控制语句);
    */
    // 需求:在控制台输出五次HelloWorld
    int i = 0;
    do{
    System.out.println("HelloWorld");
    i++;
    }while(i < 5);
    }
    }
    1. 三种循环的区别

      1. do…while 至少执行一次

      2. for 初始化量与while、do…while初始化变量的使用范围不同

      3. 死循环 for(;;){}、while(true){}、do{}while(true)

      4. 命令提示窗口 CTRL+C 结束死循环

跳转控制语句

  1. contiune:跳过某次循环体内容的执行,使用基于条件控制

  2. break:终止循环体内容的执行,使用基于条件控制

public class HelloWorld{
public static void main(String[] args){
/*
跳转控制语句
contiune:跳过某次循环体内容的执行,使用基于条件控制
break:终止循环体内容的执行,使用基于条件控制
*/
for(int i = 1; i <= 5; i++)
{
if(i % 2 ==0)
{
// continue;
break;
}
System.out.println(i);
}
}
}

循环嵌套

public class HelloWorld{
public static void main(String[] args){
/*
循环嵌套
*/
// 需求:在控制台输出一天的小时和分钟
for(int i = 1; i < 13; i++)
{
for(int j = 0; j < 61; j++)
{
System.out.println(i + "时" + j + "分");
}
}
}
}

Random

  1. Random 用于产生一个随机数

  2. 导包 import java.util.Random;

  3. 创建对象 Random r = new Random();

  4. 获取随机数 int number = r.nextInt(10); 取值范围:[0,10) 包括0不包括10

import java.util.Random;
import java.util.Scanner;
public class HelloWorld{
public static void main(String[] args){
/*
Random 用于产生一个随机数
1.导包 import java.util.Random;
2.创建对象 Random r = new Random();
3.获取随机数 int number = r.nextInt(10); 取值范围:[0,10) 包括0不包括10
*/
// 创建对象
Random r = new Random();
// 获取随机数
int number = r.nextInt(10);
// 输出
System.out.println(number);
// 需求:用循环获取十个随机数,取值范围0-100
for(int i = 0;i < 10; i++)
{
System.out.println(r.nextInt(101));
}
// 需求:猜数字
int number1 = r.nextInt(101);
Scanner s = new Scanner(System.in);
while(true){
System.out.println("请输入一个整数");
int number2 = s.nextInt();
if(number1 > number2)
{
System.out.println("猜小了");
}
else if(number1 < number2)
{
System.out.println("猜大了");
}
else{
System.out.println("猜对了");
break;
}
}
}
}

idea HelloWorld 步骤

  1. 创建一个空项目 JavaSe_Code

  2. 创建一个新模块 idea_test

  3. 在idea_test模块下的src下创建一个包 com.itheima

  4. 在com.itheima包下创建一个类 HelloWorld

  5. 在HelloWorld类中编写代码

  6. 在idea中执行程序

idea 项目结构

项目Project

模块Module

包Package

类Class

idea 内容辅助键和快捷键

快速生成

  • psvm main

  • sout 输出

内容辅助键

  • Ctrl + Alt + Space

快捷键

  • 注释 单行注释 Ctrl + / 多行注释 Ctrl + Shift + /

  • 格式化 Ctrl + Alt + L

idea 模块操作

新建模块

删除模块

导入模块

Base03

数组

package com.itheima;

public class ArrayDemo {
   /*
   数组:用于存储多个相同类型数据的存储模型
   数组定义:
   1.数据类型[] 数组名 推荐使用 定义了一个int类型的数组,数组名为~
   2.数据类型 数组名[] 定义了一个int类型的变量,变量名是~的数组
   数组初始化:
   1.动态初始化:只指定数组的长度,由系统为数组分配初始值 数据类型[] 变量名 = new 数据类型[数组长度] 范例:int[] arr = new int[3];
   2.数组在初始化时,会为存储空间添加默认值,整数默认值0,浮点数默认值0.0,布尔默认值false,字符默认值空字符,引用数据类型默认值null
   3.静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度 数据类型[] 变量名 = new 数据类型[]{数据1,数据2,数据3...} -> 数据类型[] 变量名 = {数据1,数据2,数据3...}
   数组元素访问:
   1.数组变量访问方式: 格式:数组名
   2.数组内部保存的数据的访问方式:格式:数组名[索引/下标] 索引/下标:是数组中数据的编号方式,从0开始,连续且逐一增加
   数组操作常见问题:
   1.索引/下标越界:访问了数组中不存在的索引/下标对应元素
   2.空指针异常:访问数组已经不再指向堆内存的数据
   3.null:空指,一引用数据类型的默认值,表示不指向任何有效对象
   数组常见操作:
   1.遍历 数组名.length
   2.获取最值
   */
   public static void main(String[] args) {
       int[] arr = new int[3];
       System.out.println(arr); // [I@1b6d3586 地址
       System.out.println(arr[0]);
       System.out.println(arr[1]);
       System.out.println(arr[2]);
       System.out.println("----------");
       // 索引下标越界
       // System.out.println(arr[3]);
       // 遍历
       for(int i = 0; i < arr.length; i++)
      {
           System.out.println(arr[i]);
      }
       System.out.println("----------");
       int[] arr01 = {1,2,3};
       System.out.println(arr01); // [I@1b6d3586 地址
       System.out.println(arr01[0]);
       System.out.println(arr01[1]);
       System.out.println(arr01[2]);
       System.out.println("----------");
       // 遍历
       for(int i = 0; i < arr01.length; i++)
      {
           System.out.println(arr01[i]);
      }
       System.out.println("----------");
       // 空指针异常
       // arr01 = null;
       // System.out.println(arr01[0]);
       // 获取最值
       int max = arr01[0];
       for(int i = 1; i < arr01.length; i++)
      {
           max = max > arr01[i] ? max : arr01[i];
      }
       System.out.println("最大值:" + max);
  }
}

方法

package com.itheima;

public class myMethod {
   /*
   方法:具有独立功能的代码块组织成一个整体,使其具有特殊功能的代码集,方法定义后才能进行方法调用
   方法的定义:public static void 方法名(){方法体}
   方法的调用:方法名();
   带参数方法的定义和调用:
   1.定义:public static void 方法名(参数(数据类型 变量名)){方法体} 参数可单个也可多个,参数数量类型与变量名不可少,且多个参数之间用,分隔
   2.调用:方法名(参数(变量名/常量值)); 参数的数量与类型必须与方法中的设置相匹配
   形参和实参:
   1.形参:方法定义中的参数
   2.实参:方法调用中的参数
   带返回值方法的定义和调用
   1.定义:public static 数据类型 方法名(参数){ ... return 数据} 返回值必须与方法定义上的数据类型匹配
   2.调用:数据类型 变量名 = 方法(参数); 方法的返回值通常会使用变量接收,否则返回值无意义
   方法的注意事项:
   1.方法不能嵌套定义,方法之间为平级关系
   2.void表示无返回值,可以省略return,也可以单独书写return;,后面不加数据
   方法的通用格式:public static 返回值类型 方法名(参数){方法体;return [数据];}
   */
   public static void main(String[] args) {
       // 调用方法
       isEvenNumber();
       getMax();
       System.out.println("----------");
       // 带参数方法的调用
       int x = 30;
       int a = 50;
       int b = 60;
       // 变量名传参调用
       isEvenNumber01(x);
       getMax01(a,b);
       System.out.println("----------");
       // 常量值传参调用
       isEvenNumber01(40);
       getMax01(70,80);
       System.out.println("----------");
       // 带参数与返回值方法的调用
       boolean res = isEvenNumber02(10);
       System.out.println(res);
       System.out.println("----------");
       // 带参数与返回值方法的调用
       int res01 = getMax02(a,b);
       System.out.println(res01);
       System.out.println(getMax02(a,b));
       System.out.println("----------");
  }
   // 需求:定义一个方法,在方法中定义一个变量,判断该数据是否为偶数
   public static void isEvenNumber(){
       // 定义变量
       int number = 10;
       // 判断该数据是否为偶数
       if(number % 2 == 0)
      {
           System.out.println(true);
      } else{
           System.out.println(false);
      }
  }
   // 需求:设计一个方法用于打印两个数中的较大数
   public static void getMax()
  {
       int a = 10;
       int b = 20;
       if(a > b){
           System.out.println(a);
      }else{
           System.out.println(b);
      }
  }
   // 需求:定义一个带单个参数方法,该方法接收一个参数,判断该数据是否为偶数
   public static void isEvenNumber01(int number)
  {
       // 判断该数据是否为偶数
       if(number % 2 == 0)
      {
           System.out.println(true);
      } else{
           System.out.println(false);
      }
  }
   // 需求:设计一个带多个参数方法用于打印两个数中的较大数,数据来自方法参数
   public static void getMax01(int a, int b)
  {
       if(a > b){
           System.out.println(a);
      }else{
           System.out.println(b);
      }
  }
   // 需求:定义一个带参数与返回值方法,该方法接收一个参数,判断该数据是否为偶数,并返回真假值
   public static boolean isEvenNumber02(int number)
  {
       if(number % 2 == 0)
      {
           return true;
      }else{
           return false;
      }
  }
   // 需求:设计一个带参数与返回值方法可以获取两个数的较大值,数据来自参数
   public  static  int getMax02(int a, int b)
  {
       if(a > b){
           return a;
      }else{
           return b;
      }
  }
}
package com.itheima;

public class myMethod01 {
   /*
   方法重载:方法重载指同一个类中的多个方法之间的关系,满足下列条件的多个方法相互构成重载
   1.多个方法在一个类中
   2.多个方法具有相同的方法名
   3.多个方法的参数不相同,有类型不相同或数量不相同
   方法重载特点
   1.重载仅对用方法的定义,与方法的调用无关,调用方式参照标准格式
   2.重载仅针对同一类中方法的名称与参数进行识别,与返回值无关,即不能通过返回值来判断两个方法是否相互构成重载
   3.调用时,java虚拟机根据参数的不同判断调用哪一个方法
    */
   public static void main(String[] args) {
       // 三者相互之间构成方法重载
       System.out.println(sum(10,20));
       System.out.println(sum(10.0,10.0));
       System.out.println(sum(10,20,30));

  }
   // 需求:求两个int类型数据和的方法
   public static int sum(int a,int b)
  {
       return a + b;
  }
   // 需求:求两个double类型数据和的方法
   public static double sum(double a,double b)
  {
       return a + b;
  }
   // 需求:求三个int类型数据和的方法
   public static int sum(int a, int b, int c)
  {
       return a + b + c;
  }
   // 需求:比较两个整数是否相同,兼容全整数类型
   // int
   public static boolean isEqual(int a, int b)
  {
       return a == b;
  }
   // short
   public static boolean isEqual(short a, short b)
  {
       return a == b;
  }
   // byte
   public static boolean isEqual(byte a, byte b)
  {
       return a == b;
  }
   // long
   public static boolean isEqual(long a, long b)
  {
       return a == b;
  }
}
package com.itheima;

public class myMethod02 {
   /*
   方法参数传递:
   1.基本类型:对于基本数据类型的值,形式参数的改变,不影响实际参数的值
   2.引用类型:对于引用数据类型的值,形式参数的改变,影响实际参数的值
    */
   public static void main(String[] args) {
       // 基本数据类型
       int number = 100;
       System.out.println("change前:" + number);
       change(number);
       System.out.println("change后:" + number);
       System.out.println("---------------");
       // 引用数据类型
       int[] arr = {10,20,30};
       System.out.println("change前:" + arr[1]);
       change(arr);
       System.out.println("change后:" + arr[1]);
  }
   public static void change(int number)
  {
       number = 200;
  }
   public static void change(int[] arr)
  {
       arr[1] = 100;
  }
}

Base04

Debug

import java.util.Scanner;
public class Debug {
   /*
   debug:供程序员使用的程序调试工具,它可以用于查看程序的执行流程,也可以用于追踪程序执行过程来调试程序
   debug调试:断点调试
    */
   public static void main(String[] args) {
       // 定义两个变量
       int i = 10;
       int j = 20;
       // 求和
       int sum = i + j;
       // 输出结果
       System.out.println("sum:" + sum);
       // 需求:查看循环求偶数和的执行流程
       int sum01 = 0;
       for(int k = 1; k <= 10; k++)
      {
           if(k % 2 == 0)
          {
               sum01+=k;
          }
      }
       System.out.println("1-10之间的偶数和是:" + sum01);
       // 查看方法调用
       Scanner sc = new Scanner(System.in);
       System.out.println("请输入第一个整数:");
       int a = sc.nextInt();
       System.out.println("请输入第二个整数:");
       int b = sc.nextInt();
       int max = getMax(a,b);
       System.out.println("较大的值是:" + max);
  }
   // 比较数值大小方法
   public static int getMax(int a, int b)
  {
       if(a > b)
      {
           return a;
      }else{
           return b;
      }
  }
}

基础知识回顾

  1. 减肥计划

  2. 逢七过

  3. 不死神兔

  4. 百钱百鸡

  5. 数组元素求和

  6. 数组内容相同

  7. 查找

  8. 反转

  9. 评委打分

类和对象

类的定义

package com.itheima;

public class Object {
   /*
   万物皆可对象 类是对象的抽象,对象是类的实体
   对象:能够看得到摸得着的真实存在的实体,描述数据信息
   类:类是对现实生活中一类具有共同属性和行为的事物的抽象,描述数据类型
   类的特点:
   1.类是对象的数据类型
   2.类是具有相同属性和行为的一组对象的集合
   对象的属性:对象具有的各种特征,每个对象的每个属性都拥有特定的值
   对象的行为:对象能够执行的操作
   ----------
   类的定义:是java程序的基本组成单位
   类是什么:是对现实生活中一类具有共同属性和行为的事物的抽象,确定对象将会拥有的属性和行为
   类的组成:属性和行为
   1.属性:在类中通过成员变量来体现(类中方法外的变量)
   2.行为:在类中通过成员方法来体现(和前面的方法相比去掉static关键字即可)
   成员变量和局部变量
   成员变量:类中方法外的变量
   局部变量:方法中的变量
   成员和局部变量的区别
   1.类中的位置不同
   成员变量在方法外,局部变量在方法内或者方法声明上
   2.内存中的位置不同
   成员变量在堆内存,局部变量在栈内存
   3.生命周期不同
   成员变量随着对象的存在而存在,随着对象的消失而小时
   局部变量随着方法的调用而存在,随着方法的调用完毕而小时
   4.初始化值不同
   成员变量有默认初始值
   局部变量没有默认的初始化值,必须先定义,后赋值,才能使用
    */
   String brand;
   int price;

   public void call()
  {
       System.out.println("打电话");
  }

   public void sendMessage()
  {
       System.out.println("发短信");
  }
}

对象的使用

package com.itheima;

public class Student {
   String name;
   int age;

   public void study()
  {
       System.out.println(name + "study");
  }

   public void doHomeWork()
  {
       System.out.println(name + "doHomeWork");
  }
}
package com.itheima;

public class UseObject {
   /*
   对象的使用
   1.创建对象 类名 对象名 = new 类名();
   2.使用对象 对象名.变量名; 对象名.方法名();
    */
   public static void main(String[] args) {
       // 创建对象
       Object o = new Object();
       // 使用成员变量
       System.out.println(o.brand);
       System.out.println(o.price);

       o.brand = "华为";
       o.price = 2999;

       System.out.println(o.brand);
       System.out.println(o.price);

       // 使用成员方法
       o.call();
       o.sendMessage();

       System.out.println("----------");

       // 学生类
       Student stu = new Student();
       stu.name = "张三";
       stu.age = 18;
       System.out.println(stu.name);
       System.out.println(stu.age);
       stu.study();
       stu.doHomeWork();

       System.out.println("----------");

       // Private 类
       Private p = new Private();
       p.setAge(30);
       System.out.println(p.getAge());
  }
}

private、封装、this关键字

package com.itheima;

public class Private {
   /*
   private关键字
   1.是一个权限修饰符
   2.可以修饰成员(成员变量和成员方法)
   3.作用是保护成员不被别的类使用,被private修饰的成员只能在本类中才能访问 -- 规范性检查

   针对private修饰的成员变量,如果需要被其他类使用,则提供相应的操作方法
   1.提供get变量名()方法用于获取成员变量的值,方法用public修饰
   2.提供set变量名(参数)方法用于设置成员变量的值,方法用public修饰

   this关键字 解决局部变量隐藏成员变量 方法被那个对象调用,this就代表哪个对象
   1.this修饰的变量用于指代成员变量
   2.方法的形参如果与成员变量同名,不带this修饰的变量指的是形参,而不是成员变量
   3.方法的形参没有与成员变量同名,不带this修饰的变量指的是成员变量

   封装
   1.封装概述
   面向对象的三大特征之一,封装继承多态
   面向对象编程语言对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界是无法直接操作的
   2.封装原则
   将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问
   成员变量private,提供对应的get和set方法
   3.封装的好处
   通过方法来控制成员变量的操作,提高了代码的安全性
   把代码用方法进行封装,提高了代码的复用性
    */
   private int age;

   public void setAge(int age) {
       if(age > 120 || age < 0)
      {
           System.out.println("年龄不符合规范");
      }else{
           this.age = age;
      }
  }

   public int getAge() {
       return age;
  }
}

构造方法

package com.itheima;

public class Construction {
   /**
    * 构造方法:
    * 构造方法是一种特殊的方法
    * 作用:创建对象
    * 格式:public class 类名{修饰符 类名(参数){}}
    * 功能:主要是完成对象数据的初始化
    *
    * 构造方法的注意事项:
    * 构造方法的创建:
    * 1.如果没有定义构造方法,系统将给出一个默认的无参构造方法
    * 2.如果定义了构造方法,系统将不再提供默认的构造方法
    * 构造方法的重载:
    * 如果定义了带参构造方法,还要使用无参构造方法,就必须再写一个无参构造方法
    * 推荐的使用方式:
    * 无论是否使用,都手工书写无参构造方法
    *
    */
   private String name;
   private Integer age;

   public void show(){
       System.out.println(name + "," + age);
  }

   // 无参构造方法,当一个类中没有给出构造方法,系统会给一个默认的无参构造方法
   public Construction() {
       System.out.println("无参构造方法");
  }
   // 带参构造方法,一旦给出构造方法,系统将不再给默认的无参构造方法

   public Construction(String name, Integer age) {
       System.out.println("带参构造方法");
       this.name = name;
       this.age = age;
  }
}
package com.itheima;

public class test {
   public static void main(String[] args) {
       // 创建对象
       Construction cs = new Construction();
       cs.show();

       Construction cs1 = new Construction("林青霞",18);
       cs1.show();
  }
}

标准类

package com.itheima;

public class StandardClass {
   /**
    * 标准类制作
    * 1.成员变量
    *   使用private修饰
    * 2.构造方法
    *   提供一个无参构造方法
    *   提供一个带多个参数的构造方法
    * 3.成员方法
    *   提供每一个成员变量对应的setXXX()/getXXX()
    *   提供一个显示对象信息的show()
    * 4.创建对象并为其成员变量赋值的两种方式
    *   无参构造方法创建对象后使用setXXX()赋值
    *   使用带参构造方法直接创建带有属性值的对象
    */
   // 成员变量
   private String name;
   private Integer age;
   // 无参构造方法
   public StandardClass() {
  }
   //带参构造方法
   public StandardClass(String name, Integer age) {
       this.name = name;
       this.age = age;
  }
   // getXXX() setXXX()
   public String getName() {
       return name;
  }

   public void setName(String name) {
       this.name = name;
  }

   public Integer getAge() {
       return age;
  }

   public void setAge(Integer age) {
       this.age = age;
  }

   public void show(){
       System.out.println(name + "," + age);
  }
}
package com.itheima;

public class test2 {
   public static void main(String[] args) {
       // 创建对象
       StandardClass sc = new StandardClass();
       sc.setName("zhangsan");
       sc.setAge(18);
       sc.show();

       StandardClass sc1 = new StandardClass("lisi",18);
       sc1.show();
  }
}

API

package com.itheima;

import java.util.Random;

public class MyAPI {
   /**
    * API概述
    * API Application Programming Interface:应用程序接口
    *
    * JavaAPI:指的就是JDK中提供的各种功能的Java类,无需关心实现,只需学习使用,帮助文档
    * 1.打开文档
    * 2.找到索引选项卡的输入框
    * 3.在输入框输入类
    * 4.看类在哪个包下
    * 5.看类的描述
    * 6.看构造方法
    * 7.看成员方法 返回值 方法名 参数
    */
   public static void main(String[] args) {
       Random r = new Random();
       int a = r.nextInt(10);
       System.out.println(a);
  }
}

字符串

  1. public String() 创建一个空白字符串对象,不含有任何内容
  2. public String(char[] chs) 根据字符数组的内容,来创建字符串对象
  3. public String(byte[] bys) 根据字节数组的内容,来创建字符串对象
  4. String s = "abc" 直接赋值的方式创建字符串对象,内容就是abc -- 推荐使用
  5. public boolean equals(Object anobject)
  6. public char charAt(int index):返回指定索引处的char值,字符串的索引也是从0开始的
  7. public int length():返回此字符串的长度
package com.itheima;

public class myString {
   /*
   String概述:
   1.java.lang包下,使用时不需要导包
   2.String类代表字符串,java程序中所有的字符串文字都被实现为此类的实例,也就是说,java程序中所有的双引号字符串,都是String类的对象
   3.字符串的特点
   字符串不可变,它们的值在创建后不能被更改
   虽然String的值时不可变的,但是它们可以被共享
   字符串效果上相当于字符数组char[]--~jdk8,但底层原理是字节数组byte[]--jdk9~

   String构造方法
   public String() 创建一个空白字符串对象,不含有任何内容
   public String(char[] chs) 根据字符数组的内容,来创建字符串对象
   public String(byte[] bys) 根据字节数组的内容,来创建字符串对象
   String s = "abc" 直接赋值的方式创建字符串对象,内容就是abc -- 推荐使用
    */
   public static void main(String[] args) {
       // public String() 创建一个空白字符串对象,不含有任何内容
       String s1 = new String();
       System.out.println("s1:" + s1);
       System.out.println("----------");
       // public String(char[] chs) 根据字符数组的内容,来创建字符串对象
       char[] chs = {'a','b','c'};
       String s2 = new String(chs);
       System.out.println("s2:" + s2);
       System.out.println("----------");
       // public String(byte[] bys) 根据字节数组的内容,来创建字符串对象
       byte[] bys = {97,98,99};
       String s3 = new String(bys);
       System.out.println("s3:" + s3);
       System.out.println("----------");
       // String s = "abc" 直接赋值的方式创建字符串对象,内容就是abc
       String s4 = "abc";
       System.out.println("s4:" + s4);
       System.out.println("----------");
  }
}
package com.itheima;

public class myString01 {
   /*
   String 对象的特点
   1.通过new创建的字符串对象,每一次new都会申请一个内存空间,虽然内存相同,但地址值不同
   2.以""方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次,jvm都只会建立一个String对象,并在字符串池中维护

   字符串比较
   使用 == 并比较
   1.基本数据类型:比较的是数据值是否相同
   2.引用数据类型:比较的是地址值是否相同

   字符串对象比较内容是否相同,通过equals()实现
   public boolean equals(Object anobject)
   将此字符串与指定对象进行比较,由于我们比较的是字符串对象,所以参数直接传递一个字符串
    */
   public static void main(String[] args) {
       char[] chs = {'a','b','c'};
       String s1 = new String(chs);
       String s2 = new String(chs);
       System.out.println(s1);
       // 比较字符串对象地址是否相同
       System.out.println(s1 == s2);

       String s3 = "abc";
       String s4 = "abc";
       System.out.println(s3);
       // 比较字符串对象地址是否相同
       System.out.println(s3 == s4);
       System.out.println(s1 == s3);
       System.out.println("----------");
       // 比较字符串对象的内容
       System.out.println(s1.equals(s2));
       System.out.println(s3.equals(s4));
       System.out.println(s1.equals(s3));
  }
}
package com.itheima;

import java.util.Scanner;

public class myString02 {
   public static void main(String[] args) {
       // 需求:已知用户名和密码,请用程序实现模拟用户登录,总共给三次机会,登录之后,给出相应的提示
       String n = "张三";
       String p = "123";
       Scanner sc= new Scanner(System.in);
       System.out.println("请输入用户名");
       String userName = sc.nextLine();
       System.out.println("请输入密码");
       String password = sc.nextLine();
       for(int i = 0; i < 3; i++)
      {
           if(userName.equals(n) && password.equals(p))
          {
               System.out.println("登录成功");
               break;
          }
           else
          {
               if(2 - i == 0)
              {
                   System.out.println("你的账户被锁定,请与管理员联系");
              }
               else
              {
                   System.out.println("用户名或密码错误,你还有" + (2 - i) + "次机会");
                   System.out.println("请输入用户名");
                   userName = sc.nextLine();
                   System.out.println("请输入密码");
                   password = sc.nextLine();
              }
          }
      }
  }
}
package com.itheima;

import java.util.Scanner;

public class myString03 {
   /*
   遍历字符串:
   public char charAt(int index):返回指定索引处的char值,字符串的索引也是从0开始的
   public int length():返回此字符串的长度
    */
   public static void main(String[] args) {
       // 需求:键盘录入一个字符串,使用程序实现在控制台遍历该字符串
       Scanner sc = new Scanner(System.in);
       System.out.println("请输入一个字符串:");
       String s = sc.nextLine();
       for(int i = 0; i < s.length(); i++)
      {
           System.out.println(s.charAt(i));
      }
  }
}
package com.itheima;

import java.util.Scanner;

public class myString04 {
   public static void main(String[] args) {
       // 需求:键盘录入一个字符串,统计该字符串中大写字母字符串,小写字母字符串,数字字符出现的次数
       int N = 0;
       int n = 0;
       int number = 0;
       Scanner sc = new Scanner(System.in);
       System.out.println("请输入一个字符串");
       String s = sc.nextLine();
       for(int i = 0; i < s.length(); i++)
      {
           if(s.charAt(i) >= 'A' && s.charAt(i) <= 'Z'){N++;}
           else if(s.charAt(i) >= 'a' && s.charAt(i) <= 'z'){n++;}
           else if(s.charAt(i) >= '0' && s.charAt(i) <= '9'){number++;}
      }
       System.out.println("大写字母:" + N);
       System.out.println("小写字母:" + n);
       System.out.println("数字:" + number);
  }
}
package com.itheima;

public class myString05 {
   public static void main(String[] args) {
       // 需求:定义一个方法,把int数组中的数据按照指定的格式拼接成一个字符串返回,调用该方法,并在控制台输出结果
       int[] arr = {1,2,3};
       String s = arrayToString(arr);
       System.out.println(s);

  }
   public static String arrayToString(int[] arr)
  {
       String s = "";
       s += "[";
       for(int i = 0; i < arr.length; i++)
      {
           if(i == arr.length - 1)
          {
               s += arr[i];
          }else {
               s += (arr[i] + ",");
          }
      }
       s += "]";
       return s;
  }
}
package com.itheima;

import java.util.Scanner;

public class myString06 {
   public static void main(String[] args) {
       // 需求:定义一个方法,实现字符串反转,键盘键入一个字符串,调用该方法后,在控制台输出
       Scanner sc = new Scanner(System.in);
       System.out.println("请输入一个字符串:");
       String s = sc.nextLine();
       reversalString(s);
  }
   public static void reversalString(String s)
  {
       char[] chs = new char[s.length()];
       for(int i = 0; i < s.length(); i++)
      {
           chs[s.length() - i -1] = s.charAt(i);
      }
       String ss = new String(chs);
       System.out.println(ss);

  }
}

StringBuilder

package com.itheima;

public class StringBuilder01 {
   /*
  如果对字符串进行拼接操作,每次拼接都会构建一个新的String对象,即耗时,又浪费内存空间,而这种操作还不可避免,那么有没有一种比较好的方式可以解决这个问题呢
  StringBuilder
  String:内容是不可变的
  StringBuilder:内容是可变的
  构造方法:
  1.public StringBuilder() 创建一个空白可变字符串对象,不含有任何内容
  2.public StringBuilder(String str) 根据字符串的内容,来创建可变的字符串变量
  添加和反转方法:
  1.public StringBuilder append(任意类型) 添加数据,并返回对象本身
  2.public StringBuilder reverse() 返回相反的字符序列

  String 和 StringBuilder 相互转换
  1.StringBuilder 转换为 String public String toString()
  2.String 转换为 StringBuilder public StringBuilder(String s)
   */
   public static void main(String[] args) {
       // public StringBuilder() 创建一个空白可变字符串对象,不含有任何内容
       StringBuilder sb = new StringBuilder();
       System.out.println("sb:" + sb);
       System.out.println("sb.length():" + sb.length());

       // public StringBuilder(String str) 根据字符串的内容,来创建可变的字符串变量
       StringBuilder sb2 = new StringBuilder("hello");
       System.out.println("sb2:" + sb2);
       System.out.println("sb2.length():" + sb2.length());

       // public StringBuilder append(任意类型) 添加数据,并返回对象本身
       StringBuilder sb3 = new StringBuilder();
       sb3.append("hello").append(",").append("world").append("!");
       System.out.println("sb3:" + sb3);

       // public StringBuilder reverse() 返回相反的字符序列
       System.out.println(sb3.reverse());

       // 转换
       String s = "hello";
       StringBuilder sb4 = new StringBuilder(s);
       sb4.append("world");
       sb4.reverse();
       s = sb4.toString();
       System.out.println(s);
  }
}
package com.itheima;

public class StringBuilder02 {
   public static void main(String[] args) {
       // 需求:定义一个方法,把int数组中的数据按照指定的格式拼接成一个字符串返回,调用该方法,并在控制台输入结果
       // 数组int[] arr = {1,2,3};,执行方法后的输出结果为:[1,2,3]
       int[] arr = {1,2,3};
       System.out.println(join(arr));

  }

   public static String join(int[] arr)
  {
       StringBuilder sb = new StringBuilder();
       sb.append("[");
       for(int i = 0; i < arr.length; i++)
      {
           if(i == arr.length-1)
          {
               sb.append(arr[i]);
          }
           else
          {
               sb.append((arr[i] + ","));
          }
      }
       sb.append("]");
       String s = sb.toString();
       return s;
  }
}
package com.itheima;

import java.util.Scanner;

public class StringBuilder03 {
   public static void main(String[] args) {
       // 需求:定义一个方法,实现字符串反转。键盘录入一个字符串,调用该方法后,在控制台输出结果
       // 键盘录入abc,输出结果cba
       Scanner sc = new Scanner(System.in);
       System.out.println("请输入一个字符串:");
       String s = sc.nextLine();
       System.out.println(reverse(s));
  }

   public static String reverse(String s)
  {
       StringBuilder sb = new StringBuilder(s);
       String res = sb.reverse().toString();
       return res;
  }
}

ArrayList

package com.itheima;

import java.util.ArrayList;

public class ArrayList01 {
   public static void main(String[] args) {
       /*
       需求:
       编程时如果需要存储多个数据,使用长度固定的数组存储格式,不一定满足我们的需求,更适应不了需求的变化
       集合 ArrayList java.util
       特点:提供了一种存储空间可变的存储模型,存储的数据容量可变化
       集合类有很多,目前学习一个 Arraylist
       特点:
       1.可调整大小的数组实现
       2.<E>是一种特殊的数据类型,泛型,在出现E的地方我们使用引用数据类型替换即可

       构造方法和添加方法
       1.public ArrayList() 创建一个空的集合对象
       2.public boolean add(E e) 将指定的元素追加到此集合的末尾
       3.public void add(int index,E element) 在此集合中的指定位置插入指定的元素

       常用方法
       public boolean remove(Object o) 删除指定的元素,返回删除是否成功
       public E remove(int index) 删除指定索引处的元素,返回被删除的元素
       public E set(int index,E element) 修改指定索引处的元素,返回被修改的元素
       public E get(int index) 返回指定索引处的元素
       public int size() 返回集合中元素的个数

       涉及到索引的方法需要防止索引越界
        */

       // ArrayList<String> arrayList = new ArrayList<String>()
       ArrayList<String> arrayList = new ArrayList<>(); // jdk7~新特性 可由前推断

       // public boolean add(E e) 将指定的元素追加到此集合的末尾
       arrayList.add("hello");
       arrayList.add("world");
       arrayList.add("!");

       // public void add(int index,E element)
       arrayList.add(1,",");
       // IndexOutOfBoundsException
       // arrayList.add(5,"数组索引越界");

       System.out.println(arrayList.remove(","));
       System.out.println(arrayList.remove(2));
       System.out.println(arrayList.get(1));
       System.out.println(arrayList.set(1,"java"));
       System.out.println(arrayList.size());
       System.out.println("arrayList:" + arrayList);

  }
}
package com.itheima;

import java.util.ArrayList;
import java.util.Scanner;

public class ArrayList02 {
   public static void main(String[] args) {
       // 需求:创建一个存储字符串的集合,存储三个字符串元素,使用程序实现在控制台遍历该集合
       Scanner sc = new Scanner(System.in);
       System.out.println("请输入第一个字符串");
       String s1 = sc.nextLine();
       System.out.println("请输入第二个字符串");
       String s2 = sc.nextLine();
       System.out.println("请输入第三个字符串");
       String s3 = sc.nextLine();

       ArrayList<String> arrayList = new ArrayList<>();
       arrayList.add(s1);
       arrayList.add(s2);
       arrayList.add(s3);

       for(int i = 0; i < arrayList.size(); i++)
      {
           System.out.print(arrayList.get(i));
      }
  }
}
package com.itheima;

import java.util.ArrayList;

public class ArrayList03 {
   public static void main(String[] args) {
       // 需求:创建一个存储学生对象的集合,存储三个学生对象,使用程序实现在控制台遍历该集合
       ArrayList<Student> students = new ArrayList<>();
       Student s1 = new Student("林青霞",18);
       Student s2 = new Student("张曼玉",18);
       Student s3 = new Student("王祖贤",18);

       students.add(s1);
       students.add(s2);
       students.add(s3);

       for(int i = 0; i < students.size(); i++)
      {
           System.out.println(students.get(i).getName());
           System.out.println(students.get(i).getAge());
      }
  }
}
package com.itheima;

public class Student{
   // 定义学生类
   private String name;
   private int age;

   // 定义构造方法
   public Student(){}

   public Student(String name,int age)
  {
       this.name = name;
       this.age = age;
  }

   public void setName(String name) {
       this.name = name;
  }

   public String getName() {
       return name;
  }

   public void setAge(int age) {
       this.age = age;
  }

   public int getAge() {
       return age;
  }
}
package com.itheima;

import java.util.ArrayList;
import java.util.Scanner;

public class ArrayList04 {
   public static void main(String[] args) {
       Scanner sc = new Scanner(System.in);
       ArrayList<Student> arrayList = new ArrayList<>();
       arrayListAdd(arrayList);
       for(int i = 0; i < arrayList.size(); i++)
      {
           System.out.println(arrayList.get(i));
           System.out.print(arrayList.get(i).getName());
           System.out.println(arrayList.get(i).getAge());
      }
  }

   public static void arrayListAdd(ArrayList<Student> arrayList)
  {
       Scanner sc = new Scanner(System.in);
       for(int i = 0; i < 3; i++)
      {
           Student s = new Student();
           System.out.println("请输入学生的姓名:");
           s.setName(sc.next());
           System.out.println("请输入学生的年龄:");
           s.setAge(sc.nextInt());
           System.out.println(s);
           arrayList.add(s);
      }
  }
}

Base05

继承

测试类

package com.itheima;

public class Extends01 {
   /**
    * 继承概述:继承是面向对象三大特征之一,可以使得子类具有父类的属性和方法,还可以在子类中重新定义,追加属性和方法
    * 继承的格式:public class 子类名 extends 父类名{}
    * 父类:基类、超类
    * 子类:派生类
    *
    * 继承中子类的特点:
    * 1.子类可以由父类的内容
    * 2.子类还可以由自己特有的内容
    *
    * 继承的好处与弊端:
    * 1.提高代码的复用性(多个类相同的成员可以放到同一个类中)
    * 2.提高了代码的维护性(如果方法的代码需要修改,修改一处即可)
    * 3.继承让类与类之间产生了关系,类的耦合性增强了,当父类发生变化时子类实现也不得不跟着变化,削弱了子类的独立性
    *
    * 什么时候使用继承?
    *
    * 继承中变量的访问特点(访问顺序):
    * 1.子类局部范围找
    * 2.子类成员范围找
    * 3.父类成员范围找
    * 4.如果都没有就报错(不考虑父亲的父亲)
    *
    * 存在局部变量的情况下:
    * 使用this 关键字:访问本类的成员变量、构造方法、成员方法
    * 使用super关键字:访问父类的成员变量、构造方法、成员方法
    *
    * 继承中构造方法的访问特点:
    * 1.子类中所有的构造方法默认都会访问父类中无参的构造方法
    * 2.因为子类都会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始化
    * 3.每一个子类构造方法的第一句默认都是:super()
    *
    * 父类中没有无参构造方法,只有有参构造方法
    * 1.通过使用super关键字去显式地调用父类的带参构造方法
    * 2.在父类中提供一个无参构造方法 推荐
    *
    * 继承中成员方法的访问特点:
    * 通过子类对象访问一个方法:
    * 1.子类成员范围找
    * 2.父类成员范围找
    * 3.如果都没有就报错(不考虑父亲的父亲)
    *
    * 方法重写:子类中出现了和父类中一模一样的方法声明
    * 什么时候使用方法重写?
    * 当子类需要父类的功能,而功能主题子类有自己特定的内容时,可以重写父类中的方法,这样,即沿袭了父类的功能,又定义了子类特有的内容
    * @Override 注解,帮助我们检查重写方法的方法声明的正确性
    *
    * 方法重写注意事项:
    * 1.私有方法不能被重写(父类私有成员子类是不能继承的)
    * 2.子类方法访问全年不能更低(public > 默认 > 私有)
    *
    * 继承的注意事项:
    * 1.类只支持单继承,不支持多继承
    * 2.类支持多层继承
    */
   public static void main(String[] args) {
       // 需求:定义老师类和学生类,然后写代码测试,最后找到老师类和学生类当中的共性内容,抽出一个父类,然后用继承的方式改写代码,并进行测试
/*       Teacher t1 = new Teacher();
       t1.setName("林青霞");
       t1.setAge(18);
       System.out.println(t1.getName() + t1.getAge());
       t1.teach();

       Teacher t2 = new Teacher();
       t2.setName("风清扬");
       t2.setAge(18);
       System.out.println(t2.getName() + t2.getAge());
       t2.teach();
       */
       Teacher t = new Teacher();
       t.setName("林青霞");
       t.setAge(18);
       System.out.println(t.getName() + t.getAge());
       t.teach();

       Teacher t1 = new Teacher("风清扬", 18);
       System.out.println(t1.getName() + t1.getAge());
       t1.teach();
  }
}

Person 类

package com.itheima;

public class Person {
private String name;
private Integer age;

public Person() {
}

public Person(String name, Integer age) {
this.name = name;
this.age = age;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Integer getAge() {
return age;
}

public void setAge(Integer age) {
this.age = age;
}
}

Teacher类

package com.itheima;

public class Teacher extends Person {
/*
private String name;
private Integer age;

public Teacher() {
}

public Teacher(String name, Integer age) {
this.name = name;
this.age = age;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Integer getAge() {
return age;
}

public void setAge(Integer age) {
this.age = age;
}
*/
public Teacher() {
}

public Teacher(String name, Integer age) {
super(name,age);
}

public void teach()
{
System.out.println("用爱成就每一位学员");
}
}

Student类

package com.itheima;

public class Student extends Person{
/* private String name;
private Integer age;

public Student() {
}

public Student(String name, Integer age) {
this.name = name;
this.age = age;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Integer getAge() {
return age;
}

public void setAge(Integer age) {
this.age = age;
}*/

public Student() {
}

public Student(String name, Integer age) {
super(name,age);
}

public void study()
{
System.out.println("好好学习天天向上");
}
}

Package

  1. 包其实就是文件夹

  2. 作用:对类进行分类管理

  3. 包的定义格式 package 包名;(多级包用.分开)

  4. 手动建包

    • 编译java文件 javac HelloWorld.java

    • 手动创建包 在X盘建立文件夹com,然后在com下建立文件夹itheima

    • 把class文件放到包的最里面 把HelloWorld.class文件放到com下的itheima这个文件夹下

    • 带包执行 java com.itheima.HelloWorld

  5. 自动见包

    • javac -d.HelloWorld.java

    • java com.itheima.HelloWorld

导包

  1. 使用不同包下的类时,使用的时候要写类的全路径,写起来较麻烦,为了简化带包的操作,Java提供了导包的操作

  2. 导包的格式:package 包名;

com.itheima demo

package com.itheima;

import com.itheima01.Teacher;

public class demo {
public static void main(String[] args) {
// com.itheima01.Teacher t = new com.itheima01.Teacher();
Teacher t = new Teacher();
t.teacher();
}
}

com.itheima01 Teacher

package com.itheima01;

public class Teacher {
public void teacher()
{
System.out.println("用爱成就每一位学员");
}
}

修饰符

权限修饰符

修饰符 同一个类中 同一个包中子类无关类 不同包的子类 不同包的无关类
private      
默认    
protect  
public

状态修饰符

  1. final(最终态)**可修饰成员方法、成员变量、类

    • 修饰方法:表明该方法是最终方法,不能被重写

    • 修饰变量:表明该变量是常量,不能被重新赋值

      • 修饰基本类型变量,基本数据的数据值不能发生改变

      • 修饰引用类型变量,引用类型的地址值不能发生改变,但是地址里的内容可以发生改变

    • 修饰类:表明该类是最终类,不能被继承

  2. static(静态)可修饰成员方法成员变量

    • 被类的所有对象共享 是我们判断是否使用静态关键字的条件

    • 可以通过类名调用,也可以通过对象名调用,推荐使用类名调用

    • 非静态的成员方法

      • 能访问静态/非静态的成员变量

      • 能访问静态/非静态的成员方法

    • 静态的成员方法

      • 能访问静态的成员方法/成员变量

    • 访问特点与资源加载时间前后相关,先加载的不能使用后加载的,而后加载则可以使用加载的

多态

  1. 同一个对象,在不同时刻表现出来的不同形态

举例:猫

猫是猫:猫 cat = new 猫();

猫是动物:动物 animal = new 猫();

  1. 多态的前提和体现

    • 有继承/实现关系

    • 有方法重写

    • 有父类引用指向子类对象

  2. 多态中成员的访问特点

    • 成员变量:编译看左边,执行看左边

    • 成员方法:编译看左边,执行看右边

    • 成员方法有重写,而成员变量没有

  3. 多态的好处和弊端

    • 多态的好处:提高了程序的扩展性

      • 具体体现:定义方法时,使用父类型作为参数,将来在使用的时候,使用具体的子类型参与操作

    • 多态的弊端:不能使用子类的特有功能

  4. 多态的转型

    • 向上转型 从子到父 父类引用指向子类对象

    • 向下转型 从父到子 父类引用转为子类对象

Animal

package com.itheima;

public class Animal {

public String name = "林青霞";

public Animal() {
}

public Animal(String name) {
this.name = name;
}



public void eat(){
System.out.println("吃饭");
}
}

Dog

package com.itheima;

public class Dog extends Animal{
public String name = "风清扬";

@Override
public void eat() {
System.out.println("狗吃骨头");
}

public void sleep(){
System.out.println("狗在睡觉");
}
}

Cat

package com.itheima;

public class Cat extends Animal{
public String name = "橙留香";

@Override
public void eat() {
System.out.println("猫吃鱼");
}
}

UseMethod

package com.itheima;

public class UseMethod {
public void Use(Dog d) // Dog d = new Dog();
{
System.out.println(d.name);
d.eat();
}

public void Use(Cat c) // Cat c = new Cat();
{
System.out.println(c.name);
c.eat();
}

/**
* 多态的好处:提高程序的扩展性
* 具体体现:定义方法时,使用父类型作为参数,将来在使用的时候,使用具体的子类型参与操作
* 多态的弊端:不能使用子类的特有功能
* 解决方案:转型 向上 向下
*/
public void Use(Animal a) // Animal a = new XXX();
{
System.out.println(a.name);
a.eat();
}
}

AnimalDemo

package com.itheima;

public class AnimalDemo {
public static void main(String[] args) {
/**
* 多态的前提和体现
* 1.有继承/实现关系
* 2.有方法重写
* 3.父类引用指向子类对象
*/
Animal animal = new Dog();
// 成员变量:编译看左边,执行看左边 即 编译时父类中有无该成员变量,若有该成员变量,则执行父类中的成员变量,若无该成员变量,则爆红
System.out.println(animal.name); // 父类中的name为林青霞
// System.out.println(animal.age);
// 成员方法:编译看左边,执行看右边 即 编译时父类有无该成员方法,若有该成员方法,则执行子类中的成员方法,若无该成员方法,则爆红
animal.eat(); // 父类中有eat方法,子类中重写了eat方法,执行子类中的eat方法 狗吃骨头

System.out.println("----Dog----");
UseMethod um = new UseMethod();
// Dog
Dog d = new Dog();
um.Use(d);
System.out.println("----Cat----");
// Cat
Cat c = new Cat();
um.Use(c);
System.out.println("----AnimalD----");
// Animal
Animal a = new Dog();
um.Use(a);
System.out.println("----AnimalC----");
a = new Cat();
um.Use(a);

System.out.println("----向上转型 父类引用指向子类对象----");
Animal animal1 = new Dog();
animal1.eat();
System.out.println("----向下转型 父类引用转为子类对象----");
// Dog dog = new Dog();
// dog = (Dog)animal;
Dog dog = (Dog)animal;
dog.sleep();
}
}

抽象类

  1. 在Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类

Animal

package com.itheima;

// 抽象类
public abstract class Animal {
/*
public void eat()
{
System.out.println("吃东西");
}
*/
// 抽象方法
public abstract void eat();
}

AnimalDemo

package com.itheima;

public class AnimalDemo {
public static void main(String[] args) {
/**
* 抽象类不是具体的
* Animal animal = new Animal();
*/
}
}
  1. 抽象类的特点

    • 抽象类和抽象方法必须使用abstract关键字修饰

    • 抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类

    • 抽象类不能实例化

      • 抽象类如何实例化?参照多态的方式,通过子类对象实例化,这叫抽象类多态

    • 抽象类的子类

      • 要么重写抽象类中的所有抽象方法

      • 要么是抽象类

Animal

package com.itheima01;
// 抽象类和抽象方法必须使用abstract关键字修饰
public abstract class Animal {

// 抽象类中不一定有抽象方法(无意义),有抽象方法的类一定是抽象类
public abstract void eat();

// 抽象类不能实例化,抽象类实例化必须参照多态的方式,通过子类对象实例化,这叫抽象类多态
public void sleep(){
System.out.println("睡觉");
}
}

Dog

package com.itheima01;

/**
* 抽象类的子类
* 要么重写抽象类中所有的抽象方法
* 要么是抽象类
* why
* 子类继承了父类的抽象方法,有抽象方法的类一定是抽象类
*/
/*
public abstract class Dog extends Animal{
// public abstract void eat();
}
*/
public class Dog extends Animal{
@Override
public void eat() {
System.out.println("狗吃骨头");
}
}

AnimalDemo

package com.itheima01;

public class AnimalDemo {
public static void main(String[] args) {
// 抽象类不能实例化
// Animal animal = new Animal();
// 抽象类多态
Animal animal = new Dog();
animal.eat();
animal.sleep();
}
}
  1. 抽象类的成员特点

    • 成员变量

      • 可以是变量,也可以是常量

    • 构造方法

      • 有构造方法,但是不能实例化

      • 那么,构造方法的作用是什么呢?用于子类访问父类数据的初始化

    • 成员方法

      • 可以有抽象方法:限定子类必须完成某些动作

      • 也可以有非抽象方法,提高代码复用性

Animal

package com.itheima02;

public abstract class Animal {
// 变量 常量
private String name = null;
private final Integer age = 18;
// 构造方法 用于子类访问父类数据的初始化
public Animal() {
}

public Animal(String name) {
this.name = name;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

// 非抽象方法提高代码复用性
public void sleep(){
name = "zhangsan";
// age = 19;
System.out.println(name + age);
System.out.println("睡大觉");
}
// 抽象方法 限定子类必须完成某些动作
public abstract void eat();
}

Dog

package com.itheima02;

public class Dog extends Animal{

@Override
public void eat() {
System.out.println("狗吃骨头");
}
}

AnimalDemo

package com.itheima02;

public class AnimalDemo {
public static void main(String[] args) {
Animal animal = new Dog();
animal.sleep();
animal.eat();
}
}

接口

Jumpping

package com.itheima;

public interface Jumpping {
// public static final -- 默认修饰符
public int num = 10;
public final int num2 = 20;
// public static final int num3 = 40;
int num3 = 40;

// public Inter(){};

public abstract void jump();
// void jump();
}

Dog

package com.itheima;

// public class Dog extends Object implements Jumpping{}
public class Dog implements Jumpping{

public Dog(){
super();// 访问的是基类Object的构造方法
}

@Override
public void jump() {
System.out.println("狗急跳墙");
}
}

Cat

package com.itheima;

public abstract class Cat implements Jumpping{
/*作为Jumpping接口(抽象的)的实现类,要么重写接口中的所有抽象方法,要么是抽象类*/
}

MyInterface

package com.itheima;

public class MyInterface01 {
/**
* 接口概述:
* 接口就是一种公共的规范标准,只要符合规范标准,大家都可以用
* Java中的接口更多的体现在对行为的抽象
*
* 接口的特点:
* 1.接口用关键字 interface修饰
* 2.类实现接口用implements表示
* 3.接口不能实例化
* 接口如何实例化呢?参照多态的方式,通过实现类对象实例化,这叫接口多态
* 多态的形式:具体类多态(不常用)、抽象类多态、接口多态
* 多态的而前提:有继承或者实现关系,有方法重写,有父类/接口引用指向子/实现类对象
* 4.接口的实现类
* 要么重写接口中的所有抽象方法
* 要么是抽象类
*
* 接口的成员特点
* 1.成员变量
* 只能是常量,默认修饰符:public static final
* 2.构造方法
* 接口没有构造方法,因为接口主要是对行为进行抽象的,是没有具体存在的
* 一个类如果没有父亲,默认继承自Object类
* 3.成员方法
* 只能是抽象方法
* 默认修饰符:public abstract
* 关于接口中的方法,jdk8与jdk9中有一些新特性
*/
public static void main(String[] args) {
// Jumpping j = new Jumpping(); // com.itheima.Jumpping是抽象的; 无法实例化
Jumpping j = new Dog();
j.jump();
// j.num = 20; // 接口中的成员变量默认被 final修饰,即为成员变量为常量,不可修改
System.out.println(j.num);
// j.num2 = 40; // final修饰,成员变量不可修改
System.out.println(j.num2);
// 接口中的数据默认使用static修饰
System.out.println(Jumpping.num);
System.out.println(Jumpping.num2);
}
}

ClassAndInterface

package com.itheima;

public class ClassAndInterface extends Object implements Interface,Interface1,Interface2 {
/**
* 类和接口的关系:
* 1.类和类的关系
* 继承关系,只能单继承,但是可以多层继承
* 2.类和接口的关系
* 实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口
* 3.接口和接口的关系
* 继承关系,可以是单继承,也可以是多继承
*
* 抽象类和接口的区别:
* 1.成员区别
* 抽象类:变量 常量 构造方法 抽象方法 非抽象方法
* 接口: 常量 抽象方法
* 2.关系区别
* 类与类:单继承 多层继承
* 接口与接口:单继承,多继承
* 类与接口:单实现,多实现
* 3.设计理念的区别
* 抽象类:对类抽象,包括属性和行为
* 接口:对行为抽象,主要是行为
* 例子:门和警报 将开关门放入抽象类,警报单独放入一个接口,继承开关门,实现警报
* 抽象类是对事物的抽象,而接口是对行为的抽象
* 分析问题时从具体到抽象实现抽象到具体,使用的时具体类的对象
*/
public static void main(String[] args) {

}
}

threeInterface

package com.itheima;

public interface Interface {
}

package com.itheima;

public interface Interface1 {
}

package com.itheima;

public interface Interface2 extends Interface,Interface1{
}

Base 06

常用API

Math

System

Object

Arrays

基本包装类型

日期类

Math

package com.itheima;

public class myMath {
   /**
    * java.lang包
    * Math包含执行基本数字运算的方法
    *
    * 没有构造方法,如何使用类中的成员呢?
    * 看类的成员是否都是静态的,如果是,通过类名就可以直接调用
    *
    * 常用方法
    * 1.public static int abs(int a) 返回参数的绝对值
    * 2.public static double ceil(double a) 返回大于或等于参数的最小double值,等于一个整数
    * 3.public static double floor(double a) 返回一个小于或等于参数的最大double值,等于一个整数
    * 4.public static int round(float a) 按照四舍五入返回最接近参数的int
    * 5.public static int max(int a, int b) 返回两个int值中的较大值
    * 6.public static int min(int a, int b) 返回两个int值中的较小值
    * 7.public static double pow(double a, double b) 返回a的b次幂的值
    * 8.public static double random() 返回值为double的正值,[0.0,1.0)
    */
   public static void main(String[] args) {
   // 1.public static int abs(int a) 返回参数的绝对值
       System.out.println(Math.abs(88));
       System.out.println(Math.abs(-88));
       System.out.println("--------");
   // 2.public static double ceil(double a) 返回大于或等于参数的最小double值,等于一个整数
       System.out.println(Math.ceil(12.34));
       System.out.println(Math.ceil(12.56));
       System.out.println("--------");
   // 3.public static double floor(double a) 返回一个小于或等于参数的最大double值,等于一个整数
       System.out.println(Math.floor(12.34));
       System.out.println(Math.floor(12.56));
       System.out.println("--------");
   // 4.public static int round(float a) 按照四舍五入返回最接近参数的int
       System.out.println(Math.round(12.34F));
       System.out.println(Math.round(12.56F));
       System.out.println("--------");
   // 5.public static int max(int a, int b) 返回两个int值中的较大值
       System.out.println(Math.max(66,88));
       System.out.println("--------");
   // 6.public static int min(int a, int b) 返回两个int值中的较小值
       System.out.println(Math.min(66,88));
       System.out.println("--------");
   // 7.public static double pow(double a, double b) 返回a的b次幂的值
       System.out.println(Math.pow(2.0,3.0));
       System.out.println("--------");
   // 8.public static double random() 返回值为double的正值,[0.0,1.0)
       System.out.println(Math.random());
       System.out.println((int)(Math.random() * 100) + 1);
  }
}

System

package com.itheima;


public class MySystem {
   /**
    * java.lang
    *
    * 没有构造方法,如何使用类中的成员呢?
    * 看类的成员是否都是静态的,如果是,通过类名就可以直接调用
    *
    * 常用方法
    * 1.public static void exit(int status) 终止当前运行的Java虚拟机,非零表示异常终止
    * 2.public static long currenTimeMillis() 返回当前时间(以毫秒为单位)
    */
   public static void main(String[] args) {
       System.out.println("开始");
       // 1.public static void exit(int status) 终止当前运行的Java虚拟机,非零表示异常终止,零表示正常终止
       // System.exit(0);
       System.out.println("结束");
       // 2.public static long currenTimeMillis() 返回当前时间(以毫秒为单位)
       System.out.println(System.currentTimeMillis() * 1.0 / 1000 / 60 / 60 / 24 / 365 + "年");

       long start = System.currentTimeMillis();
       for(int i = 0; i < 10000; i++){
           System.out.println(i);
      }
       long end = System.currentTimeMillis();
       System.out.println("共耗时:" + (end - start) + "毫秒");
  }
}

Object

  1. public String toString() 返回对象的字符串表示形式。建议所有子类重写该方法,自动生成

  2. public boolean equals(Object obj) 比较对象是否全等。默认比较地址,重写可以比较内容,自动生成

// Student 类
package com.itheima;

public class Student extends Object{
   private String name;
   private Integer age;

   public Student() {
  }

   public Student(Integer age) {
       this.age = age;
  }

   public String getName() {
       return name;
  }

   public void setName(String name) {
       this.name = name;
  }

   public Integer getAge() {
       return age;
  }

   public void setAge(Integer age) {
       this.age = age;
  }

   @Override
   public String toString() {
       return "Student{" +
               "name='" + name + '\'' +
               ", age=" + age +
               '}';
  }
}
// 测试类
package com.itheima;

public class MyObject {
   /**
    * java.lang
    * Object是类层次结构的根,每个类都可以将Object作为超类,所有类都直接或间接的继承自该类
    * 构造方法 public Object(){}
    * 为什么说子类的构造方法默认访问的是父类的无参构造方法?
    * 因为它们的顶级父类只有无参构造方法
    */
   public static void main(String[] args) {
       Student s = new Student();
       s.setName("林青霞");
       s.setAge(18);
       System.out.println(s); // com.itheima.Student@1b6d3586 println底层间接调用了toString
       System.out.println(s.toString()); // com.itheima.Student@1b6d3586

       // to.String() 重写后
       System.out.println(s); // Student{name='林青霞', age=18}
       System.out.println(s.toString()); // Student{name='林青霞', age=18}
  }
}
// Student类
package com.itheima01;

import java.util.Objects;

public class Student extends Object{
   private String name;
   private Integer age;

   public Student() {
  }

   public Student(Integer age) {
       this.age = age;
  }

   public String getName() {
       return name;
  }

   public void setName(String name) {
       this.name = name;
  }

   public Integer getAge() {
       return age;
  }

   public void setAge(Integer age) {
       this.age = age;
  }

   @Override
   public String toString() {
       return "Student{" +
               "name='" + name + '\'' +
               ", age=" + age +
               '}';
  }

   @Override
   public boolean equals(Object o) {
       /**
        * this --- s
        * o --- s1 隐含向上转型
        */
       // 比较二者的地址值,如果地址值相等,返回true
       if (this == o) return true;
       // 判断参数是否为null
       // 利用s、s1的字节码文件判断两个对象是否来自同一个类
       if (o == null || getClass() != o.getClass()) return false;
       // 向下转型
       Student student = (Student) o;
       // 比较二者内容是否相同
       return Objects.equals(name, student.name) && Objects.equals(age, student.age);
  }
}
// 测试类
package com.itheima01;

import com.itheima.Student;

public class MyEquals {
   public static void main(String[] args) {
       Student s = new Student();
       s.setName("林青霞");
       s.setAge(18);

       Student s1 = new Student();
       s.setName("风清扬");
       s.setAge(18);

       // 需求:比较两个对象的内容是否相同
       System.out.println(s == s1); // false 比较的是地址值
       System.out.println(s.equals(s1)); // false 默认equals()方法比较的是地址值,所以需要重写
/*       public boolean equals(Object obj) {
           // this --- s
           // obj --- s1
           // 比较的仍是地址值,因此需重写方法
           return (this == obj);
       }
       */
       String name1 = "林青霞";
       String name2 = "林青霞";
       System.out.println(name1.equals(name2)); // equals 方法已重写 true,可直接比较内容
  }
}

Arrays

  1. 冒泡排序

    • 排序:将一组数据按照固定的规则进行排列

    • 冒泡排序:一种排序的方式,对要进行排序的数据中相邻的数据进行两两比较,较大的数据放在前面,依次对所有的数据进行排序,直至所有数据按要求完成排序

基本类型包装类

日期类

异常

MyException

package com.itheima;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;

public class MyException01 {
   /**
    * 异常概述
    * 异常:程序出现了不正常的情况
    * 异常体系:
    * Throwable ↓
    * Error Exception ↓
    * RuntimeException 非RuntimeException
    * Error:严重问题,不需要处理,如硬件问题,存储问题
    * Exception:称为异常类,它表示程序本身可以处理的问题
    * RuntimeException:在编译期是不检查的,出现问题后,需要我们回来修改代码
    * 非RuntimeException:编译器就必须处理的,否则程序不能正常通过编译,就更不能正常运行了
    *
    * JVM的默认处理方案:
    * 如果程序出现了问题,我们没有做任何处理,最终JVM会做默认的处理
    * 把异常的名称、异常原因以及异常出现的位置等信息输出在了控制台
    * 程序停止执行
    *
    * 异常处理:程序中某一部分出现问题不应影响后续执行,而JVM中,一旦出现问题,输出异常信息在控制台后,程序停止执行
    * 如果程序出现问题,我们需要自己来处理,有两种方案:
    * try...catch...
    * throws
    *
    * try...catch...
    * 格式:try{可能出现异常的代码;}catch(异常类名 变量名){异常的处理代码;}
    * 执行流程:
    * 程序从try里面的代码开始执行
    * 出现异常,会自动生成一个异常类对象,该异常对象将会被提交给Java运行时系统
    * 当Java运行时系统接收到异常对象时,会到catch中去找匹配的异常类,找到后执行异常处理
    * 执行完毕之后,程序还可以继续往下执行
    *
    * Throwable的成员方法:
    * 1.public String getMessage() 返回此throwable的详细消息字符串
    * 2.public String toString() 返回此可抛出的简单描述
    * 3.public void printStackTrace() 把异常的错误信息输出在控制台
    * 三个成员方法输出内容为包含关系 3 -- 2 -- 1
    *
    * 编译时异常和运行时异常的区别 受检异常和非受检异常
    * 编译时异常:必须显示处理,否则程序就会发生错误,无法通过编译
    * 运行时异常:无需显示处理,也可以和编译时异常一样处理
    *
    * throws 虽然我们通过try...catch...可以对异常进行处理,但是并不是所有的情况我们都有权限进行异常的处理
    * 格式:throws 异常类名; 注意:这个格式时跟在方法的括号后面的
    *
    * 编译时异常必须要进行处理,两种处理方案:try...catch...或者throws,如果采用throws这种方案,将来谁调用谁处理
    * 运行时异常可以不处理,需要我们回来修改代码
    *
    * 自定义异常
    * throws
    * 用在方法声明后面,跟的是异常类名
    * 表示抛出异常,由该方法的调用者来处理
    * 表示出现异常的一种可能性,并不一定会发生这些异常
    * throw
    * 用在方法体内,跟的是异常对象名
    * 表示抛出异常,由方法体内的语句处理
    * 执行throw一定抛出了某种异常
    *
    */
   public static void main(String[] args) {
       System.out.println("开始");
       // try...catch
       method();
       method1();
       System.out.println("--------");
       // throws 可以直接抛出异常,但并不往下执行,所以还需要利用try...catch...使它能够进行后续执行
       try{
           method2();
      }catch (ArrayIndexOutOfBoundsException e){
           e.printStackTrace();
      }
       try {
           method3();
      } catch (ParseException e) {
           e.printStackTrace();
      }
       System.out.println("结束");
       System.out.println("--------");
       Scanner sc = new Scanner(System.in);
       System.out.println("请输入学生分数:");
       int score = sc.nextInt();
       Teacher t = new Teacher();
       try {
           t.checkScore(score);
      } catch (ScoreException e) {
           e.printStackTrace();
      }
  }

/*   public static void method(){
       int[] arr = {1,2,3};
       System.out.println(arr[3]);
   }
   */
   public static void method(){
       try{
           int[] arr = {1,2,3};
           // 运行时异常 非受检异常
           System.out.println(arr[3]); // new ArrayIndexOutOfBoundsException() 与下方的异常类匹配,则执行异常处理
      }catch (ArrayIndexOutOfBoundsException e){
           // System.out.println("你访问的数组索引不存在");
           e.getMessage();
           e.toString();
           e.printStackTrace();
      }
  }
   /*
   * 开始
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
at com.itheima.MyException01.method(MyException01.java:29)
at com.itheima.MyException01.main(MyException01.java:23)*/

   public static void method1(){
       try{
           // 编译时异常 受检异常
           // parse红色波浪线提示,即s与sdf模式匹配可能出现问题,即模式不一致,当前二者模式一致,匹配成功,则不会发生异常,当还是需要提防模式匹配不一致
           String s = "2022-8-17";
           SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
           Date date = sdf.parse(s);
           System.out.println(date);
      }catch (ParseException e){
           e.printStackTrace();
      }
  }

   // 编译时异常 -- throws
   public static void method2() throws ArrayIndexOutOfBoundsException {
       int[] arr = {1, 2, 3};
       System.out.println(arr[3]);
  }

   // 运行时异常 -- throws
   public static void method3() throws ParseException {
       String s = "2022-8-17";
       SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
       Date date = sdf.parse(s);
       System.out.println(date);
  }
}

ScoreException

package com.itheima;

public class ScoreException extends Exception {
   public ScoreException() {
  }

   public ScoreException(String message) {
       super(message);
  }
}

Teacher

package com.itheima;

public class Teacher {
   // 编译时异常,需要在方法的括号后抛出
   // 运行时异常,可以不抛出
   // 编译时异常
   public void checkScore(int score) throws ScoreException {
       if(score < 0 || score > 100){
           // 无s用于方法体内抛出异常对象,自定义的需要手动抛
           // throw new ScoreException();
           throw new ScoreException("分数有误,应当在0~100之间");
      }else{
           System.out.println("您的分数正确");
      }
  }
}

Base07

集合体系结构

集合类的特点:提供一种存储空间可变的存储模型,存储的数据容量可以随时发生改变

Collection

List

Set

泛型

Map

Collections

     
集合    
Collection 单列 接口   Map双列 接口
List 可重复 接口 set 不可重复 接口  
ArrayList、LinedList、…等实现类 HashSet、TreeSet、…等实现类 HashMap、…等实现类

Collection

MyCollection

package com.itheima.Collection;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class MyCollection01 {
   /**
    * alt + 7 打开类的所有信息窗口
    * Collection集合概述和使用
    * java.util
    * 1.是单例集合的顶层几口,它表示一组对象,这些对象也称为Collection的元素
    * 2.JDK不提供此接口的任何直接实现,它提供更具体的子接口(set和list)的实现
    *
    * 创建Collection对象
    * 1.多态的方式
    * 2.具体的实现类ArrayList
    *
    * Collection集合常用方法
    * 1.boolean add(E e) 添加元素
    * 2.boolean remove(Object o) 从集合中移除指定的元素
    * 3.void clear() 清空集合中的元素
    * 4.boolean contains(Object o) 判断集合中是否存在指定的元素
    * 5.boolean isEmpty() 判断集合是否为空
    * 6.int Size() 集合的长度,也就是集合中元素的个数
    *
    * Collerction集合的遍历
    * java.util
    * Iterator:迭代器,集合的专用遍历方式
    * Iterator<E> itertor():返回此集合中元素的迭代器,通过集合的Iterator()方法得到
    * 迭代器是通过集合的Iterator()方法得到的,所以我们说它是依赖于集合而存在的
    *
    * Iterator常用方法
    * 1.E next():返回迭代中的下一个元素
    * 2.boolean hasNext():如果迭代具有更多元素,则返回true
    *
    * 集合的使用步骤
    *
    */
   public static void main(String[] args) {
       Collection<String> c = new ArrayList<>();
       // 添加元素: boolean add(E e)
       c.add("Hello");
       c.add(",");
       c.add("world");
       System.out.println(c);
       // boolean remove(Object o)
       c.remove(",");
       System.out.println(c);
       // boolean contains(Object o)
       System.out.println(c.contains("world"));
       // int Size()
       System.out.println(c.size());
       // void clear()
       // c.clear();
       // boolean isEmpty()
       System.out.println(c.isEmpty());
       System.out.println(c);
       System.out.println("--------");

       // 集合的遍历
       Iterator<String> it = c.iterator();
       while(it.hasNext()){
           String s = it.next();
           System.out.println(s);
      }

  }
}

Student

package com.itheima.Collection;

public class Student {
   private String name;
   private Integer age;

   public Student() {
  }

   public Student(String name, Integer age) {
       this.name = name;
       this.age = age;
  }

   public String getName() {
       return name;
  }

   public void setName(String name) {
       this.name = name;
  }

   public Integer getAge() {
       return age;
  }

   public void setAge(Integer age) {
       this.age = age;
  }

   @Override
   public String toString() {
       return "Student{" +
               "name='" + name + '\'' +
               ", age=" + age +
               '}';
  }
}

example

package com.itheima.Collection;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class example {
   public static void main(String[] args) {
       // 需求:创建一个存储学生对象的集合,存储三个学生对象,使用程序实现在控制台遍历该集合
       // 创建学生对象
       Student stu = new Student("林青霞",18);
       Student stu01 = new Student("风清扬",18);
       Student stu02 = new Student("橙留香",18);

       // 创建Collection对象
       Collection<Student> c = new ArrayList<>();

       // 把学生添加到集合
       c.add(stu);
       c.add(stu01);
       c.add(stu02);

       // 遍历迭代器
       Iterator<Student> it = c.iterator();
       while(it.hasNext()){
           Student s = it.next();
           System.out.println(s.toString());
      }

  }
}

List

MyList

package com.itheima.List;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class MyList01 {
   /**
    * List集合概述和特点
    * java.util
    * 1.有序集合(也称为序列),用户可以精准控制列表中每个元素的插入位置,用户可以通过整数索引访问元素,并搜索列表中的元素
    * 2.与Set集合不同,列表通常允许重复的元素
    *
    * List集合特点
    * 1.有序:存储和取出的元素顺序一致
    * 2.可重复:存储的元素可以重复
    *
    * List集合特有方法
    * 1.void add(int index,E element) 在此集合中的指定位置插入指定的元素
    * 2.E remove(int index) 删除指定索引处的元素,返回被删除的元素
    * 3.E set(int index,E element) 修改指定索引处的元素,返回被修改的元素
    * 4.get(int index) 返回指定索引处的元素
    */
   public static void main(String[] args) {
       // 创建集合对象
       List<String> l = new ArrayList<>();
       // 添加元素
       l.add("hello");
       l.add("world");
       l.add("world");
       // 输出集合元素
       System.out.println(l);
       // 遍历
       Iterator<String> it = l.iterator();
       while(it.hasNext()){
           String s = it.next();
           System.out.println(s);
      }

       // void add(int index,E element) 在此集合中的指定位置插入指定的元素
       l.add(1,"helloo");
       System.out.println(l);
       // l.add(11,"helloo"); // IndexOutOfBoundsException
       // E remove(int index) 删除指定索引处的元素,返回被删除的元素
       System.out.println(l.remove(1));
       System.out.println(l);
       // System.out.println(l.remove(11)); // IndexOutOfBoundsException
       // E set(int index,E element) 修改指定索引处的元素,返回被修改的元素
       System.out.println(l.set(2,"java"));
       // System.out.println(l.set(11,"java")); // IndexOutOfBoundsException
       System.out.println(l);
       // E get(int index) 返回指定索引处的元素
       System.out.println(l.get(1));
       // System.out.println(l.get(11)); // IndexOutOfBoundsException

       // 遍历集合 迭代器/索引
       for(int i = 0; i < l.size(); i++){
           String s = l.get(i);
           System.out.println(s);
      }
  }
}

Student

package com.itheima.List;

public class Student {
   private String name;
   private Integer age;

   public Student() {
  }

   public Student(String name, Integer age) {
       this.name = name;
       this.age = age;
  }

   public String getName() {
       return name;
  }

   public void setName(String name) {
       this.name = name;
  }

   public Integer getAge() {
       return age;
  }

   public void setAge(Integer age) {
       this.age = age;
  }

   @Override
   public String toString() {
       return "Student{" +
               "name='" + name + '\'' +
               ", age=" + age +
               '}';
  }
}

example

package com.itheima.List;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class exmaple {
   public static void main(String[] args) {
       // 需求:创建一个存储学生对象的集合,存储三个学生对象,使用程序实现在控制台遍历该集合
       // 创建学生对象
       Student stu = new Student("林青霞",18);
       Student stu01 = new Student("风清扬",18);
       Student stu02 = new Student("橙留香",18);
       // 创建List集合对象
       List<Student> l = new ArrayList<>();
       // 把学生添加到集合
       l.add(stu);
       l.add(stu01);
       l.add(stu02);
       // 遍历集合 迭代器/for循环
       // 迭代器
       System.out.println("----迭代器----");
       Iterator<Student> it = l.iterator();
       while(it.hasNext()){
           Student s = it.next();
           System.out.println(s);
      }
       System.out.println("----for----");
       for(int i = 0; i < l.size(); i++){
           Student s = l.get(i);
           System.out.println(s);
      }

  }
}
版权声明:本文为little3star原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/little3star/p/16596973.html