1.计算机语言的发展史 机器语言 汇编语言 高级语言 Java,C++,PHP 2. 变量 变量: 是一个容器,用来存储数据的 语法: 1.声明的同时直接赋值 数据类型 变量名 = 值; // 数据类型: String 字符串数据类型 // 变量名 : 本身取的名字 // = : 赋值符号 // 值 : 数据 // ; : 表明语句结束 例子: String name = "传智播客";// 定义一个变量 /* String 数据类型 表示字符串的数据类型 name 是变量名 本身取的名字 = 赋值用的 把等于号右边的数据赋值给左边的变量 "" Java里面字符串就要用双引号引发来 ; 表明语句结束 */ 2. 先声明后赋值 数据类型 变量名; // 表明声明了一个变量 变量名 = 值; // 把值赋给变量 String name;// 开辟了一块空间,空间的名字是name name = "黑马程序员";// 赋值 注意:变量里面的数据是能够被覆盖的 变量命名的规则: 1.只能由字母(a_zA_Z),数字(0-9),下划线(_),美圆符号($)组成 2.不能以数字开头 1name 错误 3.不能与关键字重名 关键字就是系统保留的字,具备特殊含义 4.严格区分大小写 name Name 变量命名的规范: 知名达意 驼峰命名法 String myName; 若是变量名有多个单词,那么就从第二个单词开始全部单词的首字母大写 String my_name; 常见的数据类型: int double char String boolean(true\false) 数据类型: 1.常见的数据类型 2. 基本数据类型 4类8种 整数: byte short int 整数直接写默认是int类型 正负21亿之间 long 小数: float float类型的值必须加f\F,不加会报错 double 小数直接写默认是double类型 字符: char 字符类型的值必需要用单引号引发来,而且单引号只能有一个字符 布尔: boolean (true\false) 3. 引用数据类型 String 字符串 1KB = 1024字节; 1MB = 1024KB; 1GB = 1024MB; 1.变量 概述:就是一个容器,用于存储数据的 语法: 1.声明的同时直接赋值 数据类型 变量名 = 值; String name = "传智播o客"; 2.先声明后赋值 声明: 数据类型 变量名; String name; 赋值: 变量名 = 值; name = "黑马程序员"; 标识符命名规则: 1.只能由字母,数字,下划线,美圆符号组成 2.不能以数字开头 3.不能与关键字重名 4.严格区分大小写 标识符命名规范: 知名达意 2.运算符 算术运算符: + - * / % 注意:2个整数相除,获得的结果必定是整数 比较运算符: > >= < <= == != // 比较表达式的结果必定是 boolean 类型的数据,因此比较表达式能够做为if结构的条件判断 逻辑运算符: // 逻辑运算符的2边必定要是 boolean 类型的数据 /* && 逻辑与 只要有false,逻辑&&表达式的结果就是 false,只有当两边同时为true ,逻辑&&表达式的结果才是true 遇 false ,则 false || 逻辑或 只要有true,逻辑||表达式的结果就是 true,只有当两边同时为 false,逻辑||表达式的结果才是 false; 遇 true ,则 true ! 逻辑非 真变假 假变真 & 遇 false 则 false | 遇 true ,则 true */ && 短路的问题 只要逻辑&&的左边为 false ,逻辑&&的右边就不会运算 || 短路的问题 只要逻辑||的左边为 true,逻辑||的右边就不会运算 复合赋值运算符: = += -= *= /= %= 自增\自减运算符: ++ -- // 表达式的值 变量的值 // 表达式 : 由运算符链接起来的式子就是表达式 // ++ 运算符 /* num++ 后自增表达式: 运算法则:先取变量(num)自身的值做为表达式的值,而后将变量自身+1 ++num 前自增表达式: 运算法则:先将变量自身的值+1,而后将变量的值做为表达式的值 总结: 不论是前自增仍是后自增,变量自身的值都得+1 num-- 后自减表达式: 运算法则:先取变量(num)自身的值做为表达式的值,而后将变量自身-1 --num 前自减表达式: 运算法则:先将变量自身的值-1,而后将变量的值做为表达式的值 总结:不论是前自减仍是后自减,变量自身的值都得-1 */ // int num = 3; // // int res = ++num - num-- - ++num + num++ + ++num; // 4/4 4/3 4/4 4/5 6/6 // int res = (++num) - (num--) - (++num) + (num++) + (++num);// 4-4-4+4+6 // System.out.println(res);//6 // System.out.println(num);//6 // int num = 3; // int res = num--; // System.out.println(res);//3 // System.out.println(num);//2 // int num = 3; // int res = --num; // System.out.println(res);//2 // System.out.println(num);//2 // int num = 3; // int res = ++num; // System.out.println(res);//4 // System.out.println(num);//4 // int num = 3; // int res = num++; // System.out.println(res);//3 // System.out.println(num);//4 3.定义类\定义方法 定义类的语法: public class 类名{// 类名:符合标识符命名规则 从第一个单词开始全部单词的首字母大写 // 属性(变量) // 方法(方法) } 定义方法的语法: public 返回值类型 方法名(数据类型 参数1,数据类型 参数2,...){ // 方法体 返回值: 根据方法的功能是否有返回值,若是方法没有返回值,返回值类型就是 void 若是有返回值,返回值的数据类型就是方法的返回值类型,而且要有 return 语句 方法名: 本身取 参数: 用来传递数据的 } 注意: 1.方法和方法之间是平行关系 2.方法不调用不会执行 4. 选择结构 补充: // 成员变量: 定义在类里面,方法的外面的变量,系统会自动赋默认值 // 局部变量: 定义在方法里面的变量,系统不会赋默认值 // 变量没有赋值是不能直接使用的 经常使用的数据类型 初始值 int 0 float 0.0 double 0.0 char 空(0) String null boolean false 3.运算符: 算术运算符: + - * / %(取模\取余数) 注意: 2个整数相除,获得的结果必定是整数(取整数部分) 比较运算符: 逻辑运算符: 赋值运算符: = 4.程序的结构 顺序结构 分支\选择结构 1. if(条件语句){ // 任意的代码 条件成立,就会执行,条件不成立,就不会执行 } 2. if(条件){ // 条件成立,就会执行的代码 1 }else{ // 条件不成立,就会执行的代码 2 } // 因此代码1 和代码2 不会同时执行,也不会同时不执行 3. if(条件1){ // 代码1 }else if(条件2){ // 代码2 }else if(条件3){ // 代码3 }else{ // 代码4 } 循环结构: 5.注释 // 注释: 大白话就是用来解释代码的,给程序员看的,不参与程序的运行 // 分类: // 单行注释 // 添加\取消单行注释快捷键 ctrl + / // 多行注释 /* 多行注释 注意: 多行注释不能嵌套多行注释 */ // 文档注释 /** 文档注释 主要用于注释类\方法 */ 6.定义类和方法 如何写类 概念: 就是一群具备相同特征和行为的事物的统称 语法: 权限修饰符 class 类名{ // 类的特征\属性 // 类的行为\方法 } 权限修饰符: public 类名: 本身取的名字 符合标识符命名规则和规范 类名是从第一个单词开始每一个单词的首字母大写 如何写方法 简单的方法: 无参数无返回值的方法 语法: 权限修饰符 返回值类型 方法名(数据类型 参数名1,数据类型 参数名2,....){ // 方法体\功能代码 } 权限修饰符: public 返回值类型: 无返回值 void 有返回值 返回的数据是什么数据类型那么返回值类型就是什么数据类型 方法名: 本身取 符合标识符命名规则和规范 方法名是从第二个单词开始每一个单词的首字母大写 参数: 用来传递数据的 若是不须要外界传数据 那就空着 方法体: 功能代码\执行的代码 注意: 方法不调用不会执行 调用方法: 方法名(实际参数); // 实际参数: 具体的值 1. 本身定义的方法 1.明确方法的返回值类型 ---> 有返回值 ---> 整数int 2.明确方法名 --> 本身定义 ---> add 3.明确方法的参数 ---> 2个参数 都是 int 类型 4.明确方法的功能 2. 调用别人的方法 1.明确方法的功能 2.明确方法的方法名 3.明确方法的参数 4.明确方法的返回值 // add() 加法 ----> 计算2个整数之和 10 + 30 40 - 2 调用方法的语法: 方法名(实际参数); 知识点补充: 1.java语言是严格区分大小写 2.面向过程:按照步骤一步一步执行 3.面向对象:找专业的人作专业的事情 4.字符串的相加: 其实就是拼接 // 补充: 任何数据类型的数据和字符串相加,就会拼接成一个新的字符串 System.out.println(5+"heima");//5heima alt + / System.out.println(5+5+"heima");//10hiema System.out.println("heima"+5);// heima5 System.out.println("heima"+5+5);//hiema55 // 引用数据类型: String // 1.隐式类型转换 把小范围的数据 赋值给 大范围的变量 会自动转换 double d = 14; // 2.强制类型转换 把大范围的数据 赋值给 小范围的变量 int num = (int)1.73; 面向对象与面向过程 面向过程: 第一步作什么,第二步,第三步作什么 面向对象:调用对象的方法作事情 万物皆对象 在Java语言中,咱们经过类建立对象 属性:事物体现的外在特征,名词 ==> 成员变量 行为:事物可以作什么, 动词 ==> 成员方法 经过Java语言去描述事物 1.定义类 定义成员变量 定义成员方法 2.使用这个类建立对象 建立对象,调用对象的属性和行为 类与对象 类:具备一组相关属性和行为的集合, 模版,图纸 对象:该类事物的具体体现,具体的产品 封装 把对象的属性和访问细节给隐藏起来, 仅对外提供公共的访问方式 1. 不能让别人直接访问个人成员变量 --> 经过private关键字 2. 提供公共的访问方式 --> 经过set方法赋值, 经过get方法取值 变量访问的原则: 就近原则. 也就是说, 局部位置有, 就使用局部变量. 局部位置没有, 才去找成员变量. this 表明当前的这个对象 用来解决局部变量与成员变量的重名问题 构造方法 构造方法有且仅有一个做用, 那就是用来建立对象 当咱们没有写构造方法时, 系统会为咱们默认提供一个无参构造. 当咱们写了构造方法时, 系统就不会再给咱们提供默认的无参构造了 构造方法的格式 public 类名(xxx){ } 注意: 方法名与类名一致,连大小写也要同样 构造方法没有返回值类型, 连void也没有 有参构造与带参构造的区别 共同点: 不管是有参构造仍是无参构造, 都建立出了对象 区别: 带参构造在建立对象的同时, 为属性进行了赋值 数组的两种定义方式 静态初始化方式: String[] names = {"A","B","C","D","E"}; 动态初始化方式: String[] names = new String[5]; 数组的索引 数组在内存中是连续的, 因此咱们能够经过索引去找到对应位置的元素. 在Java语言中咱们规定,数组的索引是从0开始的. 获取数组中的元素 根据索引获取对应位置上的元素: 数组名[索引] 数组的长度 数组名.length 数组中的最大索引,最后一个元素对应的索引 数组的长度-1 1. static ---> 静态的意思 修饰成员变量: ----> 静态成员变量 1. 资源共享,被static修饰的成员变量会被该类下的全部对象共享,也就是说全部对象使用的是同一份数据 2. 能够用类名.属性名去访问 修饰成员方法: ---> 静态方法 1. 位置: 返回值类型以前 2. 能够用类名.方法名调用方法(不用建立对象了) 注意: 1. 静态方法里面不能够有this 2. 静态方法里面只能直接使用静态(静态成员变量\静态成员方法) 2. 包: 概述: 文件夹 导包: ctrl + shift + o // java.lang 这个包下的类是不须要导包的,其余的都须要导包 3. 工具类: 是一个概念,通常工具类的文件名为 功能名称+Utils 工具类里面的方法通常都是静态方法,也就是被static修饰的方法 4. final 终态 final 关键字一旦修饰了变量,这个变量就变成了常量,没法再次被修改了 修饰成员变量:成员变量用了final 修饰就会变成常量 常量是不能更改的 final 修饰成员变量,只能在定义的时候赋值,而且只能赋值一次 工具类里面的属性: 通常的修饰符是: public static final 局部变量:修饰局部变量 变成常量,而常量只能赋值一次 5. RPG游戏 特色: 0. 交谈: 玩家和电脑人交谈,电脑人会回答玩家 ,玩家不主动跟电脑人交谈,电脑人不会跟玩家交谈 1. 回合制游戏 玩家攻击电脑人,电脑人受伤(掉血),电脑人反击玩家,玩家受伤(掉血) 2. 玩家不攻击电脑人,电脑人是不会攻击玩家的 3. 若是没有攻击到,也就是说避开了,就不会掉血 4. 血量为0以后,就会退出游戏 类: 类名 属性 方法 玩家类: 属性: 姓名 血量 方法: 1. 跟电脑人交谈的方法 2. 攻击电脑人 3. 受伤的方法 电脑人: 属性: 姓名 血量 方法: 1. 回答玩家 2. 受伤的方法 3. 反击玩家 游戏界面类: 测试类 1.循环 概述: 一件事情反复不停的作就叫作循环 A:循环结构的分类 ????* for,while,do...while? 1) while 循环 语法: 初始化语句; ?????while(判断条件语句) { ????????????循环体语句; ????????????控制条件语句; ??????} ?B:执行流程: ????* a:执行初始化语句 ????* b:执行判断条件语句,看其返回值是true仍是false ????????* 若是是true,就继续执行 ????????* 若是是false,就结束循环 ????* c:执行循环体语句; ????* d:执行控制条件语句 ????* e:回到B继续。 例子: int i = 0; ① //初始化条件 while(i < 10) { ② //判断条件 System.out.println(i); ④ //循环体 i++;③ //控制条件 } 执行顺序: 第一次: ①, ②, ④, ③ 第二次: ②, ④, ③ 第三次: ②, ④, ③ ...... 最后一次: ② //条件知足就执行循环体,不知足就结束循环 //判断条件永远比 控制条件多执行一次. 练习: 简单版: 使用while循环,打印10次我要来黑马学习 进阶版: 让用户输入密码88888,若是输入错误就从新输入,直到输入正确为止 请打印 1-100 之间能够被 8 整除的数 2) do...while 循环 语句的格式: ????????do { ????????????循环体语句; ????????}while(判断条件语句); ???????? ???????? 完整格式; ????????初始化语句; ????????do { ????????????循环体语句; ????????????控制条件语句; ????????}while(判断条件语句); ?B:执行流程: ????* a:执行初始化语句 ????* b:执行循环体语句; ????* c:执行控制条件语句 ????* d:执行判断条件语句,看其返回值是true仍是false ????????* 若是是true,就继续执行 ????????* 若是是false,就结束循环 ????* e:回到b继续。 例子: int i = 0; ① //初始化条件 do{ ② //判断条件 System.out.println(i); ④ //循环体 i++;③ //控制条件 }while(i < 10) 3) for 循环 ?B:循环结构for语句的格式: ????????for(初始化表达式;条件表达式;循环后的操做表达式) { ????????????循环体; ????????} ?C执行流程: ????* a:执行初始化语句 ????* b:执行判断条件语句,看其返回值是true仍是false ????????* 若是是true,就继续执行 ????????* 若是是false,就结束循环 ????* c:执行循环体语句; ????* d:执行循环后的操做表达式 ????* e:回到B继续。 例子: ① ② ③ for(int i=0; i<10; i++) { //这个循环的做用是: 打印0-9之间的数字 ④ System.out.println(i); //这是循环体 } 执行顺序: 第一次: ①, ②, ④, ③ 第二次: ②, ④, ③ 第三次: ②, ④, ③ ...... 最后一次: ② //条件知足就执行循环体,不知足就结束循环 4) 加强for循环 格式: for(数据类型 变量名 : 要遍历的集合或者数组) { //正常的功能代码 } 双重for循环 // 外层循环控制行,内层循环控制列 // 外层循环一次,内层循环全部次 正则: *?需求:? ?????* 定义一个工具类RegexUtils, 在该类中定义一个方法checkPhoneNumber(Strnig phone); ?????* 用来校验指定的字符串是不是合法的手机号. ?????* 手机号规则: ?????????* 1.长度必须是11位. ?????????* 2.必须是纯数字 ?????????* 3.必须是数字1开头的. ?????????* 4.第二位数字必须是3,4,5,7,8 1.HashMap: 2.ArrayList: 分类: 此处先写三个循环 普通for循环: 格式: ① ② ③ for(循环初始语句;循环条件语句 ;改变控制循环变量语句 ) { //这个循环的做用是: 打印0-9之间的数字 ④ System.out.println(i); //这是循环体 } ① ② ③ for(int i=0; i<次数; i++) { //这个循环的做用是: 打印0-9之间的数字 ④ System.out.println(i); //这是循环体 } 执行顺序: 第一次: ①, ②, ④, ③ 第二次: ②, ④, ③ 第三次: ②, ④, ③ ...... 最后一次: ② //条件知足就执行循环体,不知足就结束循环 加强for循环; for(数据类型 变量名 : 要遍历的集合或者数组) { //正常的功能代码 } 集合的遍历: HashMap集合的遍历: // 加强for循环 // 1.获取全部键的集合 单列集合 // 2.遍历全部键的集合 获取每个键 // 3.根据获取到的键去取值 1.继承 概述:在开发中,咱们发现多个类具备不少类似的功能,因而咱们就把这些类似的功能放到一个类中,而后让这多个类和这个类产生一个关系, 这个关系就叫作继承 关键字: extends 语法: public class A类 extends B类{ } 认识: A类: 子类,派生类 B类: 父类,基类,超类 特色: 1.子类继承父类,只能单继承,不能多继承,可是能够多层继承 2.子类继承父类,就拥有父类里面的非私有属性\方法 继承中成员变量的访问特色: 使用变量遵循"就近原则", 先在局部位置找, 有就使用, 没有就去本类的成员位置找,? ???? ?* 有就使用, 没有就去父类的成员位置找,有就使用, 没有就报错. 注意事项: * 1.子类继承父类,不能继承父类的私有属性和私有方法 * 2.子类继承父类,不能继承父类的构造方法,可是可使用 * 关键字: super * 调用父类的空参构造方法: super(); * 调用父类的有参构造方法: super(参数); * * 直接调用父类的普通方法; super.方法名(); * 直接访问父类的属性: super.属性名 * 3.不要为了继承而继承 * Dog 属性:姓名 年龄 * 方法: 吃东西 * * Person 属性: 姓名 年龄 * 方法: 吃东西 * * 程序员: * 属性: 姓名 工号 薪资 * 方法; 写代码 * * 项目经理: * 属性:姓名 工号 薪资 奖金 * 方法: 写代码 审计代码 * 4. 知足 is a 的关系 * 学生 属于 人类 * 子类 属于 父类 方法的重写: 概述: 子类出现和父类如出一辙的方法 为何要重写方法? 1.父类的功能没法知足子类的需求 2.当子类具备特有的功能的时候 重写的注意事项: 1.父类的私有方法不能重写 2.子类重写父类的方法,重写的方法的访问权限不能低于父类的访问权限 private(本类) < protected(同一个包) < 默认(本类和子类) < public(当前项目中) 3.静态方法严格意义上来说不是方法的重写(只是表现形式和方法的重写意义) 方法的重载: 概述: 方法名一致,方法的参数不一致(参数的数据类型不一致,参数的个数不一致) final 关键字 1.修饰类 被final修饰的类不能被子类继承 2. 修饰方法 被fianl修饰的方法不能被子类重写 3. 修饰变量 被final修饰的变量会变成一个常量,常量只能赋值一次 2. 多态 多态指的是: 同一种行为,对于不一样的事物具备不一样的表现形式。 这就叫作多态。 医生 咔 动手术 理发师 咔 剪头发 演员 咔 中止了 程序中的多态:不一样的对象 以 本身的方式响应 相同名称方法的能力称为多态 Dog 吃 吃骨头 Cat 吃 鱼 Monkey 吃 香蕉 多态的条件: 1. 继承 2. 方法的重写 3. 父类的引用指向子类的对象 多态的使用\好处: 1. 开发中使用父类的类型做为方法的参数类型声明,那么之后无论传入任意的子类对象,均可以接收。 2.在调用方法的时候,调用的是子类的方法,前提是父类必需要有该方法,否则会编译不经过。 多态成员访问特色: 多态的成员访问特色: 成员变量: 编译看左边,运行看左边 成员方法: 静态方法: 编译看左边,运行看左边 非静态方法: 编译看左边,运行看右边 总结: 除了非静态方法是编译看左边,运行看右边,其余状况都是编译看左边,运行看左边 向下转型: Animal anl = new Dog();// 向上转型 Dog dog = (Dog)animal;// 向下转型 dog.lookHome(); 3.抽象类: 抽象方法: 没有方法体的方法就是抽象方法 通常用 abstract 抽象类: 用 abstract修饰的类就是抽象类, 有抽象方法的类必定是抽象类 特色: 1.有抽象方法的类必定是抽象类 2.不能建立对象,经过其子类来建立对象 3.能够有构造方法,可是不能用来建立对象, 用于子类对象访问父类数据以前,对父类的属性初始化 3.子类: 普通类: 必需要实现父类的抽象方法 抽象类: 不必定要实现父类的抽象方法 4.接口: 概述:用 Interface 定义的就是接口 实现: public class 类A implements 接口{ } public class 类A extends 类B implements 接口{ } 特色: 1. 定义接口 使用的关键字是 Interface 2. 实现接口 使用的关键字是 implements 3. 不能有构造方法,也不能建立对象,经过实现类来建立对象 4. 实现类: 普通类: 必定要实现接口中的抽象方法 抽象类: 不必定要实现接口中的抽象方法 成员特色: JDK1.7及之前的: 成员变量: 默认修饰符 public static final 成员方法: 只能是抽象方法 默认修饰符 public abstract JDK1.8: 成员变量:默认修饰符 public static final 成员方法: 增长了有方法体的方法,非静态方法,须要加 default 修饰,静态方法就直接写 接口: 类: 类和类的关系: 类和接口的关系: 接口和接口的关系: 接口和抽象类的区别: