还剩58页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
程序设计Java欢迎来到Java程序设计课程!本课程将带您深入了解Java编程语言的核心概念、语法结构及实践应用无论您是编程新手还是有其他语言经验的开发者,本课程都将为您提供扎实的Java开发基础在接下来的课程中,我们将从Java基础知识开始,逐步过渡到面向对象编程、异常处理、集合框架、I/O操作、多线程编程等高级主题通过理论学习与实践相结合的方式,帮助您掌握Java开发技能课程目标与大纲掌握基础知识1Java学习Java语言的基本语法、数据类型、运算符、控制结构等核心元素,为后续学习打下坚实基础理解面向对象编程2深入理解类、对象、继承、多态、封装等面向对象编程核心概念,培养良好的面向对象设计思维掌握实用开发技能3学习Java异常处理、集合框架、文件I/O、多线程编程、网络通信等实用技能,具备开发真实应用程序的能力培养实践能力4通过大量编程练习和项目实践,将理论知识转化为实际编程能力,能够独立开发Java应用程序语言概述Java全球流行的编程语言企业级应用的首选开发基础AndroidJava是全球最受欢迎的编程语言之一,广泛由于其稳定性、安全性和可扩展性,Java成Java是Android应用开发的官方语言之一应用于企业级应用、移动开发、大数据处理为企业级应用开发的首选语言财富500强全球约有30亿台Android设备,为Java开等多个领域据统计,全球有超过900万开企业中有90%以上使用Java构建其核心系统发者提供了巨大的就业和创业机会发者使用Java,它也是GitHub上最活跃的和应用程序编程语言之一发展历史Java年橡树项目19911詹姆斯·高斯林James Gosling和他的团队在Sun Microsystems公司开始名为橡树Oak的项目,旨在开发一种与平台无关的编程语言年正式发布21995Java经过改名后,Java
1.0正式发布,其口号一次编写,到处运行Write Once,Run Anywhere展示了Java的跨平台特性年收购2010Oracle3Oracle公司收购Sun Microsystems,成为Java技术的新东家,并继续推动Java的发展至今现代42014Java从Java8开始,Java采用了更快的发布周期,不断引入函数式编程、模块系统、本地变量类型推断等现代特性,保持语言的活力与竞争力语言特点Java简单性Java语法基于C++但移除了指针、多重继承等复杂特性,学习曲线相对平缓自动内存管理减轻了开发者的负担,使代码更加简洁清晰面向对象Java是纯面向对象语言,一切皆为对象(基本数据类型除外)完全支持封装、继承、多态等面向对象特性,促进代码重用和模块化设计平台无关性Java代码编译为字节码,由Java虚拟机JVM执行,实现一次编写,到处运行这使得Java应用可以在任何安装了JVM的平台上运行安全性Java提供安全管理器、类加载器和字节码验证等多层安全机制没有指针操作和自动内存管理减少了内存泄漏和缓冲区溢出的风险、和JDK JREJVMJDK JavaDevelopment Kit开发工具包1JRE JavaRuntime Environment2运行环境JVM JavaVirtual Machine3虚拟机JDK是面向开发人员的软件开发工具包,包含JRE以及用于开发、调试和监控Java应用程序的工具,如编译器javac、调试器和文档生成器等JRE是Java程序运行的环境,包含JVM和Java核心类库,使最终用户能够运行Java应用程序,但不能用于开发JVM是Java虚拟机,负责将Java字节码转换为特定机器的指令并执行,实现了Java的跨平台特性每个操作系统都有专属的JVM实现搭建开发环境Java下载JDK访问Oracle官方网站或OpenJDK网站,下载适合自己操作系统的最新版JDK安装包对于初学者,建议下载长期支持版本LTS,如JDK
8、JDK11或JDK17安装JDK按照向导完成JDK安装过程在Windows系统上,通常会自动设置安装路径,默认为C:\Program Files\Java\jdk-版本号在安装过程中,JRE通常会自动安装配置环境变量设置JAVA_HOME环境变量指向JDK安装目录,并将JDK的bin目录添加到PATH环境变量中,使系统能够找到Java命令安装IDE选择并安装集成开发环境IDE,常用的有IntelliJ IDEA、Eclipse和Visual StudioCode初学者可以选择功能完善的IntelliJ IDEA社区版第一个程序Java Hello World创建源文件创建一个名为HelloWorld.java的文本文件Java源代码文件的扩展名必须是.java,且文件名必须与公共类名完全相同,包括大小写编写代码在源文件中编写经典的HelloWorld程序public classHelloWorld{public staticvoid mainString[]args{System.out.printlnHello,World!;}}编译程序打开命令行,导航到源文件所在目录,执行javac HelloWorld.java命令进行编译如果没有错误,将生成HelloWorld.class字节码文件运行程序在命令行中执行java HelloWorld命令运行程序不需要添加.class扩展名如果一切正常,屏幕上将显示Hello,World!程序的基本结构Java包声明导入语句类定义package语句必须是源文件import语句用于导入其他包类是Java程序的基本组成单的第一个非注释语句,定义中的类,放在包声明之后,元,由class关键字声明,包了类所属的命名空间如类定义之前如import含字段和方法一个源文件package java.util.ArrayList;可以包含多个类,但最多只com.example.myapp;能有一个公共类方法定义方法是类中定义的函数,用于执行特定操作main方法是Java应用程序的入口点,格式为public staticvoidmainString[]args{...}中的注释Java单行注释//这是单行注释,从双斜杠开始到行尾结束多行注释/*这是多行注释,可以跨越多行,直到遇到结束符号*/文档注释/**这是文档注释,*用于生成API文档,*支持HTML标签和特殊标记*@author作者名*@version版本号*/注释是程序代码中的说明文字,不会被编译和执行,但对于提高代码可读性和可维护性至关重要养成良好的注释习惯可以帮助其他开发者(包括未来的自己)更好地理解代码文档注释(javadoc注释)是Java特有的注释形式,可以通过javadoc工具生成HTML格式的API文档,是专业Java项目中不可或缺的一部分标识符和关键字Java标识符规则命名约定关键字标识符是用来命名变量、类、方法等程序元类名应该以大写字母开头,采用驼峰命名法,关键字是Java语言预定义的,具有特殊含义素的名称Java标识符必须以字母、下划线如StudentInfo方法名和变量名应该以小的标识符它们不能用作变量、方法或类的_或美元符号$开头,后面可以跟字母、数写字母开头,同样采用驼峰命名法,如名称Java共有50多个关键字,如class、字、下划线或美元符号Java区分大小写,getStudentName常量名应该全部大写,public、static、void、int、if、for等因此name和Name是两个不同的标识单词间用下划线分隔,如MAX_VALUE关键字在大多数IDE中会以特殊颜色显示符基本数据类型整数类型浮点类型1byte8位、short16位、int32位、long64float32位、double64位2位布尔类型4字符类型3booleantrue或false char16位Unicode字符Java语言提供了八种基本数据类型,每种类型都有固定的取值范围和默认值整数类型默认为int,声明long类型时需要在数字后加L或l,如10L浮点类型默认为double,声明float类型时需要在数字后加F或f,如
3.14F浮点数存在精度问题,不适合用于精确的货币计算字符型常量用单引号括起来,如A布尔型只有true和false两个值,不能与0或非0值互换此外,Java还提供了引用数据类型,包括类、接口和数组变量和常量变量声明变量必须先声明后使用,声明格式为数据类型变量名[=初始值];例如int age=25;或String name;name=张三;变量作用域Java变量的作用域分为类变量(静态变量)、实例变量(成员变量)和局部变量变量只在其作用域内有效,超出作用域后将无法访问常量定义常量使用final关键字声明,一旦赋值后不能再更改常量名通常全部大写例如finaldouble PI=
3.14159;类型转换Java支持自动类型转换(小范围类型到大范围类型)和强制类型转换(大范围类型到小范围类型,可能丢失精度)强制转换语法为目标类型表达式运算符算术运算符关系运算符12包括加+、减-、乘*、除/、取模%、递增++和递减--用于比较两个值,包括等于==、不等于!=、大于、小于、整数除法会舍弃小数部分,如5/2结果为2取模运算返回除法的大于等于=和小于等于=关系运算的结果是布尔值true或余数,如5%2结果为1false逻辑运算符赋值运算符34用于连接布尔表达式,包括与、或||、非!逻辑与和逻包括简单赋值=和复合赋值+=,-=,*=,/=,%=等复合赋值运辑或运算支持短路求值,提高了运算效率算可以简化代码,如x+=5等价于x=x+5表达式和语句表达式语句代码块表达式是一个计算值的代码单语句是执行某种动作的代码单代码块是用花括号{}括起来的元,它由变量、运算符和方法元,以分号结束Java中的语语句序列,可以作为一个整体调用组成每个表达式都有一句包括声明语句、表达式语句、使用块可以嵌套,内部块可个确定的类型和值例如x+控制流语句等表达式后加分以访问外部块的变量,但外部y*2是一个算术表达式,ab号就成为表达式语句,如x=块不能访问内部块的变量是一个布尔表达式10;运算符优先级当表达式中有多个运算符时,运算符优先级决定了运算顺序一般而言,括号的优先级最高,赋值的优先级最低可以使用括号明确指定运算顺序,提高代码可读性程序流程控制if-else语句if1单分支条件判断语句if-else2双分支条件判断语句if-else if-else3多分支条件判断if语句是最基本的条件判断语句,语法为if布尔表达式{语句块}当布尔表达式的值为true时,将执行语句块中的代码;否则,跳过该语句块if-else语句用于双分支选择,语法为if布尔表达式{语句块1}else{语句块2}当布尔表达式的值为true时,执行语句块1;否则,执行语句块2if-else if-else语句用于多分支选择,语法为if条件1{语句块1}else if条件2{语句块2}...else{语句块n}条件按顺序检查,执行第一个条件为true的语句块程序流程控制switch表达式求值switch语句首先计算switch表达式的值,然后将结果与各个case标签进行匹配表达式类型可以是byte、short、int、char、枚举类型以及Java7之后的String类型匹配标签case如果switch表达式的值与某个case标签匹配,则执行该case标签后的语句,直到遇到break语句或switch语句结束默认处理如果所有case标签都不匹配,则执行default标签后的语句default标签是可选的,如果没有default标签且没有匹配的case,则不执行任何操作注意break如果某个case语句块执行后没有break语句,控制流将继续执行下一个case语句块,直到遇到break或switch结束,这称为穿透fall-through程序流程控制循环for初始化条件测试1循环开始前执行一次每次循环前检查2更新表达式执行循环体4每次循环后执行3条件为true时执行for循环是Java中最常用的循环结构之一,适用于预知循环次数的场景其语法为for初始化表达式;条件表达式;更新表达式{循环体}执行流程首先执行初始化表达式,然后检查条件表达式如果条件为true,执行循环体;执行完循环体后,执行更新表达式,然后再次检查条件重复这个过程,直到条件为falseJava5引入了增强型for循环(for-each循环),简化了遍历数组和集合的代码for元素类型变量名:数组或集合{循环体}这种循环更简洁且不易出错,但不能修改集合元素程序流程控制和循环while do-while循环循环选择合适的循环while do-whilewhile循环是最基本的循环结构,语法为do-while循环与while循环类似,但先执行当循环次数不确定,需要根据某个条件决定while条件表达式{循环体}首先检查条循环体,再检查条件,语法为do{循环体}是否继续循环时,使用while循环当循环件表达式,如果为true,则执行循环体;执while条件表达式;由于条件检查在循环体至少需要执行一次时,使用do-while循环行完循环体后,再次检查条件表达式,以此体执行之后,所以循环体至少会执行一次,当循环次数已知或需要遍历集合时,使用for类推如果初始条件为false,循环体一次也即使初始条件为false循环不会执行程序流程控制和break continue语句带标签的break breakbreak语句用于提前结束循环,跳出当前循环结构当执行break语句时,在嵌套循环中,可以使用带标签的break语句跳出指定的外层循环语法程序将立即结束当前循环,转而执行循环后的语句break通常与条件判为break标签名;标签名是一个标识符,放在循环语句之前,以冒号断语句一起使用,用于在满足特定条件时退出循环结尾,如outer:for...{...}语句带标签的continue continuecontinue语句用于跳过当前循环的剩余部分,直接进入下一次循环在类似于带标签的break,带标签的continue语句可以跳到指定循环的下for循环中,continue之后会执行更新表达式;在while和do-while循一次迭代语法为continue标签名;这在处理复杂的嵌套循环时特别环中,continue之后会直接检查循环条件有用数组的概念和使用数组概念数组是一种用于存储同类型数据的容器,它是Java中最基本的数据结构数组中的元素在内存中连续存储,通过索引(从0开始)可以快速访问任意元素数组声明数组声明的语法为元素类型[]数组名;或元素类型数组名[];例如int[]numbers;或String names[];声明只是创建了数组变量,还没有分配内存空间数组创建使用new关键字创建数组数组名=new元素类型[长度];例如numbers=new int
[10];也可以在声明时直接创建int[]numbers=new int
[10];数组初始化创建数组时可以使用花括号进行初始化int[]numbers={1,2,3,4,5};数组长度通过length属性获取numbers.length一维数组元素访问与修改1数组元素通过索引访问,语法为数组名[索引]例如int value=numbers
[0];获取第一个元素,numbers
[1]=10;修改第二个元素Java会进行数组边界检查,访问越界将抛出ArrayIndexOutOfBoundsException异常数组遍历2可以使用for循环遍历数组for inti=0;inumbers.length;i++{System.out.printlnnumbers[i];}Java5之后,可以使用增强型for循环for intnum:numbers{System.out.printlnnum;}数组作为参数和返回值3数组可以作为方法的参数和返回值传递数组时,实际传递的是数组的引用,方法内对数组的修改会影响原数组例如void processArrayint[]arr{...}数组工具类4java.util.Arrays类提供了许多操作数组的实用方法,如排序、查找、复制、比较等例如Arrays.sortnumbers;对数组进行排序,Arrays.toStringnumbers;将数组转换为字符串多维数组二维数组锯齿数组多维数组二维数组是数组的数组,可以看Java支持不规则的多维数组,即Java支持任意维度的数组,如三作是具有行和列的表格声明语每行的列数可以不同创建时可维数组int[][][]cube=new法为元素类型[][]数组名;例以只指定行数,然后为每行分别int
[3]
[4]
[5];维度越高,表示的如int[][]matrix=new创建数组int[][]jagged=结构越复杂,使用场景也越特殊int
[3]
[4];创建一个3行4列的二维new int
[3][];jagged
[0]=数组new int
[4];jagged
[1]=newint
[2];多维数组遍历遍历多维数组通常使用嵌套循环例如,遍历二维数组for inti=0;imatrix.length;i++{for intj=0;j matrix[i].length;j++{System.out.printmatrix[i][j]+;}}面向对象编程概述多态Polymorphism一个接口多种实现1继承Inheritance2创建分层次的类封装Encapsulation3隐藏内部实现细节面向对象编程是一种基于对象概念的编程范式,它将数据和处理数据的方法组合成一个整体Java是一种纯面向对象的编程语言,所有代码都包含在类中,程序执行的基本单位是对象封装是面向对象的基本特性,它隐藏了类的内部实现细节,只暴露必要的接口,提高了代码的安全性和可维护性继承允许一个类获取另一个类的属性和方法,实现代码重用和层次关系多态允许不同类的对象对同一消息做出不同的响应,提高了代码的灵活性和扩展性类和对象类的定义对象的创建对象的使用类是对象的模板,定义了对象的属性(字段)对象是类的实例,使用new关键字和构造方通过对象引用可以访问对象的方法和字段和行为(方法)类的定义使用class关键字,法创建类名对象名=new构造方法;(如果可见性允许)语法为对象名.方法后跟类名和花括号包围的类体类体包含字例如Student student1=new名或对象名.字段名例如段声明、方法定义、构造方法等例如Student;每个对象都有自己的字段副本,student
1.setName张三;Stringpublic classStudent{private String但共享类的方法代码name=student
1.getName;name;private int age;...}方法的定义和调用方法定义方法是类中定义的函数,用于执行特定操作方法定义包括访问修饰符、返回类型、方法名、参数列表和方法体语法为[访问修饰符][静态修饰符]返回类型方法名参数列表{方法体}返回值方法可以返回一个值给调用者,返回类型在方法定义中指定如果方法不返回值,返回类型为void使用return语句返回值return表达式;方法执行到return语句后立即结束并返回参数传递Java中的参数传递是值传递对于基本类型,传递的是值的副本;对于引用类型,传递的是引用的副本(指向同一对象)方法不能修改基本类型参数的原值,但可以修改引用类型参数指向的对象的内容方法调用调用实例方法对象名.方法名参数调用静态方法类名.方法名参数方法调用可以作为表达式的一部分,如果方法有返回值,可以将调用结果赋给变量或用于其他计算构造方法构造方法定义构造方法是一种特殊的方法,用于创建并初始化对象构造方法的名称必须与类名相同,没有返回类型(甚至不是void)例如public StudentString name,intage{this.name=name;this.age=age;}默认构造方法如果没有显式定义构造方法,Java编译器会提供一个无参数的默认构造方法但如果定义了任何构造方法,编译器就不会提供默认构造方法,这时如果需要无参构造方法,必须显式定义构造方法重载一个类可以有多个构造方法,它们必须有不同的参数列表(参数类型或数量不同)通过提供多个构造方法,可以用不同的方式初始化对象,提高类的灵活性构造方法链接一个构造方法可以调用同一个类的其他构造方法,使用this参数语法这种调用必须是构造方法的第一条语句例如public Student{this未知,0;}关键字this引用当前对象调用其他构造方法12this关键字是对当前对象的引用,可以用来访问当前对象的字段和方在构造方法中,可以使用this参数调用同一个类的其他构造方法这法当局部变量或参数与实例变量同名时,使用this可以明确指代实种调用必须是构造方法的第一条语句例如public Person例变量例如public voidsetAgeint age{this.age=age;}{this未知,0;}作为方法参数返回当前对象34this可以作为参数传递给方法,这通常用于事件监听器或回调函数,方法可以返回this,实现方法链式调用例如public Person将当前对象传递给其他方法例如setNameString name{this.name=name;return this;},button.addActionListenerthis;然后可以这样调用person.setName张三.setAge25;方法重载方法签名编译时多态构造方法重载重载示例方法重载Overloading是指在方法重载是一种编译时多态(静构造方法也可以重载,允许用不重载方法的例子public void同一个类中定义多个方法名相同态绑定)编译器根据调用方法同的方式初始化对象例如printint value{...}和但参数列表不同的方法方法签时提供的参数类型和数量来决定public Rectangle{...}和public voidprintString text名由方法名和参数列表(参数类调用哪个重载方法如果没有找public Rectangleintwidth,{...}和public voidprintint型、个数和顺序)共同决定,返到完全匹配的方法,可能会进行int height{...}value,String format{...}回类型不是方法签名的一部分自动类型转换后再次尝试匹配封装和访问控制1private最严格的访问级别,只能在声明它的类内部访问使用private修饰的成员对外部完全隐藏,实现了完全封装例如private intage;默认包级别2没有访问修饰符的成员具有包级别访问权限,可以被同一个包中的其他类访问,但对包外的类隐藏例如int count;3protectedprotected成员可以被同一个包中的类和其他包中的子类访问这种访问级别在继承中很有用,允许子类访问父类的成员例如protected Stringname;4public最宽松的访问级别,可以从任何地方访问类的接口方法通常声明为public,使其他类可以使用这些方法例如public voidsetNameString name{...}静态成员静态变量静态方法静态块静态变量(类变量)使用static关键字声明,静态方法同样使用static关键字声明,属于静态初始化块用于初始化静态变量或执行其属于类而不是对象,所有对象共享同一个静类而不是对象,可以通过类名直接调用他静态操作,在类加载时执行语法为态变量静态变量在类加载时初始化,可以ClassName.staticMethod静态方法不static{...}一个类可以有多个静态块,按通过类名直接访问ClassName.staticVar能访问实例变量和实例方法,也不能使用照它们在类中出现的顺序执行静态块只执例如public staticint count=0;this和super关键字例如public static行一次,在类首次加载时执行int addinta,int b{return a+b;}继承的概念和实现继承概念继承是面向对象编程的核心概念之一,允许一个类(子类)获取另一个类(父类)的字段和方法继承实现了代码重用,建立了类之间的是一种关系,形成类的层次结构继承语法Java使用extends关键字实现继承class子类extends父类{...}Java只支持单继承,一个类只能有一个直接父类,但可以间接继承多个类例如public classStudentextends Person{...}继承的内容子类继承父类的所有非private成员(字段和方法)子类可以访问父类的protected和public成员,但不能访问private成员子类也可以添加自己的成员,扩展父类的功能继承中的构造方法子类构造方法必须调用父类的构造方法,可以显式使用super参数调用,或者隐式调用父类的无参构造方法super参数必须是子类构造方法的第一条语句方法重写方法重写定义重写规则方法重写Overriding是指子类提供与父类方法签名完全相同的方法实重写方法的访问修饰符不能比父类方法更严格;返回类型必须相同或是父现,用于修改或扩展父类方法的行为方法重写是实现多态的基础,使得类方法返回类型的子类;不能抛出比父类方法更多或更广泛的受检异常;同一个方法调用可以产生不同的行为静态方法不能被重写注解重写与重载的区别@Override使用@Override注解可以明确表明方法是重写父类的方法,编译器会检重写Overriding发生在子类和父类之间,方法签名相同;重载查是否符合重写规则使用这个注解是一种良好的实践,可以避免拼写错Overloading发生在同一个类中,方法名相同但参数列表不同重写是误导致的重写失败运行时多态(动态绑定),重载是编译时多态(静态绑定)关键字super引用父类对象调用父类构造方法12super关键字用于引用父类对象,可以用来访问父类的字段和方法,特别是在子类构造方法中,使用super参数调用父类的构造方法这必须是子类当子类和父类有同名成员时例如super.name或super.display通构造方法的第一条语句如果不显式调用,编译器会自动插入对父类无参构过super可以访问被子类隐藏或重写的父类成员造方法的调用super调用父类方法的限制34super使用super.方法名参数可以调用父类的方法,即使该方法已被子类重写super关键字只能在非静态上下文中使用,不能在静态方法或静态初始化块这在子类需要扩展父类方法功能而不是完全替换时非常有用例如public中使用super不能用于访问父类的private成员super用于引用直接父void display{super.display;System.out.println子类附加信息类,不能跨越多个继承层次;}多态性继承关系父类引用子类对象运行时绑定多态性是面向对象编程的三大特性Java中实现多态的关键是父类多态涉及动态绑定(运行时绑定),之一,指的是同一个操作作用于不引用可以指向子类对象例如即方法调用与对象的实际类型绑定,同的对象,可以有不同的解释和执Animal animal=new Dog;而不是引用的类型当调用行结果多态的前提是继承或实现这种情况下,变量的声明类型animal.sound时,执行的是关系,以及方法的重写(Animal)决定了可以调用哪些Dog类中重写的sound方法,方法,而对象的实际类型(Dog)而不是Animal类中的方法决定了方法的具体实现类型转换可以使用强制类型转换将父类引用转换回子类类型Dog dog=Doganimal;在转换前应使用instanceof运算符检查类型,避免ClassCastException异常ifanimal instanceofDog{Dog dog=Doganimal;}抽象类和抽象方法抽象方法抽象类抽象类的特点抽象方法是使用abstract关键字声明但没有抽象类是使用abstract关键字修饰的类,可抽象类不能被实例化,只能被继承子类必实现的方法,只有方法签名,没有方法体以包含抽象方法和普通方法拥有抽象方法须实现所有抽象方法,否则子类也必须声明例如public abstractvoid draw;抽的类必须声明为抽象类,但抽象类不一定包为抽象类抽象类可以有构造方法,用于子象方法表示一个必须由子类实现的操作,但含抽象方法例如public abstractclass类对象的初始化抽象类可以包含字段、普父类无法提供具体实现Shape{...}通方法、静态方法等,这些都可以被子类继承接口接口定义1完全抽象的引用类型实现接口2类使用implements关键字多接口实现3一个类可实现多个接口接口继承4接口可以继承其他接口接口是一种引用类型,使用interface关键字定义,包含抽象方法、默认方法、静态方法和常量定义接口定义了一组规范,实现接口的类必须遵守这些规范接口名通常以able或ible结尾,如Comparable,Runnable在Java8之前,接口只能包含抽象方法和常量Java8引入了默认方法(使用default关键字)和静态方法,允许在接口中提供方法实现Java9引入了私有方法,用于接口内部代码复用一个类可以实现多个接口,弥补了Java单继承的限制当类实现接口时,必须提供所有抽象方法的实现,除非该类是抽象类接口是Java实现多态的重要机制,支持程序设计接口和实现分离的原则包的概念和使用包的概念包package是Java中用于组织相关类和接口的机制,类似于文件系统中的文件夹包提供了命名空间管理,避免命名冲突,同时实现了访问控制和代码的模块化组织声明包使用package语句声明类所属的包,必须是源文件的第一个非注释语句例如package com.example.myproject;包名通常使用反向域名命名约定,如公司域名是example.com,则包名前缀为com.example导入类和接口使用import语句导入其他包中的类和接口,可以使用完全限定名或导入语句例如import java.util.ArrayList;导入单个类,import java.util.*;导入整个包(但不包括子包)静态导入可以导入静态成员import staticjava.lang.Math.PI;包的物理存储包对应于文件系统中的目录结构,包名的每个部分对应一个子目录例如,com.example.myproject包中的类存储在com/example/myproject/目录下类路径classpath告诉JVM在哪里查找类文件异常处理机制Error1严重系统错误Exception2应用程序异常RuntimeException3运行时异常检查异常4编译时检查的异常Throwable5所有错误和异常的超类Java的异常处理机制提供了一种结构化的方式来处理程序运行时的错误和异常情况所有的异常和错误都是Throwable类的子类,分为Error和Exception两大类Error表示严重的系统级错误,如OutOfMemoryError,通常无法恢复,不应该被捕获Exception表示应用程序可能遇到的问题,又分为受检异常checked和非受检异常uncheckedRuntimeException及其子类是非受检异常,如NullPointerException、ArrayIndexOutOfBoundsException,编译时不强制处理其他Exception子类是受检异常,如IOException、SQLException,必须在代码中通过try-catch捕获或通过throws声明抛出语句try-catch-finally块1trytry块包含可能抛出异常的代码当try块中的代码抛出异常时,JVM会查找匹配的catch块来处理异常如果没有异常发生,所有的catch块都会被跳过块2catchcatch块用于捕获和处理特定类型的异常一个try块后可以有多个catch块,按顺序匹配异常类型应该先捕获具体的异常类型,再捕获更一般的异常类型Java7引入了多重捕获catchIOException|SQLException e{...}块3finallyfinally块包含无论是否发生异常都会执行的代码,通常用于清理资源,如关闭文件、释放锁等即使try或catch块中有return语句,finally块也会在方法返回前执行finally块是可选的,一个try块后必须至少有一个catch块或finally块4try-with-resourcesJava7引入的try-with-resources语句是一种更简洁的资源管理方式格式为try资源声明{...}声明的资源必须实现AutoCloseable接口,会在try块结束时自动关闭,无需finally块例如try FileReaderfr=new FileReaderfile{...}自定义异常创建自定义异常类自定义异常类通常继承Exception(受检异常)或RuntimeException(非受检异常)类名应该以Exception结尾,清晰地表明这是一个异常类例如public classInsufficientFundsExceptionextends Exception{...}构造方法通常提供多个构造方法,包括无参构造方法和带有错误信息的构造方法,有时还包括带有原因cause的构造方法构造方法通常调用父类的相应构造方法,传递错误信息和原因添加特有属性和方法可以在自定义异常类中添加特有的属性和方法,提供更多关于异常的信息例如,InsufficientFundsException可以包含账户余额和尝试提取的金额信息抛出自定义异常使用throw关键字抛出自定义异常throw newInsufficientFundsException账户余额不足如果是受检异常,方法必须使用throws关键字声明可能抛出的异常public voidwithdrawdoubleamount throwsInsufficientFundsException{...}常用类类Java String的特性创建对象1String2StringString类表示不可变的字符序列,一旦创建,其内容不能被修改可以使用字符串字面量双引号括起来的文本或new关键字创建String对象的所有操作方法都会返回一个新的String对象,而不是修String对象字符串字面量存储在字符串常量池中,可以实现共享和改原对象String类被final修饰,不能被继承重用使用new则会在堆内存中创建新对象,即使内容相同常用方法比较3String4Stringlength返回字符串长度;charAtint index返回指定索引处的使用equals方法比较两个字符串的内容是否相同,不要使用==运算字符;substringint beginIndex,int endIndex返回子字符串;符比较引用equalsIgnoreCase方法可以忽略大小写进行比较indexOfString str查找子串位置;equalsObject obj比较compareTo方法按字典顺序比较字符串,返回整数表示大小关系内容是否相等;toUpperCase/toLowerCase转换大小写常用类和Java StringBuffer StringBuilder可变字符序列StringBufferStringBuilder与不可变的String不同,StringBuffer和StringBuffer是线程安全的,所有修改方法StringBuilder与StringBuffer功能完全相StringBuilder表示可变的字符序列,可以都使用synchronized同步,适用于多线程同,但不是线程安全的,没有同步机制,在修改其内容而不创建新对象,适用于频繁修环境主要方法包括append添加内容,单线程环境下性能更好Java5引入改字符串的场景,能够显著提高性能并减少insert在指定位置插入内容,delete删除StringBuilder作为StringBuffer的替代,内存消耗内容,replace替换内容,reverse反转建议在不需要线程安全的情况下使用内容StringBuilder常用类包装类Java基本类型包装类自动装箱与拆箱1基本类型与引用类型转换简化基本类型与包装类转换2缓存机制常用方法4提高常用值的性能3类型转换、值比较、常量Java为每种基本数据类型提供了对应的包装类Byte、Short、Integer、Long、Float、Double、Character和Boolean包装类将基本类型包装成对象,使其能够用在只接受对象的场合,如集合类自动装箱Autoboxing是将基本类型自动转换为对应的包装类,例如Integer num=100;自动拆箱Unboxing是将包装类自动转换为对应的基本类型,例如intvalue=num;这些特性由编译器实现,简化了代码包装类提供了许多有用的方法和常量,如类型转换parseInt、valueOf、值范围常量MAX_VALUE、MIN_VALUE等包装类都实现了缓存机制,对常用值-128到127之间的整数,以及字符、布尔值预先创建对象并缓存,提高了性能常用类类Java Math数学常量基本数学运算指数和对数Math类提供了常用的数学常量,提供基本运算方法如绝对值abs、提供幂运算pow、平方根sqrt、如πMath.PI和自然对数的底数最大值max、最小值min、四立方根cbrt、自然对数log和eMath.E这些常量都是公共舍五入round、向上取整ceil、以10为底的对数log10等方法静态常量,可以通过Math类直接向下取整floor等例如例如Math.pow2,3返回
8.0,访问Math.abs-10返回10,Math.sqrt9返回
3.0Math.max5,8返回8三角函数包含各种三角函数,如正弦sin、余弦cos、正切tan及其反函数,以及角度与弧度转换方法例如Math.sinMath.PI/2返回
1.0,Math.toDegreesMath.PI返回
180.0集合框架概述Java集合框架的组成Java集合框架是一组表示和操作集合的统一架构,包括接口、实现类和算法主要分为Collection单个元素的集合和Map键值对的集合两大类集合框架位于java.util包中接口CollectionCollection是集合层次的根接口,定义了所有集合都应具有的核心方法其主要子接口包括List有序集合、Set不允许重复元素的集合和Queue队列常用方法有add、remove、contains、size、iterator等接口MapMap表示键值对映射,键不能重复主要实现有HashMap高效的通用实现、TreeMap基于红黑树的有序实现和LinkedHashMap保持插入顺序常用方法有put、get、remove、containsKey、keySet、values等迭代器模式Iterator接口提供了遍历集合的统一方式,所有集合都实现了iterator方法返回一个迭代器ListIterator扩展了Iterator,支持双向遍历和元素修改Java5引入的增强for循环简化了集合遍历for元素类型变量:集合{...}接口和实现类List特性List ArrayListList是有序集合,元素按插入顺序排列,允许重复元素,可以通过索引访问元素ArrayList基于动态数组实现,支持快速随机访问,但插入和删除元素可能需要List接口扩展了Collection接口,增加了基于索引的操作方法,如getint移动其他元素适用于频繁访问元素,但不经常插入删除的场景默认初始容index、addint index,E element、removeint index等量为10,当容量不足时自动扩容50%非线程安全LinkedList VectorLinkedList基于双向链表实现,支持快速插入和删除操作,但随机访问性能较Vector是早期Java版本的集合类,与ArrayList类似,但是线程安全的由于差同时实现了List和Deque接口,可以作为列表、栈或队列使用适用于频同步机制导致性能较差,现代Java应用很少使用当需要线程安全时,推荐使繁插入删除,不经常随机访问的场景非线程安全用Collections.synchronizedList包装ArrayList,或使用CopyOnWriteArrayList接口和实现类Set特性1SetSet表示不允许有重复元素的集合,最多包含一个null元素Set接口继承自Collection接口,但没有添加新方法,主要用于表达集合的数学概念常用于检查元素是否存在、去除重复元素等场景2HashSetHashSet基于HashMap实现,使用哈希表存储元素,提供常数时间的添加、删除和包含操作元素无序且不能保证迭代顺序HashSet使用元素的hashCode和equals方法判断重复,因此存储的对象应该正确覆盖这两个方法3LinkedHashSetLinkedHashSet继承自HashSet,但维护了元素的插入顺序,使用双向链表记录插入顺序结合了哈希表的高效查找和链表的有序特性,迭代性能优于HashSet适用于需要保持插入顺序的场景4TreeSetTreeSet基于TreeMap红黑树实现,元素按照自然顺序或指定的Comparator排序提供有序迭代和范围操作,但添加、删除和查找操作的时间复杂度为Olog n元素必须实现Comparable接口或提供Comparator接口和实现类MapHashMap LinkedHashMapTreeMapHashMap基于哈希表实现,提供LinkedHashMap继承自TreeMap基于红黑树实现,键按常数时间的get和put操作键和HashMap,但维护了键值对的插照自然顺序或指定的值都可以为null非线程安全,不入顺序或访问顺序(通过构造函数Comparator排序提供有序的保证映射的顺序Java8中,当指定)结合了哈希表的高效和链键遍历和范围操作,但操作的时间哈希冲突过多时,会将链表转为红表的有序特性适用于需要按插入复杂度为Olog n键不能为黑树,提高查找效率适用于一般顺序迭代的场景或实现LRU缓存null适用于需要按键排序的场景的键值对存储需求HashtableHashtable是早期Java版本的实现,与HashMap类似,但是线程安全的键和值都不能为null由于同步导致性能较差,现代Java应用很少使用替代方案是ConcurrentHashMap,它提供了更好的并发性能泛型泛型的概念泛型类和接口泛型方法泛型是Java5引入的一种参数化类型机制,泛型类/接口定义格式class/interface名泛型方法在返回类型前声明类型参数类型允许类、接口和方法操作未知类型的对象,称类型参数{...}类型参数通常使用单个参数返回类型方法名参数{...}类型参提供编译时类型安全检查泛型的核心思想大写字母表示,如E元素、T类型、K键、数的作用域仅限于该方法例如public T是将类型作为参数传递,实现代码复用的V值例如public classBox{private getMiddleT...a{return同时保证类型安全T value;public TgetValue{return a[a.length/2];}value;}}文件和流基础I/O类流的概念流的层次结构File NIONewI/OFile类表示文件系统中的文件或目I/O流是Java进行输入/输出操作的Java I/O流采用装饰器模式,形成Java NIOjava.nio包是Java4录路径,但不代表实际的文件内容基础,分为输入流读取数据和输了灵活的层次结构基本流直接连引入的替代传统I/O的API,提供了可以用来创建、删除、重命名文件出流写入数据流可以基于字节接到数据源/目标,如更高效的I/O操作核心概念包括和目录,检查文件属性,以及列出处理二进制数据或字符处理文FileInputStream处理流装饰Buffer缓冲区、Channel通道目录内容例如File file=new本所有流类都实现了器包装其他流,添加额外功能,如和Selector选择器,支持非阻塞Filedata.txt;file.exists;Closeable接口,使用完毕后应调BufferedInputStream提供缓冲,I/O和内存映射文件操作file.length;用close方法释放资源提高性能字节流和字符流字节流字符流1处理二进制数据处理文本数据2数据流和对象流缓冲流4处理基本类型和对象3提高I/O性能字节流是最基本的I/O流,直接处理字节数据主要类有InputStream和OutputStream及其子类常用的字节流类包括FileInputStream/FileOutputStream文件字节流,ByteArrayInputStream/ByteArrayOutputStream字节数组流字符流处理16位Unicode字符,适用于文本数据主要类有Reader和Writer及其子类字符流在内部使用字符集编码/解码字节常用的字符流类包括FileReader/FileWriter文件字符流,StringReader/StringWriter字符串流缓冲流BufferedInputStream/BufferedOutputStream和BufferedReader/BufferedWriter通过内部缓冲区减少物理I/O操作次数,提高性能BufferedReader还提供了readLine方法读取整行文本编程和Java GUIAWT Swing简介AWTAWTAbstract WindowToolkit是Java最早的GUI工具包,位于java.awt包中AWT使用本地平台的图形组件,所以在不同平台上外观和行为可能不同AWT组件如Button、TextField、Label等都是重量级组件,因为它们直接使用本地窗口系统资源简介SwingSwing是基于AWT构建的更高级的GUI工具包,位于javax.swing包中Swing组件大多以J开头,如JButton、JTextFieldSwing使用纯Java实现界面绘制,提供了一致的跨平台外观,同时也支持可插拔的外观Look andFeel布局管理器布局管理器负责安排组件的位置和大小主要布局管理器包括FlowLayout按添加顺序排列、BorderLayout东南西北中五个区域、GridLayout网格、BoxLayout水平或垂直排列和GridBagLayout灵活的网格组件层次结构Java GUI组件形成层次结构顶层容器如JFrame可以包含面板JPanel,面板可以包含其他组件组件可以通过add方法添加到容器中构建GUI通常是先创建容器,设置布局管理器,然后添加组件事件处理事件模型1Java使用基于委托的事件模型,由事件源、事件对象和事件监听器组成当用户与GUI组件交互时,组件事件源生成事件对象,并通知已注册的事件监听器这是观察者设计模式的实现事件监听器2事件监听器是实现特定监听器接口的对象,定义了响应特定事件的方法常用监听器接口包括ActionListener按钮点击等、MouseListener鼠标事件、KeyListener键盘事件和WindowListener窗口事件注册监听器3组件通过addXxxListener方法注册监听器例如,为按钮添加点击事件button.addActionListenernew ActionListener{public voidactionPerformedActionEvente{...}}Java8之后可以使用Lambda表达式简化代码事件处理流程4事件处理过程用户操作组件→组件创建事件对象→组件调用已注册监听器的对应方法→监听器执行事件处理代码事件沿组件层次结构传播,可能经历捕获阶段、目标阶段和冒泡阶段多线程基础线程的概念多线程的优势线程状态线程是程序执行的最小单位,是进程中的一多线程编程可以提高程序的响应性、资源利Thread.State枚举定义了线程的六种状态个执行流一个进程可以包含多个线程,它用率和性能例如,GUI应用中使用单独线NEW新建、RUNNABLE可运行、们共享进程的资源内存空间,但有独立的执程处理耗时操作,避免界面冻结;服务器应BLOCKED阻塞、WAITING等待、行路径和栈空间Java从语言级别支持多线用使用多线程同时处理多个客户端请求;计TIMED_WAITING计时等待和程编程,通过java.lang.Thread类和算密集型应用可以利用多核处理器并行计算,TERMINATED终止线程的生命周期由这java.lang.Runnable接口提供线程实现加快处理速度些状态及其转换组成通过getState方法可以获取线程的当前状态线程的创建和启动继承类实现接口实现接口Thread RunnableCallable创建线程的第一种方式是继承创建线程的第二种方式是实现Callable接口类似于Runnable,但Thread类并重写run方法例如Runnable接口并实现run方法call方法可以返回结果并抛出异常class MyThreadextends例如class MyRunnable与ExecutorService和Future一起Thread{public void run{...}}implements Runnable{public使用ExecutorService executor创建和启动线程MyThread t=voidrun{...}}创建和启动线程=new MyThread;t.start;Thread t=new ThreadnewExecutors.newSingleThreadExMyRunnable;t.start;ecutor;Future future=executor.submitnewMyCallable;使用表达式LambdaJava8之后,可以使用Lambda表达式简化线程创建Thread t=new Thread-{...};t.start;对于需要返回结果的任务Callabletask=-{return123;};线程同步线程安全问题当多个线程同时访问和修改共享数据时,可能导致数据不一致、丢失更新或读取到不一致的状态,这就是线程安全问题例如,多线程对同一个计数器递增可能导致最终结果小于预期值关键字synchronizedJava提供synchronized关键字实现线程同步,可以修饰方法或代码块synchronized实现互斥访问,一次只允许一个线程执行同步代码同步方法public synchronizedvoidincrement{...}同步代码块synchronizedlockObject{...}接口Lockjava.util.concurrent.locks包提供了更灵活的锁机制Lock接口的实现如ReentrantLock提供了可中断锁、定时锁等高级特性使用Lock时,必须在finally块中释放锁,避免死锁lock.lock;try{...}finally{lock.unlock;}并发容器java.util.concurrent包提供了线程安全的集合,如ConcurrentHashMap支持并发访问的Map、CopyOnWriteArrayList适用于读多写少场景这些容器内部实现了同步机制,不需要额外加锁,同时提供更好的并发性能编程基础JDBC简介1JDBCJDBCJava DatabaseConnectivity是Java标准库中用于连接和操作关系型数据库的API它提供了一组标准接口,使Java应用程序能够以统一的方式访问不同的数据库系统如MySQL、Oracle、SQLServer等连接数据库2使用JDBC连接数据库的步骤1加载数据库驱动Class.forNamecom.mysql.jdbc.Driver;2建立连接Connection conn=DriverManager.getConnectionurl,username,passwordJava6之后,通常可以省略显式加载驱动的步骤执行语句3SQLJDBC提供了三种执行SQL的方式Statement适用于静态SQL、PreparedStatement预编译SQL,支持参数,防止SQL注入和CallableStatement调用存储过程常用的是PreparedStatement PreparedStatementpstmt=conn.prepareStatementSELECT*FROM usersWHERE id=;处理结果集4执行查询后,使用ResultSet处理结果ResultSet rs=pstmt.executeQuery;whilers.next{Stringname=rs.getStringname;}使用完毕后,应当按照ResultSet→Statement→Connection的顺序关闭资源,最好放在finally块中或使用try-with-resources语句网络编程基础网络基础概念Java网络编程主要基于TCP/IP协议栈,涉及IP地址、端口、Socket等概念IP地址标识网络上的主机,端口号标识主机上的应用程序Socket是网络通信的端点,Java通过Socket类提供了TCP通信,通过DatagramSocket类提供了UDP通信通信TCPTCP是面向连接的可靠协议Java中,服务器使用ServerSocket绑定端口并监听连接,客户端使用Socket连接服务器建立连接后,双方通过输入/输出流交换数据例如,服务器ServerSocket serverSocket=new ServerSocket8000;Socket clientSocket=serverSocket.accept;通信UDPUDP是无连接的不可靠协议,但速度快,开销小Java使用DatagramSocket发送和接收数据包DatagramPacket适用于对实时性要求高、对可靠性要求低的场景,如音视频流、游戏状态更新等和高级URL APIJava提供了URL类和URLConnection类简化网络资源访问例如URL url=newURLhttps://example.com;URLConnection conn=url.openConnection;InputStream in=conn.getInputStream;Java11引入了HttpClient,提供更现代的HTTP客户端API课程总结与展望经过本课程的学习,您已经掌握了Java编程的核心概念和技能,包括基础语法、面向对象编程、异常处理、集合框架、I/O操作、GUI编程、多线程、数据库和网络编程等这些知识和技能为您成为一名Java开发者奠定了坚实的基础Java作为一种成熟而强大的编程语言,拥有广泛的应用领域和庞大的生态系统您可以继续深入学习Spring、SpringBoot等企业级开发框架,探索Android移动应用开发,或者研究大数据处理技术如Hadoop和SparkJava持续进化的特性也值得关注,如模块系统、本地变量类型推断、记录类型等现代特性希望这门课程能激发您对Java编程的兴趣,并为您的职业发展提供助力编程学习是一个持续的过程,保持实践和学习的热情,不断挑战自我,您将在Java开发领域取得更大的成就。
个人认证
优秀文档
获得点赞 0