java基础课堂笔记_第1页
java基础课堂笔记_第2页
java基础课堂笔记_第3页
java基础课堂笔记_第4页
java基础课堂笔记_第5页
已阅读5页,还剩113页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课堂笔记 软件模式 B/S 模式(Browser/Server):浏览器/服务器 只需具有浏览器即可,无需安装其他软件即可使用 优点:于平台无关 更新时,只需更新服务器上的一份软件即可 对系统要求较低 C/S 模式(Client/Server):客户端/服务器 必须安装相应的客户端软件 优点:运行快(执行效率高) ,视觉效果(客户体验)相 对较好 缺点:针对不同的平台,要开发不同的客户端软件 更新时,所有客户端都需要更新一次 对系统要求高 编程语言 分类:机器语言、低级语言、高级语言 高级语言: 分类:编译型、解释型 编译型 优点:执行效率高 缺点:与平台有关 特点:有中间文件产生 解释型 优点:与平台无关 缺点:执行效率相对较低 特点:没有中间文件产生 Java 既有编译、也有解释 编译:将 Java 源代码编译成字节码文件 解释:由 JVM(Java 虚拟机)解释执行字节码文件 一句名言:一次编译,到处运行 Java 源码:后缀名/扩展名 .java Java 字节码:后缀名/扩展名 .class Java 程序的基本结构 public class :表示该程序的基本框架 HelloWord:框架的名称(注意:必须和文件名完全一致) public static void main(String args):表示程序运行时的入口 其中出现的小括号(圆括号) 、中括号(方括号) 、大括号(花括号)都是英文格式的 配置 JDK 环境变量 配置 java.exe javac.exe 等文件的目录,配置之后再使用 java 或 javac 命令时,只需直接在 cmd 窗口中直接输入 java 或 javac 即可执行相应的 java.exe javac.exe 文件了 计算机 右击 高级系统设置 高级(选项卡) 环境变量新建 (系统变量)- 变量名(输入)JAVA_HOME 变量值(输入): JDK 的安装目录 确定 系统变量中找到 path 并双击打开,然后在变量值的最后输入 ;%JAVA_HOME%bin - 确定 确定 确定 javac:Java 的编译器,使用 Javac 可以编译 Java 的源代码 CMD 窗口中的命令格式:javac 文件名.java java:java 的运行命令 CMD 窗口中运行 java 程序的命令格式:java 文件名 Eclipse 的基本使用 切换 eclipse 视图(界面) 新建项目 新建 class 设置字体 运行程序 Java 程序的运行,在一个复合语句内,是自上而下的执行方式 System.out.print(); /输出信息后,不会换行 System.out.println(); /输出信息后,会换行 Java 源文件的构成 Java 源文件中可以包含 java 代码和注释 注释 注释:用于解释说明源代码的功能 分类:单行注释、多行注释、文档注释 被注释的内容不会参与编译和运行 单行注释 /使用双斜杠作为注释的符号 /* 多行注释使用 /* 注释的内容 */ 作为注释的符号 */ /* 文档注释:使用 /* 文档注释 */ 作为注释的符号 特有的作用:可以用于生成文档 */ 标识符 在软件开发的过程中,自定义的一些名称(比如:框架的名称 HelloWord) 命名规则 1、 可以由 字母、数字、_(下划线)、$ 组成 2、 不能使用数字开头 3、 不能单独的使用关键字 4、 见名知义 5、 驼峰命名法 a) 类的名称:每一个单词的首字母都要大写 b) 变量名(属性名) 、方法名:第一个单词的首字母小写,其后的每一个单词的 首字母都大写 c) 常量名:所有字母都大写 代码格式 遇到左边的大括号就换行,换行之后新的一行要有缩进 左大括号所在行的行首要和左大括号对应的右大括号上下对齐 格式化代码的快捷键:Ctrl + Shift + F 数据类型 基本数据类型(值类型) Java 中有 8 中基本数据类型 数值类型 整型 byte 占 1 个字节(8 个二进制位) short 占 2 个字节(16 个二进制位) int 占 4 个字节(32 个二进制位) long 占 8 个字节(64 个二进制位) 浮点型 float(单精度浮点型) 占 4 个字节 double(双精度浮点型) 占 8 个字节 非数值型 char(字符型) java 中占 2 个字节(因为 java 是使用 Unicode 编码的) 字符型的数据要使用单引号括起来,单引号中只能阔一个字符 boolean(布尔型) 只有两个值 true(真) false(假) 引用类型 String 用双引号括起来的值,表示的是字符串类型的数据 变量和常量 变量:在程序运行的过程中可以被改变的数据 常量:在程序运行的过程中不可被改变的数据 Java 中变量:必须先声明,再使用 声明变量 语法格式:数据类型 变量名; /声明变量的语句 实例:int age; /该语句告诉计算机,此处有一个变量,变量的名字叫 age ,age 中只能存储整型的数据 为变量赋值 语法格式:变量名 = 值; /赋值语句 实例:age = 18; /将 18 这个整数存储到变量 age 中 将声明与赋值语句合并成一条语句:数据类型 变量名 = 值; 声明常量 语法格式:final 数据类型 常量名; 实例:final char sex = 男; 为常量赋值 语法格式:常量名 = 值; 实例:sex = 男; /常量只能被赋值一次 将声明与赋值语句合并成一条语句:final 数据类型 常量名 = 值; 数据类型转换 分类:自动类型转换和强制类型转换 条件 1:转换前后的数据类型要兼容 条件 2: 自动类型转换:目标类型(转换后的类型)要大于源类型(转换前的类型) 强制类型转换:目标类型(转换后的类型)要小于源类型(转换前的类型) 注意:在 java 中数值型和字符型是兼容的数据类型 直接在代码中输入的整型常量值的类型为 int 直接在代码中输入的小数常量值的类型为 double byte b = 4; /当计算机执行此句代码时,由于给变量 b 付的值是一个常量 4,此时计算机 会先判断常量值是否在变量 b 的类型(byte)的取值范围内,如果在,则会自动执行类型 转换 float f = 1.1F; double d = 1.1D; long l = 1L; 以上三种类型所赋值的常量值最后的一个字母,用于指定常量值的类型 int x = 1; int y = x+ + +x; 第一步:取出变量 x 中的值 1 第二步:为变量 x 自增 1;自增之后 x 的值为 2 第三步:为变量 x 自增 1;自增之后 x 的值为 3 第四步:取出 x 的值 3 第五步:使用第一次取出的 x 的值 加上 第二次取出的 x 的值 结果为 4 int g = 1; int h = +g + g+; 第一步:先将变量 g 自增 1,自增后 g 的值为 2 第二步:取出变量 g 的值 2 第三步:取出变量 g 的值 2 第四步:在将变量 g 自增 1;自增后的结果为 3 第五步:将第二步取出 g 的值 加上 第三步取出 g 的值,结果为 4 运算符 算数运算符 + - * / %(取余、取模) +(自增 1) -(自减 1) + 放在操作数之后,会先取出操作数的值,在进行自增运算 放在操作数之前,会先执行自增运算,然后在取出操作数的值进行其他运算 关系运算符 = : 带符号的右移,符号位不动,其他位依次向右移动,空位补最高位(符号位) :无符号的右移,所有的二进制位都依次向右移动,最前面补 0 赋值运算符 = 、 += += : 例:int a = 1; a+=2; /相当于 a = a+2; 结果 a 的值为 3 条件运算符 ? : 布尔表达式 ? 值 1 : 值 2; /如果布尔表达式的结果为 true,整个表达式的值为“值 1”, 如果布尔表达式的值为 false,整个表达式的结果为“值 2” 流程控制 选择结构 if 结构 语法格式:if( 布尔表达式) 注意:if 的小括号之后不能加分号(;) 因为单独的一个分号也是一条语句,只有 一个分号的语句称为空语句 书写程序时,出现成对的符号(大括号、小括号等)先将成对的符号写完, 然后再在其中书写内容 if-else 结构 语法格式: if(布尔表达式) /布尔表达式为 true 时执行的代码块 else /布尔表达式为 false 时,执行的代码块 if-else if 结构 语法格式: if(布尔表达式 1) /如果布尔表达式 1 的结果为 true,则执行此处的代码块 /如果布尔表达式 1 的结果为 false,则执行布尔表达式 2 的判断 else if(布尔表达式 2) /如果布尔表达式 2 的结果为 true,则执行此处的代码块 /如果布尔表达式 2 的结果为 false,则执行最后一个 else 中的代码块 else 注意: /如果该 if 前不加 else,无论上一个 if 的条件是否成立,都会执行该 if 的判断 /如果该 if 前加了 else,如果第一个 if 的条件成立,则不会执行该 if 的判断,如果第 一个 if 的条件不成立,才会执行该 if 的判断 /if 可以单独存在,而 else 不能单独存在 switch 结构 语法格式 switch(条件参数) case 值 1: /代码块 break; case 值 2: /代码块 break; case 值 3: /代码块 break; default: /代码块 break; 注意:条件参数可以使用的数据类型 byte、short、int、char、枚举、String(JDK1.7 开 始) if 结构:if 的条件表达式的结果只能是 boolean 类型的值;可以判断一个区域内的条件,也 可以判断能够一个一个列举出的值 switch 结构 :可以判断能够一个一个列举出的值 循环结构 while 循环 语法格式 while(循环条件) /循环体 do-while 循环 while 和 do-while 的区别 while:先进行条件判断,如果第一次判断的结果为 false,则不会执行循环体 do-while:先执行一次循环体,在执行条件判断,即使第一次判断的结果就为 false, 也会执行一次循环体 关键字 break:可以结束 switch 和循环结构 for 循环 for 循环的执行顺序 嵌套 for 循环 关键字 continue 关键字 break 用在 switch 结构中,作用是结束 switch 结构 用在循环中,作用是结束循环结构,如果嵌套循环中,break 只会结束离他最近的一 层循环 关键字 continue 用在循环中,作用是结束一次循环 死循环: 永远不会停止的循环(即循环条件永远为 true 的循环结构) 循环复习 while 循环 while(循环条件) /循环条件为 true 时,执行大括号中的语句块 do-while 循环 do /不管循环条件是否成立,都会先执行一次循环体,然后在判断循环条件 /如果循环条件的结果为 true,则会继续执行循环体,直到循环条件为 false 的时 候,结束循环 while(循环条件); while:可能一次都不执行循环体 do-while:至少执行一次循环体 for 循环 for(声明并初始化条件变量;循环条件;修改条件变量) /执行顺序和次数 /第一步:执行声明并初始化条件变量,并且只会执行一次 /第二步:执行循环条件的判断 /第三步:执行循环体 /第四步:修改条件变量 for 循环的小括号中的三个部分都可以省略,但是两个分号不能省略;如果条件被省略, 默认为 true。 while:适合用于未知次数的循环 for:适合用于已知次数的循环 关键字 break: 用在 switch 结构中,结束 switch 结构 用在循环中,结束一层循环 关键字 continue: 用在循环中,结束一次循环 数组 一维数组 数组的作用是用于使用一个变量存储多个值 声明数组的语法格式:数据类型 数组名; 为数组变量赋值:数组名 = new 数据类型长度; /正括号中必须加入长度值 声明和赋值合并:数据类型 数组名 = new 数据类型长度; 为数组中的元素赋值:变量名下标 = 值; 获取数组中存储的数据:变量名下标; public class MyArray public static void main(String args) /声明变量的语法格式:数据类型 变量名; /声明数组的语法格式:数据类型 变量名 ; /声明数组,用于存储所有学员的成绩 int scores; /为数组赋值的语法格式:变量名 = new 数据类型长度; /new:告诉计算机创建一个新东西 /new int10:告诉计算机创建一个新的 int类型的数组,并告诉计算机该 数组能存10个int类型的数据,中括号中的 10表示的是数组的长度 /数组在内存中是连续的 scores = new int10; /中括号中的数字表示的是 :下标 /下标:从0开始 /为数组中的元素赋值语法格式:变量名 下标 = 值; scores0 = 80; scores1 = 90; / System.out.println(scores0); / System.out.println(scores1); /使用循环输出数组中存储的数据,将循环的条件变量和数组的下标,使用 同一个变量 for(int i=0;i 方法名(参数列表) 注意:1、如果一个方法没有返回值,返回值的类型为 void 2、方法声明的位置:只能直接在类中声明,不能再一个方法 的内部声明另一个方法;但是可以在一个方法的内部调用另一个方 法 调用对象的方法的语法格式:对象名.方法名(【参数列表 】); 带参数的方法 既有参数又有返回值的方法 值传递和引用传递 值传递:传递的是值的本身,传递之后两者之间除了值相等,修改任何一方都不会影 响另一方 例:int i1 = 1; int i2 = i1;/传递之后 i1 和 i2 的值相同,修改任何一个变量都不 会影响另一个 引用传递:传递的是对象在堆内存中的地址,传递之后两个或多个变量指向的是同一 个对象,任何一个变量修改了对象中的数据,所有的变量再次访问该数据时,都是修改之 后的值 例:public class Person() int age; Person p1 = new Person(); p1.age = 18; Person p2 = p1; p2.age = 19; /修改了 age 的值之后,无论是 p1.age 还是 p2.age 得到的值都是 19 /创建一个 Person 类型的对象 Person p1 = new Person(); p1.age = 18; /又创建了一个 Person 类型的对象 Person p2 = new Person(); p2.age = 19; 构造方法 构造方法主要用于初始化对象 声明构造方法的语法格式:访问修饰符 类名() 构造方法在使用 new 关键字创建对象时调用 new 类名(); 一个类如果没有声明任何的构造方法,系统默认会提供一个无参的构造方法; 如果手动声明了构造方法,系统将不再提供无参的构造方法 构造方法和普通方法区别 返回值类型:普通方法必须有,即使不需要返回值,此时返回值类型为 void 构造方法必须没有 方法名:普通方法的方法名是自定义 构造方法必须和类名完全一致 构造方法的特殊性:如果没有声明构造方法,系统会默认提供一个无参的构造方法, 并且系统提供的无参构造的方法体是空的;一旦自己声明了构造方法,系统将不再提供无 参的构造方法 方法的重载 方法的重载:描述同一个类中,同名但参数列表不同的方法之间的关系 方法重载的条件 * 1、重载的方法在同一个类中 * 2、重载的方法要同名 * 3、参数列表(参数的个数,数据类型,顺序)不同 * 注意:与返回值类型无关,无论是构造方法还是普通的方法都可以重载 全局变量和局部变量 全局变量:接声明在类中的变量,就称为全局变量,也称为类的属性;作用:用于存储数 据 局部变量:在方法的小括号中声明的变量(形参) 或 在大括号中()中声明的变量,叫做 局部变量,出了大括号,就无法再使用 无论是全局变量还是局部变量,都要先声明后使用 全局变量和局部变量的区别 1、 局部变量必须初始化之后才能使用,而全局变量初始化的工作有系统自动完成 2、 由于全局变量的初始化工作由系统自动完成,所以全局变量具有默认值(整型默 认值:0;浮点型的默认值: 0.0;布尔类型的默认值:false;字符型的默认值:空; 引用类型的默认值:null) ,而局部变量没有默认值,必须自己初始化之后才能使 用 3、 全局变量的作用域,至少为整个类;局部变量的作用域,仅存在于声明该变量的 大括号内 注意: 1、 全局变量和局部变量之间可以同名,而全局变量和全局变量或局部变量和局部变 量之间不能重名 2、 就近原则:访问变量时,当具有同名的全局变量和局部变量时,哪个变量离访问 位置近,则访问的就是哪个变量 3、 对于局部变量来说,声明语句必须在使用该变量的语句之前;对于全局变量没有 顺序的要求 关键字 this this:用于指向自身的一个引用 使用关键字 this 调用构造方法语法格式:this(参数列表); this(参数列表 ); /必须写在构造方法中的第一行 两个构造方法之间不能互相调用 关键字 static static:静态的,用于修饰类的成员,被 static 修饰的成员,建议使用 类名.成员 的方式 访问 静态的方法中,不能直接访问非静态的属性或方法;由于 class 文件被加载完成后,静态的 成员就已经存在于方法区中,而非静态的成员直到创建对象后才会出现在堆中的对象的作 用域内 静态语句块 包(package ) 一个类存储在某一个包下,那么类的源文件中必须在第一行使用关键字 package 声明 包 作用: 1、 方便管理类文件 2、 区分同名的类:在同一个包中,不能存在同名的类;在不同的包中,可以出现同 名的类 3、控制类的成员的访问权限 关键字 import /关键字import导入包,本例中告诉计算机使用到User 类时, 去哪里找User类 /import 语句 必须在 package 之后,在声明类之前 当前包下的其他类和 java.lang 包下的类不需要手动导入,因为系统默认会在这两个位置查 找 导入包的两种方式:import 包名. 类名; import 包名 .*; 访问权限 内部类 成员内部类:在类中声明的内部类 静态内部类:在类中声明的静态内部类 局部内部类:在方法中或语句块声明的类 匿名内部类:没有名字的内部类,直接创建对象 创建对象 成员内部类:必须先创建外部类的对象,外部类名.内部类名 对象名 = 外部对 象名.new 内部类名(); 静态内部类:外部类名.内部类名 对象名 = new 外部类名.内部类名(); 局部内部类:只能在方法内部创建对象,并且只能在方法内部使用 匿名内部类:new 类名/ 抽象类名/接口名() / 重写方法 面向对象的三大特性 封装 封装:将多个任意类型的变量封装到一个类型中 将数据(属性)和功能(方法)包装在一起,形成一个不可分割的整体。对 使用者提供访问的接口(方法) 将属性私有化,并提供公有的 getter 和 setter 方法 优点:安全,可以屏蔽一些非法的操作 缺点:代码较多 继承 父类/基类/超类 java 只支持单根继承;即只能继承一个父类 作用:复用代码 语法格式:public class 类名 extends 父类名 子类中能够继承的父类成员,优先以访问修饰符的权限决定 任何一个类的顶级父类都是 Object,即使声明的类,没有使用关键字 extends 继承任 何的其他类,默认情况下,是继承 Object 类的 方法的重写 /* * 方法重写(覆盖):重新编写父类中已存在的方法 * 条件: * 1、存在于有继承关系的两个类中(子类中重写父类中的方法) * 2、方法名相同 * 3、参数列表(参数的个数,类型,顺序)要相同 * 4、返回值类型 “必须”一致(父类中的方法的返回值如果是子类型,子类中 重写父类的方法可以使用相同的子类型或父类型) * 5、访问修饰符:子类中重写后的方法的访问修饰符,可以放大访问权限,但 不能缩小访问权限 6、只能重写访问修饰符允许访问的方法 */ 注意:属性没有重写的概念 关键字 super 用在子类中,访问父类的成员 继承小结 1、继承的优点:有效的复用代码 2、 java 只支持单根继承;即只能继承一个类 3、创建子类对象时,先执行父类的构造方法,再执行子类的构造方法。默认执行父类的 无参构造 4、使用 super()调用父类的构造方法时,必须写在子类构造方法中的第一行 5、使用关键字 super 可以访问父类中访问修饰符允许访问的成员 6、如果子类中的属性和父类中的属性没有重名,也可以使用 this 或省略 this 的方式访问 父类中的属性 7、本类引用指向本类对象时,可以调用自身访问修饰符允许访问的成员,和从父类继承 的成员。 8、父类引用指向子类对象时,父类引用可以调用自身访问修饰符允许访问的成员,和子 类中重写父类的方法,但无法调用子类中独有的方法 9、只有方法存在重写,属性不存在重写 多态 建立在继承的基础之上,一个父类型的引用可以指向多种形态的子类型的对象,并且 调用同一个方法(如果子类中重写了该方法) ,就可以得到不同形态的结果 常用的场景:使用父类型作为方法的参数或返回值类型 优势:功能扩展非常灵活 软件开发的原则: 开闭原则:对扩展开放,对修改关闭 类型转换 向上转换(自动类型转换):父类型 变量名 = 子类型的对象; 向下转换(强制类型转换):子类型 变量名 = (子类型)父类型的引用; 关键字 instanceof 用于判断一个引用指向的对象是否属于某种类型 关键字 final 放在变量前,表示该变量为常量,只能被赋值一次; 放在方法前,表示该方法不能被重写 放在类前,表示该类不能被继承 总结:被 static 和 final 修饰的方法都不能被重写 面向对象复习 类和对象 类是对象的抽象,对象是类的一个实例(创建对象也被称为实例化) 声明类:【public】 class 类名 创建对象:new 类名(); 声明自定义类型的变量:类名 变量名; 合并:类名 对象名 = new 类名(); 调用类的成员:对象名.属性名; 对象名.方法名(【参数列表】); 方法 声明:【访问修饰符】 返回值类型 方法名(【参数列表 】) 方法调用:对象名.方法名(【参数列表】); /形参和实参要保持个数、数据类型、顺序 保持一致 参数传递 值传递(值类型):传递的是值本身 引用传递:传递是内存中的地址 String:传递的是地址,但体现出来的是值传递的效果 构造方法 声明:【访问修饰符】 类名(【参数列表】) /如果没有声明构造方法,系统会提供一个默认的构造方法:public 类名() /一旦声明了构造方法,系统将不会再提供默认的构造方法 构造方法和普通方法的区别: 1、 普通方法必须有返回值类型,即使不需要返回值,返回值类型为 void;构造方法 必须没有返回值类型 2、 普通方法的方法名是自定义,构造方法的方法名必须和类名完全一致 3、 如果没有声明构造方法,系统会默认提供一个公有的无参的构造方法 4、 普通方法调用:对象名.方法名(【参数列表】); 构造方法调用: new 类名();/创 建对象时被调用 a) Class 文件被加载后,静态的成员被在内存中创建;创建对象:先将所有的属性 在内存中初始化,非静态的语句块,调用构造方法 方法的重载 条件 1、 同一类中 2、 方法同名 3、 参数列表(类型,个数,顺序)不同 4、 与访问修饰符和返回值类型无关 全局变量(属性)和局部变量 变量的作用域:全局变量至少在当前类中(取决于访问修饰符) ,局部变量,声明局部 变量的大括号内,声明变量之后 初始值:全局变量具有初始值(引用类型:null 整型:0 浮点型:0.0 布尔:false char:空) ;局部变量必须手动初始化之后才可使用 同一作用域下变量不可同名,不同作用域下变量可以同名 关键字 this 在当前对象中,指向自身的一个引用 使用 this 调用属性时,有局部变量和属性同名时,关键字 this 不能省略;相反,this 关键字可以被省略 调用构造方法:this(【参数列表 】);/ 必须写在构造方法中的第一行,构造方法之间 不能互相调用 关键字 static(静态的): 一个类只有一份 调用一个类中的静态成员:类名.静态属性 类名.方法名(【参数列表】); 静态方法中不能直接使用非静态的成员(使用非静态成员时,必须先创建对象,适用 对象调用非静态的成员) ,不能使用关键字 this 包(package) 用于管理类,区分同名的类(同一个包下不能出现同名的类;不同包下可以出现同名 的类) ;类的访问权限的一个条件 访问权限 当前类 同包 不同包(继承关系) 所有 private(私有的) Y N N N 不写(默认:友好的) Y Y N N protected(受保护的) Y Y Y N public(公共的) Y Y Y Y 内部类 成员内部类:直接声明在类中的类 【访问修饰符】 class 类名 外部类 对象名 1 = new 外部类( 【参数列表 】); /在当前外部类中创建内部类的对象 内部类名 对象名 = new 内部类名( 【参数列表】); /在其他类中创建外部类的对象 外部类.内部类 对象名 2 = 对象名 1.new 内部类名(【参数列表】); 静态内部类:直接声明在类中的静态类 【访问修饰符】 static class 类名 /在当前外部类中创建内部类的对象 内部类名 对象名 = new 内部类名( 【参数列表】); /在其他类中创建外部类的对象 外部类.内部类 对象名 1 = new 外部类.内部类 (【参数列表】); 匿名内部类:没有名字的内部类 /只有创建对象的语句,没有声明类的语句 new 类名/接口名( 【参数列表】) 局部内部类:声明在方法中(符合语句/代码块)的类 面向对象三大特性 封装 将所需的多个变量封装到一个类中,将属性私有化,提供公有的 getter 和 setter 方法 优点:安全,屏蔽非法的值(操作) 缺点:需要额外的代码实现(getter 和 setter 方法) 继承 Java 中只支持单根继承,子类只能直接继承一个父类 作用:复用代码,为实现多态的基础 关键字:extends 继承:【访问修饰符】 class 类名 extends 父类名 创建子类对象时,构造方法的执行顺序,先执行父类的构造方法,在执行子类的构造 方法。 方法重写 Override 条件 1、 在具有继承关系的两个类中 2、 方法名相同 3、 参数列表(个数,类型,顺序)相同 4、 返回值类型一致(兼容:放大 ) 5、 访问修饰符:可以放大,不能缩小 6、 只能重写访问修饰符允许访问的方法 关键字 super super 用在子类中,用于调用父类的成员 super.属性 super.方法 (【参数列表】); 子类中没有成员名与父类中的成员名重复时,super 可以省略,还可以使用关键字 this 调用 调用父类的构造方法:super(【参数列表】); /必须写在子类中的构造方法中的第一 行 /如果没有显示的调用父类的构造方法,系统会默认提供 super();调用父类的无参构造 多态 父类的引用指向子类的对象 一般的应用场景:使用父类作为方法的参数或返回值类型 类型转换 向上转型(自动):子类对象赋值给父类引用 向下转型(强制): 例: public class Father public class Son public class Girl Father son = new Son(); /向上转型:将 Son 类型转换成 Father 类型 Father girl = new Girl(); /向上转型:将 Girl 类型转换成 Father 类型 Son s = (Son)son; / 向下转型:所转换的引用指向对象,和目标对象一致 Girl g = (Girl)girl; / 关键字 instanceof 对象名 instanceof 类名 /得到的结果为 boolean 类型 判断一个对象是否属于某种类型(其中,对象的类型和指定类型之间要具有继承关系) 关键字 final 放在类前:表示该类不能被继承 放在方法前:表示该方法不能被重写 放在变量前:表示该变量不能被修改,即常量 抽象类 抽象类:类的部分抽象 被关键字 abstract 修饰的类 声明抽象类:【public】 abstract class 类名 作用:规范子类的编写,同时可以提供可复用的代码 * 被关键字 abstract 修饰的类,就是抽象类 * 抽象类中可以有抽象方法,也可以有非抽象的普通方法 * 非抽象的类中只能有非抽象的方法,不能包含抽象的方法 * * 抽象类不能被实例化 * 抽象类不能被关键字 final 修饰 * 可以具有抽象方法 抽象方法 声明抽象方法:【访问修饰符】 abstract 返回值类型 方法名(); 抽象方法的作用:抽象的方法不是一个真正意义上的方法,用于规定子类中必须重写这个 方法 * 没有抽象的属性,只有抽象的方法 * 抽象方法:被关键字 abstract 修饰的方法 * 1、不能具有方法体 * 2、抽象方法只能存在于抽象类中(或接口中) ;即普通类中不能具有抽象的方法 * 3、抽象方法不能被 private、final、static 修饰 * 4、子类必须重写父类中的所有抽象方法,除非子类也是一个抽象类 接口 规范子类的编写 声明接口:【public】 interface 接口名 接口中: 所有的方法都是公共的抽象方法(public abstract (可以被省略,如果要写也只能是这 两个或两个中的一个) ) (java 8(1.8) 接口中可以存在静态的方法了) * 使用关键字 interface 声明一个接口,建议在接口名前加上一个大写字母 I * * 接口是类的完全抽象 * 不能被实例化 * 接口中所有的方法都是抽象的方法(java8(1.8)开始,可以具有静态的非抽象的方法) * 一个类,使用关键字 implements 实现接口,并且必须实现(重写)接口中所有的抽象 方法 * * 接口中的属性默认都是 public final static 修饰的 * 接口中不能存在构造方法 * java 中支持一个类可以实现多个接口 子类实现接口:【public】 class 类名 implements 接口名 /必须实现接口中的抽象方 法 实现多个接口时,多个接口中间使用英文格式的都好隔开,子类中必须实现所有接口 中的方法 接口与接口之间使用 extends 继承:【public】 interface 接口名 extends 父接口名 优点:代码规范性强,并且可以多实现 缺点:不能提供普通的方法,这就导致即使子类中出现共性的方法也无法复用代码 接口和抽象类的区别 面向接口编程:两个类之间产生关系是通过接口作为桥梁 OO(面向对象) OOP(面向对象编程) OIP(面向接口编程) 练习:植物大战僵尸 1、 创建一个植物抽象类 Plant; a) 具有生命值、攻击力、防御力、名称 b) 具有攻击和防御的功能: fire()攻击的方法需要知道攻击的是僵尸,所以该方法需要一个僵尸接口作 为参数 defense()防御的方法,由于植物需要知道是什么攻击了自己,所以需要一个 僵尸的接口作为参数 2、 创建一个僵尸抽象类 Corpse a) 具有生命值、攻击力、防御力、名称 b) 具有攻击和防御的功能: fire()攻击的方法需要知道攻击的是植物,所以该方法需要一个植物接口作 为参数 defense()防御的方法,由于僵尸需要知道是什么攻击了自己,所以需要一个 植物的接口作为参数 3、 创建擂台类 Arena,声明比赛的方法 match,这个方法是由植物和僵尸进行比赛; 所以,该方法需要一个植物接口和一个僵尸接口作为参数 4、 创建不同的植物类,继承植物的抽象类; 5、 创建不同僵尸类,继承僵尸的抽象类; 6、 创建测试类,添加 main 方法,创建植物和僵尸的对象,创建擂台对象调用比赛的 方法,将植物和僵尸的对象传入比赛的方法中 常用类 Object 类 所有类的顶级父类,即使一个类没有显示的继承任何类,默认情况下是继承 Object 的 toString(); /将对象转换成字符串;Object 中的 toString 方法得到的是”类的全名十六进制的 hashCode”;一般情况下,自定义的类想要转换成字符串,可以重写 toString 方法 equals(); /该方法的目的是为了比较对象的内容是否相同;但是 Object 中的 equals 方法内是使用双 等号比较两个对象的地址是否一样;如果需要使用 equals 比较两个自定义的对象的内容是 否相同,则需要重写 equals 方法(比如: String 类的 equals 方法) 重写 Object 类中的 equals 方法 创建 Student 类,重写 Object 类中的 equals 方法,当学号和姓名相同时,就认为两个 Student 对象表示的是一个学生 String 类 当为字符串变量赋值为字符串常量时,此时系统会先到常量池中查找是否存在字符串常量 如果不存在,则将该字符串常量加入得到常量池中,然后将字符串在常量池中的内存地址 赋值给变量 如果存在,则直接将字符串常量在常量池中的地址赋值给变量 String url = “”; String email = “123456”; String phone = “12345678912”; 1、 判断 url 是否以 http:/开头,是否以.com 结尾;将 http:/之后的内容截取出来 2、 判断 email 中是否包含 字符 3、 判断 phone 的长度是否为 11 StringBuffer 和 StringBuilder 包装类 日期相关类 数学类(Math)和随机类(Random ) 枚举 枚举:将需要的值一个一个列举出来,值的集合 声明:【public】 enum 枚举名/ 枚举值:符合标识符的命名规则 声明枚举类型的变量并赋值:枚举名 变量名 = 枚举名.枚举值; 异常 Exception 分类:异常 Exception 和错误 Error Error(错误):程序本身无法对这种不正常的情况进行处理,这将会导致程序崩溃; 如:内存耗尽,JVM 崩溃等 Exception(异常):程序可以通过特殊的代码,对不正常的情况进行捕获和处理,从而使 程序可以继续运行; 如:除零异常,空指针异常,数组下标越界异常 捕获异常的格式 try /可能出现异常的代码 catch (异常类型 变量名) /出现异常以后,处理异常的代码 try /可能出现异常的代码 catch (异常类型 变量名) /出现异常以后,处理异常的代码 /省略多个 catch 块 catch (异常类型 变量名) /出现异常以后,处理异常的代码 try /可能出现异常的代码 finally /不管 try 块中的代码有没有出现异常,都会执行该位置的代码 try /可能出现异常的代码 catch(异常类型 变量名) /出现异常后,处理异常的代码 /省略多个 catch 块 finally /不管 try 块中的代码有没有出现异常,都会执行该位置的代码 注意: 1、 catch 和 finally 都必须和 try 一起使用,不能单独使用 2、 catch 块的顺序:catch(异常类型) 其中的异常类型,如果两个 catch 块中的异 常类型是兄弟或没有继承关系,则没有顺序的要求;如果两个 catch 块中的异 常具有继承关系,则父类型要在子类型之后 关键字 throw 和 throws throws 用于声明异常;使用位置:方法的小括号之后,大括号之前 throw 用于抛出异常;使用位置:方法内部 自定义异常 线程(Thread) 进程:系统运行程序的最小单位,一个程序至少要有一个进程;进程会在内存中开辟一块 空间用于运行程序 线程:程序执行任务的最小单位(真正干活的) ,一个进程至少要有一个线程;线程不能单 独存在,必须存在于一个进程之中 Java 的程序的默认的线程为主线程,用于执行 main 方法的线程,由 jvm 创建 创建线程 方式一: 【public】 class 类名 implements Runnable /重写 run 方法 创建对象:类名 对象名 = new 类名(); 启动线程:Thread t = new Thread(对象名); 启动:t.start(); / 启动线程调用的是 start 方法,而不是 run 方法 方式二: 【public】 class 类名 extends Thread /重写 run 方法 创建对象:类名 对象名 = new 类名(); 启动线程:对象名.start(); CPU 时间片 一个线程在 CPU 上连续运行的一段时间 生命周期 线程的生命周期中的状态 新建 就绪(可运行的) 运行 阻塞(挂起) 死亡(结束) sleep 方法 - 线程休眠 作用:阻塞线程指定的时间,时间到了线程自动恢复运行 一句话:谁执行,谁阻塞 yield 方法 线程让步 作用:让出 CPU 的使用权,和其他线程一起等待调度程序的调度 一句话:谁执行,谁让步 join 方法 线程插队 作用:使一个线程 B 插队到另一个线程 A 之前执行,线程 A 会被阻塞 一句话:谁执行,谁阻塞;谁调用,谁插队; 无参的 join 方法,线程 tb 插队到线程 ta 之前执行,等 tb 执行完成后,ta 才能自动恢复执 行 带参数的 join 方法(参数:指定插队的时长) ,线程 tb 插队到线程 ta 之前执行指定的时长, 然后退出插队,线程 ta 恢复到就绪状态;和线程 ta 共同等待调度程序的调度(等着抢 CPU 的使用权) 线程同步 同步关键字:synchronized 同步方法:【访问修饰符】 synchronized 返回值类型 方法名(【参数列表】) 同步块:synchronized(对象) 多个线程访问同一对象上的同步资源时,必须遵守“先来后到”的顺序 使用同步的原则:尽可能的缩小同步的范围 StringBuffer:线程不安全(异步) StringBuilder:线程安全的(同步) 常用的场景:银行、和财务相关的软件 wait 方法、notify 方法、notifyAll 方法 Object 类中声明的方法; wait 方法用于阻塞线程;如果传入了时间参数,阻塞时长到达执行的时间参数值,则自动 恢复运行;如果没有传入时间参数,则直到调用该对象的 notify 或 notifyAll 方法才能使被 该对象阻塞的线程恢复运行 notify 方法:用于唤醒该对象阻塞的一个线程 notifyAll 方法:用于唤醒该对象阻塞的所有线程 注意:1、使用这三个方法前,必须同步调用这三个方法的对象 2、保证调用 wait 方法和 notify 或 notifyAll 方法的对象是同一个对象 死锁 线程死锁:是指两个或两个以上的线程在执行过程中,由于竞争资源或者由于彼此通信而 造成的一种阻塞的现象,若无外力作用,它们都将无法继续运行下去。此时称系统处于死 锁状态或系统产生了死锁,这些永远在互相等待的线程,称为死锁线程。 线程的优先级 Java 中: 110 默认为:5 设置优先级:setPriority 获取优先级:getPriority 后台线程 通过 setDaemon 方法设置线程为后台线程,注意必须在线程启动之前设置后台线程 集合框架 没有使用泛型之前,存入的任何类型的数据,都会被转换成 Object 类型 基本数据类型存入集合:通过自动装箱,将基本数据类型的数据转换成包装类型,然后在 将包装类型转换成 Object 类型 List 集合 可以存储:有序的(有下标),可重复的数据(元素) 有序的:存入的顺序和取出的顺序一致 可重复的:同一个对象可以被存入多次 获取数组的长度:length 属性 获取字符串的长度:length()方法 获取 List 集合的长度:size() 方法 ArrayList 类 数据结构:数组 优点:查询效率高 缺点:插入和删除效率低 底层由数组(默认情况下使用 Object 数组)实现的集合类,是对数组进行了封装,实现了 集合的长度可变,弥补了数组长度无法改变的缺点 ArrayList 刚刚创建出来的对象,底层包含的 Object数组默认的长度为 0;向集合中添加第 一个元素时,重新创建数组,长度默认为 10 如果超出了初始的长度 10,再次创建一个新的数组长度为 原长度*1.5 增长因子:1.5 LinkedList 类 数据结构:双向链表 优点:插入和删除效率高 缺点:查询效率低 Vector 类 Vector 集合和 ArrayList 集合相比较,除了 Vector 是线程安全的(同步) ,其他和 ArrayList 基本一致 Stack(栈【堆栈】 )集合 特性:先进后出 入栈(压栈):向栈中添加数据 出栈(弹栈):从栈中获取数据 Heap(堆) Set 接口(集合) 用于存储无序的、不可重复的数据 Iterator 迭代器 作用:从集合中获取每一个元素 方法: hasNext();方法:判断是否还存在下一个元素,如果存在返回 true,反之返回 false next();方法:用于获取下一个元素对象 HashSet 类 数据结构:hash 表(数组) + 单向链表 TreeSet 类 TreeSet 会自动对加入的对象进行排序 Comparable 接口和

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论