还剩48页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
程序设计Java欢迎来到程序设计课程!本课程专为计算机科学和软件工程专业的学生Java设计,旨在培养学生的编程能力和面向对象思维Java我们将从基础知识开始,逐步深入到面向对象编程、集合框架、异常处Java理、操作、多线程编程等高级主题通过理论学习与实践相结合的方式,IO帮助你建立扎实的编程基础Java本课程采用理论示例实践三位一体的教学模式,每个知识点都配有丰富--的代码示例和编程练习,确保你能够真正掌握编程技能,为未来的软件Java开发工作打下坚实基础发展历史与应用领域Java1年1991由詹姆斯高斯林领导的团队开始绿色计划,致力·James GoslingGreen Project于开发一种可移植的语言2年1995语言正式发布,最初名为,后改名为Java OakJava3年2006成为开源软件,公司发布了项目Java SunOpenJDK4年2009收购公司,成为技术的所有者Oracle SunJava已发展成为全球最流行的编程语言之一,广泛应用于企业级应用、移动开发、大数据处理和云计Java算等领域从应用开发到大型企业信息系统,从网络服务器到嵌入式设备,的应用无Android Java处不在随着物联网和人工智能技术的发展,在这些新兴领域也展现出强大的生命力行业调查显示,Java开发人员的需求持续增长,薪资水平也保持在较高水平,职业发展前景十分广阔Java基本特性与优势Java跨平台特性一次编写,到处运行面向对象封装、继承、多态健壮性与安全性强类型检查与安全机制的一次编写,到处运行特性源于其虚拟机机制程序被编译为平台无关的字节码,然后在各种操作系统上的虚拟机中执行,JavaJava Java JVM解决了传统语言的平台依赖问题作为一种纯面向对象的语言,通过类、对象、继承等机制,实现了代码的模块化和复用面向对象的特性使程序结构清晰,便于维护和扩Java Java展,提高了开发效率的自动垃圾回收机制避免了内存泄漏问题,安全管理器确保程序运行在受控环境中,这些特性大大增强了程序的健壮性和安全性Java与概述JDK JREJDKJava DevelopmentKit JRE Java RuntimeEnvironment开发工具包,包含编译器、调试器等Java开发工具,以及运行环境,提供运行程序的必要JREJava Java组件编译器,将源代码转换为字节•javac码虚拟机,负责执行字节码•JVM Java启动,执行字节码类库核心类库•java JVM•Java API文档生成工具支持文件配置文件和资源文件•javadoc•JVM JavaVirtual Machine虚拟机,实现跨平台特性的核心Java类加载器加载字节码到内存•执行引擎执行字节码指令•垃圾回收器自动内存管理•的版本演进速度在近年来明显加快从的长期支持版本到的最新版本,Java Java8Java17LTS每个版本都带来了语言特性的改进和性能的提升目前企业环境中使用最广泛的是和Java8,而作为年发布的长期支持版本,正逐渐被更多企业采用Java11Java172021开发环境搭建Java创建第一个项目安装IDE在中创建新项目,编写程序,编译运IDE HelloWorld安装JDK选择合适的集成开发环境,主流选择有、行验证环境配置是否正确,同时熟悉的基本操作和Eclipse IDE从官网下载适合你操作系统的安装包,按和被认为是当前最先项目结构Oracle JDKIntelliJ IDEANetBeans IDEA照安装向导完成安装,并正确配置环境进的,提供社区版免费和旗舰版付费JAVA_HOME Java IDE变量和变量,确保命令行能够识别和PATH java javac命令对于初学者,提供了更友好的用户界面和智能代码补全功能,能够显著提高开发效率在配置过程中,常见问题包括环境变量设置不正确、版本与IntelliJ IDEAJDK IDE不匹配等,遇到问题时可检查相关配置路径是否正确第一个程序通常是经典的,这个简单程序展示了程序的基本结构,包括类定义、方法和输出语句,是理解程序执行流程的良好起点Java HelloWorld Javamain Java程序结构与书写规范Java编写源代码编译创建文件命令生成文件.javajavac.class调试与优化运行测试和改进代码命令执行字节码java程序的基本组织单位是类,类定义必须放在与类名相同的文件中包用于组织类,避免命名冲突,遵循反向域名命名规则,如Java Class.java package良好的包结构对大型项目尤为重要com.company.project代码规范遵循驼峰命名法,类名首字母大写,方法和变量名首字母小写注释分为单行注释、多行注释和文档注释,良好的注释习惯有助于提高代码可Java///**//***/读性从源代码到运行,程序经过编译和解释两个阶段编译器将源代码转换为字节码,解释执行字节码,这种机制确保了跨平台特性,同时通过即时编译技术提高运行JavaJVMJIT效率基本数据类型类型分类数据类型位数取值范围整数类型位byte8-128~127整数类型位short16-32,768~32,767整数类型位int32-2^31~2^31-1整数类型位long64-2^63~2^63-1浮点类型位单精度浮点数float32浮点类型位双精度浮点数double64字符类型位char160~65,535Unicode布尔类型位boolean1true/false的基本数据类型分为四大类整数类型、浮点类型、字符类型和布尔类型整数类型中,是最常用的类型,Java int而适用于需要表示较大数值的场景,定义类型字面量需要在数字后加long longL浮点类型中,表示单精度浮点数后缀,表示双精度浮点数,默认的小数字面量是类型需要floatF doubledouble注意浮点数计算可能带来的精度问题,金融计算应使用类BigDecimal类型转换分为隐式转换自动类型提升和显式转换强制类型转换从小类型到大类型可以自动转换,反之需要强制转换,但可能导致精度丢失或数据溢出变量与常量变量常量变量是程序中可以改变值的存储单元,必须先声明后使用声明格常量是程序中固定不变的值,使用关键字修饰声明格式为final式为数据类型变量名初始值数据类型常量名值[=];final=;如果声明时不赋初值,基本类型会有默认值,局部变量必须在使用常量名通常全部大写,多个单词间用下划线连接,声明时必须初始前初始化化变量的作用域是指变量可见的范围类变量静态变量作用于整个类;实例变量作用于对象实例;局部变量作用于声明它的方法或Scope块内变量遵循就近原则,内层变量会覆盖同名的外层变量变量的生命周期是指变量从创建到销毁的整个时间段静态变量的生命周期与类相同;实例变量的生命周期与对象相同;局部变量的生命周期仅限于方法执行期间理解变量的作用域和生命周期对编写正确的程序至关重要常量在中扮演着重要角色,合理使用常量可以提高代码的可读性和可维护性特别是对于那些在程序中多次使用的固定值,使用常量Java可以避免魔法数字,便于将来的修改运算符与表达式算术运算符关系运算符加法等于•+•==减法不等于•-•!=乘法大于•*•除法小于•/•取余大于等于•%•=自增小于等于•++•=自减•--逻辑运算符与•或•||非•!按位与•按位或•|按位异或•^自增和自减运算符有前缀和后缀两种形式前缀形式先增加变量值再使用,后缀形式先使用变量当前值再增加++--++i i++这一微妙的区别在复杂表达式中可能导致不同的结果赋值操作也被视为表达式,返回赋值后的值提供了复合赋值运算符以简化代码例如,等价于Java+=,-=,*=,/=,%=x+=5x,但更简洁且只计算一次左操作数=x+5运算符优先级决定表达式计算顺序,从高到低依次为括号一元运算符乘除模加减移位关系相等位运算逻辑运算条件赋值复杂表达式中应使用括号明确计算顺序,提高代码可读性控制语句概述分支结构根据条件选择执行路径顺序结构从上到下逐行执行循环结构重复执行某段代码顺序结构是程序的默认执行方式,按照代码编写的顺序从上到下执行这是最简单的控制流程,但仅靠顺序结构很难实现复杂的算法和逻辑分支结构通过条件判断决定执行路径语句用于二分支选择,适合条件较少且逻辑复杂的情况;语句适用于多分支选择,条件为字符、整数、枚举等if/else switch Java后的表达式进一步增强了灵活性12switch循环结构用于重复执行某段代码循环适合执行次数确定的循环;循环适合执行次数不确定的循环;循环确保至少执行一次循环体选择合适的循环结for while do-while构有助于提高代码的清晰度和效率分支结构详细解析简单语句if条件语句块if{}条件为时执行语句块,否则跳过true语句if-else条件语句块语句块if{1}else{2}条件为执行语句块,否则执行语句块true12嵌套if-else if-else条件语句块条件语句块语句块if1{1}else if2{2}...else{n}从上到下检查条件,执行第一个符合条件的语句块多分支switch表达式值语句语句switch{case1:1;break;...default:n;}根据表达式的值选择执行路径嵌套是处理多条件逻辑的常用方式,但嵌套层级过多会降低代码可读性建议使用良好的缩进和花括号风格,即if/else使单行语句也使用花括号,避免悬空问题复杂条件判断可抽取为方法或使用逻辑运算符组合,提高代码清晰度else语句在中支持、、、、枚举和类型每个标签后的语句执行完毕必switchJavabyte shortint charStringJava7+case须使用跳出,否则会发生贯穿现象,继续执行下一个的语句此特性可用于多条件共享处理逻辑,但应小心breakcase使用,避免引入错误循环结构详细解析循环循环循环for whiledo-while初始化条件迭代循环体条件循环体循环体条件for;;{}while{}do{}while;示例示例示例for int i=0;i10;i++{int i=0;inti=0;System.out.printlni;while i10{do{}System.out.printlni;System.out.printlni;适用于已知循环次数的场景i++;i++;}}while i10;适用于循环次数不确定的场景循环体至少执行一次引入的增强循环简化了对数组和集合的遍历语法为元素类型变量集合或数组循环体这种方式避免了显式的索引操作,代码更简洁易读,Java5for for-each for:{}但无法获取元素索引,也不能修改集合结构与的主要区别在于条件检查时机先检查条件再执行循环体,条件初始为时循环体一次不执行;先执行循环体再检查条件,确保循环体至少whiledo-while whilefalse do-while执行一次选择时应考虑业务逻辑需求循环控制语句包括和用于完全跳出当前循环;用于跳过本次循环剩余部分,直接进入下一次迭代在嵌套循环中,这些语句默认只影响最内层break continuebreak continue循环,可通过标签指定影响的循环层级label数组基础数组声明数组创建数组初始化类型数组名数组名类型长类型数组名值[];=new[[]={1,度值];2,...};类型数组名[];类型数组名类型数组名[]=new[]=new类型长度类型值值[];[]{1,2,...};数组访问数组名索引索引[]//从开始0一维数组是中最基本的数组形式,其长度在创建后不可改变数组元素在内存中连续存储,可通Java过索引直接访问,提供了的访问性能索引必须在到范围内,越界访问会抛出O10length-1异常ArrayIndexOutOfBoundsException二维数组实际上是数组的数组,可以看作矩阵结构声明和创建方式为type[][]arrayName=中二维数组的每一行长度可以不同,这种情况下创建时可只指定new type[rows][columns]Java行数,再分别为每行分配不同长度数组遍历有多种方式,包括传统循环、增强循环和引入的流操作对于简单for forJava8Stream遍历,增强循环代码最简洁;需要索引信息时使用传统循环;进行复杂转换和过滤操作时,流for for式处理更具表达力字符串操作基础字符串创建字符串字面量与构造方法字符串操作连接、截取、查找等方法字符串特性不可变性与字符串池在中,字符串有两种创建方式使用字符串字面量和使用构造函数字面量创建的字符串会被放入字符串常量池,具有共享特性;而操作符创Java...String new建的字符串对象总是在堆内存中,即使内容相同也是不同对象类提供了丰富的方法,包括获取长度;获取指定位置字符;截取子串;查找子串位置;String lengthcharAtindex substringstart,end indexOfstr和比较内容;和转换大小写;去除首尾空白等equals equalsIgnoreCasetoLowerCase toUpperCasetrim字符串最重要的特性是不可变性一旦创建,对象的内容不能被修改,所有看似修改的操作实际上都创建了新字符串对象这种特性保证了Immutability String线程安全,但频繁操作字符串会产生大量临时对象对于需要频繁修改的场景,应使用非线程安全或线程安全类StringBuilderStringBuffer方法与参数传递方法定义修饰符返回类型方法名参数列表方法体{}方法调用对象方法名实参列表实例方法.;//类名方法名实参列表静态方法.;//返回值表达式返回值方法return;//方法可选return;//void方法是实现特定功能的代码块,是实现代码复用和模块化的基本单位方法定义包括访问修饰符、返回类Java型、方法名、参数列表和方法体方法命名通常采用动词或动词短语,表明方法的功能,如、getUserName等calculateTotal方法不返回任何值,主要用于执行操作而非计算;有返回值的方法必须通过语句返回与声明的返回void return类型兼容的值语句执行后,方法立即结束,后续代码不再执行方法可以有多个语句,但每return return次调用只执行一个的参数传递机制是值传递,无论是基本类型还是引用类型对于基本类型,传递的是值Java pass-by-value的副本;对于引用类型,传递的是引用的副本,而非对象本身因此,方法内部无法直接修改调用者的原始变量,但可以通过引用修改对象的内部状态理解这一机制对正确编写和使用方法至关重要方法重载与递归方法重载递归方法方法重载是指在同一个类中定义多个同名但参数列表不同的方法递归是一种方法自己调用自己的编程技术递归方法必须有一个基参数列表的不同可以是参数个数不同,参数类型不同,或参数顺序本情况终止条件,否则会导致无限递归,最终引发栈溢出错误不同重载方法必须有不同的参数列表,仅返回类型不同不构成重StackOverflowError载递归适合解决具有自相似结构的问题,如阶乘计算、斐波那契数列、编译器根据调用时提供的参数类型和数量决定调用哪个方法,这称树结构遍历等为静态绑定或早期绑定方法重载提高了代码的可读性和灵活性,允许同一操作面对不同数据类型或参数组合例如,方法针对不同数据类型有多个重载println版本,使开发者无需记忆不同的方法名在设计时,合理使用方法重载可以创造更直观的接口API递归与迭代是解决重复计算的两种方法递归通常代码更简洁,逻辑更清晰,特别是对于树形结构等问题;而迭代通常效率更高,不存在栈溢出风险例如,阶乘计算可用递归实现,基本情况是factorialn=n*factorialn-1factorial1=1递归的主要缺点是可能导致性能问题和栈溢出每次递归调用都会在栈上分配新的栈帧,消耗内存;深度递归可能超出栈深度限制JVM对于某些递归问题,可以通过尾递归优化、记忆化搜索或转换为迭代方式来提高效率面向对象基础12封装继承信息隐藏与访问控制,通过私有成员变量和公共访问方类层次结构与代码复用,通过关键字建立父子extends法实现关系3多态同一操作作用于不同对象产生不同行为,通过方法重写和动态绑定实现面向对象编程是一种以对象为中心的编程范式,与传统的过程式编程相比,更注重数据与行为的结合在OOP中,类是对象的模板,定义了对象的属性成员变量和行为方法;对象是类的实例,代表现实世界中的实体Java封装是隐藏对象内部实现细节,只暴露必要接口的机制通过将成员变量设为私有,并提供公共的和getter setter方法,实现对数据的保护和访问控制良好的封装提高了代码的安全性和可维护性,降低了模块间的耦合度统一建模语言类图是描述类及其关系的标准化图形表示类图中,矩形框表示类,分为三部分类名、属性UML和方法类之间的关系用不同类型的线表示,如继承空心三角箭头、实现虚线空心三角箭头、关联实线、聚合空心菱形和组合实心菱形类的定义与对象创建类的定义类是对象的蓝图,包含成员变量属性和方法行为类定义以关键字开始,包含类名、访问修饰符、父类如有、实现的接口及类体成员变量定义了对象的状态,方法定义了对象的行为class对象的创建使用关键字创建对象类名对象引用类名参数列表这一过程包括分配内存空间、调用构造方法初始化对象、返回对象引用对象创建后,可通过对象引用访问其成员变量和方法new=new对象引用对象引用是指向堆内存中对象的指针中所有对象都存储在堆内存中,而引用存储在栈内存中多个引用可指向同一对象,当对象不再被任何引用指向时,垃圾回收器会回收该对象占用的内存Java中,类成员可分为实例成员和静态成员实例成员与具体对象关联,每个对象都有自己的实例变量副本;静态成员与类关联,被所有对象共享实例成员通过对象引用访问,静态成员可通过类名直接访问Java构造方法是创建对象时自动调用的特殊方法,用于初始化对象构造方法与类同名,没有返回类型,可以重载以支持不同方式的对象创建如果类中没有显式定义构造方法,编译器会提供一个无参构造方法;一旦定义了带参构造方法,默认无参构造方法不再自动提供关键字与对象成员this引用当前对象调用构造方法链式调用关键字是对当前对象的引用,用于在方法用于调用同一类中的另一个构造方法,方法返回引用,支持链式调用模式this this this内部访问对象的成员变量和方法当局部变量实现构造方法间的代码复用调用必须是构造,使多个方法调用可连method chaining与成员变量同名时,可明确区分,避免变方法中的第一条语句,且不能形成循环调用接成一个表达式,提高代码的流畅性和可读性this量遮蔽当局部变量与成员变量同名时,局部变量会遮蔽成员变量,这种情况下必须使用关键字来访问成员变量例如这里,等号左边的thisthis.name=name;引用成员变量,右边的引用局部变量或参数这种命名方式虽然导致需要使用,但在参数命名中很常见this.name namethis在中,所有实例方法都隐含一个参数,指向调用该方法的对象虽然不需要显式声明,但编译器会在方法调用时自动传递静态方法没有引用,因为它Java thisthis们不与特定对象关联,这也是静态方法不能直接访问实例成员的原因链式调用是一种流行的编程模式,通过返回引用,允许在单个语句中连续调用多个方法例如this StringBuildersb=new这种模式在构建器和流式中广泛使用,提高了代码的表达力和简洁性StringBuilder.appendHello.append.appendWorld;Builder API构造方法详解构造方法特性与类同名,无返回类型,定义对象初始化逻辑默认构造方法若未定义任何构造方法,编译器自动提供无参构造方法构造方法重载定义多个参数列表不同的构造方法,满足不同初始化需求构造方法链使用调用同类其他构造方法,优化代码结构this构造方法是类的特殊方法,在创建对象时自动调用,负责初始化对象的状态构造方法与类同名,不声明返回类型(包括),主要用于为对象的成员变量赋初值、获取必要资源或执行其他初始化操作一个类可以有多个构造方法,但void它们必须有不同的参数列表构造方法重载提供了创建对象的多种方式例如,一个类可以有无参构造方法、仅接收姓名的构造方法、接收姓Person名和年龄的构造方法等合理设计构造方法重载可以提高类的易用性,适应不同的初始化场景如果定义了任何构造方法,编译器不再提供默认无参构造方法,此时需要显式定义构造方法链是一种避免代码重复的技术,通过调用同一类中的其他构造方法例如this PersonString name,表示调用构造方法这种模式通常采用从简到繁的结构,较简{thisname,0;}PersonStringname,int age单的构造方法调用功能更全面的构造方法,形成一个调用链,最终由一个主构造方法完成实际初始化工作封装与访问控制访问修饰符访问器与修改器封装实践提供四种访问级别,从最严格到最宽松依次为访问器方法用于获取私有成员变量的值,通良好的封装实践包括将成员变量声明为,Java getterprivate仅类内部访问、默认包级同包访问、常命名为;修改器方法用于修改私提供必要的方法访问这些变量,在方法private/getXxx setterpublic setter同包及子类访问、任何地方访有成员变量的值,通常命名为这些方法可中添加数据验证,隐藏实现细节,只暴露必要的接口protectedpublic setXxx问合理选择访问级别可以控制类成员的可见性,以添加数据验证和处理逻辑,确保对象状态的合法性封装使对象状态的改变受控,提高代码的安全性和可实现信息隐藏维护性封装是面向对象编程的核心原则之一,通过限制对对象内部状态的直接访问,将数据与操作数据的方法绑定在一起封装的主要目的是保护对象不受外部干扰,避免对象状态被无意中破坏,同时允许随时改变内部实现而不影响外部代码中,实现封装的主要机制是访问修饰符和访问器修改器方法通过将成员变量声明为,阻止外部直接访问;通过提供的和方法,Java/private publicgetter setter控制对这些变量的访问这种模式既保护了数据,又提供了灵活的访问机制静态成员与类方法static静态变量静态方法静态代码块使用关键字修饰的成员变量,属于类而非对象实例,使用关键字修饰的方法,同样属于类而非对象实例类中使用关键字定义的代码块,在类加载时执行,早static staticstatic被所有实例共享内存中只有一个副本,通常用于表示所有静态方法不能直接访问实例成员,但可以访问静态成员,也于任何构造方法,用于静态初始化操作一个类可以有多个对象共有的特性或需要在所有对象间共享的数据可以通过对象引用访问实例成员静态代码块,按声明顺序执行通过类名或对象引用访问通过类名直接调用在类首次被加载时执行•••在类加载时初始化不能使用和关键字只执行一次••this super•生命周期与类相同常用于工具类和工厂方法常用于初始化静态资源•••静态成员与实例成员的最本质区别在于所有权和生命周期静态成员属于类,在类加载时创建,直到程序结束才被销毁;实例成员属于对象,在对象创建时初始化,随对象销毁而回收静态成员在内存中只有一个副本,而实例成员在每个对象中都有一份副本静态方法的主要用途包括操作静态变量的工具方法;不需要访问对象状态的功能方法;工厂方法,用于创建该类的实例类就是静态方法应用的典型例子,它提供了许多数学计算方法,如Math、等,这些方法不依赖任何对象状态Math.sqrt Math.max在设计中,何时使用静态成员是一个重要考量一般而言,表示对象固有属性的应为实例变量;表示所有对象共享特性的应为静态变量;依赖对象状态的操作应为实例方法;不依赖对象状态的功能性操作应为静态方法不当使用静态成员可能导致全局状态问题,破坏对象封装性,增加代码耦合度继承与父子类关系父类基类超类/被继承的类,提供共享特性关键字extends建立继承关系,子类继承父类特性子类派生类继承父类,可添加或修改特性的继承是单继承制,一个类只能有一个直接父类这一设计避免了多继承带来的复杂性和菱形继承问题,但为了弥补多继承的功能缺失,引入了接口机JavaJava制,允许一个类实现多个接口继承使用关键字声明,例如,表示类继承自类extends classStudent extendsPerson{...}Student Person子类继承了父类的所有非私有成员变量和方法,但构造方法不被继承子类可以直接使用这些继承的成员,或者通过方法重写提供特定实现关Override super键字用于引用父类成员,特别是在子类重写方法时调用父类版本,或在子类构造方法中调用父类构造方法super.methodName superparameters方法重写是继承的核心机制,允许子类为继承的方法提供特定实现重写方法必须具有相同的方法签名名称、参数列表和兼容的返回类型,访问权限不Override能比父类方法更严格注解虽然非强制,但建议使用,有助于编译器检查重写正确性,提高代码可读性@Override多态与动态绑定多态定义向上转型同一操作作用于不同对象产生不同行为子类对象赋值给父类引用向下转型动态绑定父类引用转换为子类类型运行时确定调用哪个方法多态是面向对象三大特性之一,允许不同类型的对象对同一消息作出不同的响应中的多态主要通过方法重写和动态绑定实现方法的多态性表现为父类引用可以指向子类对象,但只能Java访问父类定义的方法;当调用被子类重写的方法时,实际执行的是子类版本,这一机制称为动态绑定或晚期绑定向上转型是多态的基础,即将子类对象赋值给父类引用这种转换是安全的,自动进行,但父类引用只能访问父类定义的成员,无法直接访问子类特有Upcasting Parentp=new Child成员向下转型则是将父类引用转换为子类类型,但这种转换不一定安全,需要使用运算符进行类型检查Downcasting Child c=Childp instanceof运算符用于测试对象是否为特定类型的实例,返回值常用于向下转型前的类型检查,避免异常instanceof booleanClassCastException if obj instanceof Child{Childc=Childobj;引入了模式匹配,简化了类型检查和转换,提高了代码简洁性和安全性c.childMethod;}Java14for instanceofifobjinstanceofChildc{c.childMethod;}抽象类与接口抽象类接口使用关键字修饰的类,可以包含抽象方法没有实现体的方法和具体方使用关键字定义的引用类型,只包含常量定义和方法签名前abstractinterface Java8法抽象类不能被实例化,只能被继承抽象类用于定义一类对象的共同特性,接口定义对象的行为,强调能做什么的关系一个类可以实现多个接口,实现强调是什么的关系多继承的效果特点特点可以有构造方法,但不能直接实例化所有方法默认为••public abstract可以有抽象方法和具体方法所有变量默认为••public static final可以有成员变量和静态方法不能有构造方法,不能实例化••子类必须实现所有抽象方法,或自己也声明为抽象类引入默认方法和静态方法••Java8default引入私有方法•Java9抽象类通常用于封装子类共同的属性和行为,适合表示是一种关系的类层次结构例如,是一个抽象类,和是其子类,它们共享形状is-a ShapeCircle Rectangle的概念,但有不同的绘制方法,因此可以定义为抽象方法抽象类提供了一种在子类之间共享代码的机制,避免了代码重复draw接口是实现多继承的机制,一个类可以实现多个接口对接口进行了增强,引入了默认方法和静态方法默认方法有实现体,允许接Java Java8default method口添加新方法而不破坏已有实现;静态方法属于接口本身,不能被实现类重写进一步引入了私有方法,用于封装默认方法中的共享逻辑Java9选择抽象类还是接口?如果需要定义对象的本质特性、共享代码,或者需要非公共成员,选择抽象类;如果需要定义对象的行为规范、支持多继承,或设计而非API框架实现,选择接口在实际设计中,抽象类和接口常常结合使用,例如通过抽象类提供接口的公共实现,减少实现类的重复代码内部类与匿名类内部类是定义在另一个类内部的类,支持四种内部类成员内部类、局部内部类、匿名内部类和静态嵌套类成员内部类作为外部类的成员,可以访问Inner ClassJava外部类的所有成员,包括私有成员;内部类对象必须依赖外部类对象而存在,创建语法为OuterClass.InnerClass inner=outerObject.new InnerClass局部内部类定义在方法或代码块内,作用范围仅限于这个方法或块,不能被访问修饰符修饰局部内部类可以访问外部类成员和包含方法的或局部变final effectivelyfinal量匿名内部类是没有名字的局部内部类,同时声明和实例化,常用于创建只需使用一次的类,特别是接口或抽象类的实现方法实现new InterfaceName{}静态嵌套类使用修饰,虽然语法上位于外部类内部,但实际上是独立的类,不依赖外部类实例,不能访问外部类的非静态成员创建静态嵌套Static NestedClass static类对象不需要外部类对象内部类和外部类的互访通过引用OuterClass.StaticNestedClass nestedObject=new OuterClass.StaticNestedClass OuterClass.this和直接成员访问实现包及访问控制包的组织结构包的声明与导入访问控制汇总包是相关类的集合,用于组织和管理大型项目包采使用语句声明类所属的包,必须是源文件的第一条的访问控制分为四个层级任何地方、Java packageJava public用层次化结构,通常使用反向域名命名,如非注释语句使用语句导入其他包中的类,简化类同包及子类、默认包级同包、仅类import protected/private这种命名方式确保包名引用可以导入单个类或整内部类只能使用或包级访问权限,而成员变量和com.company.project.module import java.util.ArrayList;public的唯一性,避免与他人的代码发生冲突合理的包结构有助个包导入静态成员使用关键方法可以使用全部四种访问权限访问控制是实现封importjava.util.*staticJava于提高代码的可维护性和可理解性字装的核心机制,合理设置访问权限可以保护代码的内部实现import staticjava.lang.Math.PI;标准库按功能组织了许多内置包,如核心类,自动导入、集合框架和工具类、输入输出操作、网络编程等了解这些包的组织和主要内容Java java.langjava.utiljava.iojava.net有助于高效使用在自定义包设计中,应遵循高内聚,低耦合原则,将相关功能归入同一包,最小化包间依赖Java API在类的设计中,正确选择访问权限是信息隐藏的关键一般原则是使用最严格的访问控制,同时满足设计需求成员变量通常设为,通过的和方法访问;private publicgetter setter内部实现方法设为;框架类的可扩展方法设为;提供给外部使用的方法设为这种设计实现了封装,确保了类的内部实现可以独立变化而不影响外部代码private protectedpublic常用类库包装类——基本类型包装类父类常量byte ByteNumber MIN_VALUE,MAX_VALUEshort ShortNumber MIN_VALUE,MAX_VALUEint IntegerNumber MIN_VALUE,MAX_VALUElong LongNumber MIN_VALUE,MAX_VALUEfloat FloatNumber MIN_VALUE,MAX_VALUE,NaN,INFINITYdouble DoubleNumber MIN_VALUE,MAX_VALUE,NaN,INFINITYchar CharacterObject MIN_VALUE,MAX_VALUEboolean BooleanObject TRUE,FALSE包装类将基本数据类型包装成对象,使其能够在需要对象的场合使用,如集合类存储、泛型操作等每个基本类型都有对应的包装类,位于包包装类不仅java.lang存储值,还提供了许多有用的方法,如类型转换、比较、常量值等除了和外,其他包装类都继承自类Character BooleanNumber自动装箱是引入的特性,允许基本类型自动转换为对应的包装类自动拆箱则是相反的过程,将包装类自动Autoboxing Java5Integer num=10;Unboxing转换为基本类型这些转换由编译器自动完成,简化了代码但频繁的装箱拆箱可能影响性能,特别是在循环中int value=num;/类提供了各种数值类型转换方法,如、等类提供了字符分类方法,如、、等,以Number intValuedoubleValue CharacterisDigit isLetterisUpperCase及字符转换方法、等包装类还提供了解析字符串的方法,如、,以及值与字符串转换的toUpperCase toLowerCaseInteger.parseInt Double.parseDouble方法和valueOf toString常用类库与——Math Random类常用方法类使用Math Random类位于包中,提供基本数学运算功能所有方法都是静态的,不需要创建对象,类位于包中,用于生成伪随机数与相比,提供更多控制Math java.lang Randomjava.util Math.random直接通过类名调用和生成各种类型随机数的方法绝对值随机整数•absa•nextInt最大值最小值到之间的随机整数•maxa,b/mina,b/•nextIntn0n-1平方根随机长整数•sqrta•nextLong的次幂之间的随机浮点数•powa,b ab•nextFloat/nextDouble0-1四舍五入随机布尔值•rounda•nextBoolean向上向下取整符合高斯分布的随机数•ceila/floora/•nextGaussian三角函数设置随机数种子•sina/cosa/tana•setSeedseed之间的随机数•random0-1类提供的常量包括和自然对数的底方法都是静态的,针对基本数学运算进行了优化例如,计算直角三角形斜边长Math PIπEdouble hypotenuse=Math.sqrtMath.powa,2+或使用专用方法对于复杂计算,类提供了高精度版本,如可用、等方法避免整数运算溢出Math.powb,2;double hypotenuse=Math.hypota,b;Math addExactmultiplyExact类生成的是伪随机数,即看似随机但实际上由算法确定的数字序列创建对象有两种方式无参构造使用系统时间作为种子,产生不同序列;有参构造使用指定种子,相同种Random Random子产生相同序列,适用于需要重复随机结果的测试场景控制随机范围的常用技巧生成到之间的随机整数int randomNum=rand.nextIntmax-min+1+min;min max引入的提供了更高效的线程局部随机数生成器,不需要显式创建对象,直接调用对于加密安全的Java7ThreadLocalRandom intn=ThreadLocalRandom.current.nextInt1,100;随机数如密钥生成,应使用,它提供更强的随机性,虽然性能较低但安全性更高这些不同的随机数生成器适用于不同的应用场景java.security.SecureRandom常用类库日期与时间——API旧Java API java.util类表示特定的时间点Date类日期计算与操作Calendar类日期格式化与解析DateFormat新Java8APIjava.time不包含时间的日期LocalDate不包含日期的时间LocalTime日期和时间LocalDateTime带时区的日期时间ZonedDateTime时间戳Instant日期格式化格式化与解析DateTimeFormatter预定义格式及自定义模式旧的日期时间存在许多设计问题同时包含日期和时间;月份从开始计数;年份从开始计数;线程不安全;缺乏国际Java APIDate01900化支持等类解决了一些问题,但设计仍然不直观,且性能不佳这些类虽然有缺陷,但为了向后兼容仍在保留,在许多旧代Calendar API码中仍可见引入的包基于库设计,采用不可变对象模型,提供了更清晰、更易用的主要类包括处理日Java8java.time Joda-Time APILocalDate期;处理时间;结合两者;添加时区信息;表示时间戳;表示时间段;LocalTime LocalDateTimeZonedDateTime InstantDuration表示日期段新解决了旧的大部分问题,特别适合多线程环境Period APIAPI日期时间格式化在新中使用类,提供了三种格式化方式预定义标准格式如;本地化格式如API DateTimeFormatterISO_LOCAL_DATE;自定义模式如解析字符串为日期时间对象使用方法ofLocalizedDateFormatStyle.FULL ofPatternyyyy-MM-dd parse新的设计使日期时间操作更直观、更安全、更高效LocalDate date=LocalDate.parse2023-05-15,formatter API集合框架概览集合框架层次结构常用集合操作泛型与集合集合框架提供了一组接口和实现类,用于存储和操作对集合框架提供了一套统一的操作方法添加元素;引入的泛型允许在编译时检查类型安全集合使用Java addJava5象组核心接口包括作为根接口;有序集删除元素;检查元素是否存在;泛型指定元素类型Collection Listremove containssize ListStringnames=new合,允许重复元素;不允许重复元素;先进先出获取元素数量;检查是否为空;获取,确保只能存储指定类型对象,避免Set QueueisEmpty iteratorArrayListString结构;键值对映射每个接口有多种实现类,提供不同迭代器工具类提供了排序、搜索、同步等额外类型转换错误泛型支持通配符和上下界限定Map Collections性能特性和行为操作,如、、等,增强了集合操作的灵活性sort binarySearchsynchronizedList extendsT,super T集合框架位于包,旨在统一各种数据结构的操作接口,提高代码复用性和互操作性框架分为和两大分支,前者存储单个元素,后者存储键值对不同实现Java java.util Collection Map类提供不同的性能特性,如支持随机访问,适合频繁插入删除,提供常数时间的基本操作,保持元素有序等ArrayList LinkedListHashSet TreeSet泛型是引入的重要特性,使集合能够在编译时强制类型安全使用泛型后,编译器会阻止向集合中添加错误类型的元素,从集合获取元素时不再需要显式类型转换泛型的通配符Java5机制进一步增强了灵活性,如表示及其子类,表示及其父类理解泛型对正确使用集合框架至关重要extends NumberNumbersuper IntegerInteger与使用List ArrayList接口特性实现常用操作List ArrayList是有序集合,元素按插入顺序排列,允基于动态数组实现,支持快速随增和;删List ArrayListaddE eaddint index,E e许重复元素,可通过索引访问主要实现类机访问,适合频繁查询操作内部数组容量和;removeint indexremoveObject o有动态数组、双自动增长,每次扩容为原容量的倍改;查ArrayListLinkedList
1.5setint index,E egetint向链表和线程安全,但性能较差非线程安全,多线程环境下应使、和VectorArrayList indexindexOfObject o除了继承的方法外,还添加用或;遍历循环、增List CollectionCollections.synchronizedList containsObjecto for了基于索引的操作强循环、迭代器、方法CopyOnWriteArrayList for forEach是最常用的实现,基于数组结构,提供了的随机访问性能,但插入和删除操作可能需要移动元素,复杂度为初始化有多ArrayList ListO1On ArrayList种方式默认构造创建空列表;指定初始容量以减少扩容次数;使用或()从现有元素创建理解的底层实现有Arrays.asList List.of Java9+ArrayList助于在适当场景选择它遍历有多种方式,各有优缺点传统循环使用索引访问,可修改元素,但代码较冗长;增强循环()更简洁,但不能获取索引,也ArrayList forforfor-each不能修改集合结构;迭代器提供更多控制,支持安全移除元素;引入的方法结合表达式最为简洁Java8forEach Lambdalist.forEachitem-,但不能修改集合System.out.printlnitem与数组虽然都基于索引访问,但区别显著容量动态调整,数组长度固定;只能存储对象,数组可存储基本类型;ArrayList ArrayList ArrayListArrayList提供丰富的方法,数组操作有限相互转换方法将集合转为数组;将数组转为固定大小的(实际是数组的包装,不list.toArray Arrays.asListarray List支持);引入提供了更灵活的转换方式add/remove Java8Stream API与使用Set HashSet接口特性实现Set HashSet不允许重复元素,最多包含一个基于实现,无序集合null HashMap2变种4变种TreeSet LinkedHashSet元素自然排序或自定义排序维护插入顺序的3HashSet接口继承自,定义了不允许重复元素的集合提供三种主要的实现使用哈希表实现,提供常数时间的基本操作,但不保证元素顺序;在Set CollectionJava SetHashSet LinkedHashSet基础上维护插入顺序;基于红黑树实现,元素按自然顺序或指定比较器排序,但操作性能为对数时间复杂度HashSet TreeSet基于实现,将添加的元素作为的键,而值使用一个静态正因如此,的性能特性直接继承自添加、删除和包含操作的平均时间复杂度HashSet HashMap HashMap ObjectHashSet HashMap为,但依赖于哈希函数的质量不保证迭代顺序,且可能随时间变化如果需要维护插入顺序,应使用O1HashSet LinkedHashSet判断元素是否重复依赖元素的和方法两个对象如果返回,则必须相同;反之不要求向添加自定义类对象时,必须正确重写这HashSet hashCodeequals equalstrue hashCodeHashSet两个方法,确保相等对象有相同哈希码,否则可能导致意外的重复元素一个好的实现应尽量减少哈希冲突,提高集合性能hashCode与使用Map HashMap接口特性特点遍历方式MapHashMapMap存储键值对基于哈希表实现,键值对无序遍历所有键•key-value pairs••keySet键不能重复,每个键映射到一个值允许空键和空值遍历所有值•••values主要实现、、非线程安全,高效率遍历所有键值对•HashMap LinkedHashMap••entrySetTreeMap负载因子和初始容量影响性能遍历••forEach Java8Lambda基本操作、、、、•put getremove containsKey改进链表转红黑树优化迭代器遍历•Java8•Iterator等size是集合框架中与并列的接口,用于存储键值对不同的实现适用于不同场景提供最快的查找,但不保证顺序;维护插入顺序或访问顺序;Map JavaCollectionMapHashMap LinkedHashMap保持键的自然顺序或自定义排序;为并发环境优化;用于加载配置文件选择合适的实现对应用性能有显著影响TreeMap ConcurrentHashMapProperties Map的内部实现基于哈希表,在前使用数组链表结构,后当链表长度超过阈值默认时转换为红黑树,提高搜索效率的性能受两个因素影响初始容量HashMap Java8+Java88HashMap和负载因子较高的初始容量减少操作但增加空间消耗;默认负载因子在时间和空间效率间取得平衡initialCapacity loadFactorrehash
0.75遍历有多种方式,通常是最高效的引入的HashMap entrySetfor Map.Entry entry:map.entrySet{K key=entry.getKey;V value=entry.getValue;}Java8forEach方法配合表达式提供更简洁的语法只需键或值时,可分别使用或方法遍历Lambda map.forEachk,v-System.out.printlnk+:+v;keySet values集合的排序与比较接口比较器Comparable Comparator是排序接口,实现此接口的类表示其实例可以自然排序实现类是独立的比较器接口,允许在不修改原类的情况下定义排序规则ComparableComparator必须覆盖方法,定义与其他同类对象的比较逻辑实现类必须覆盖方法compareToT ocompareT o1,T o
2、等基本包装类已实现,返回值遵循负数小于、引入表达式简化比较器创建String IntegerComparableJava8Lambda ComparatorPersonbyAge零等于、正数大于规则=p1,p2-p
1.getAge-p
2.getAge;实现的类可直接用于、或排、等方法支持多字段排序Comparable TreeSet TreeMap Collections.sort Comparator.comparing thenComparing序和的主要区别在于提供类的自然排序,是类内部的排序逻辑;提供外部排序逻辑,允许多种排序规则如Comparable Comparator ComparableComparator果需要对一个类实例应用不同排序规则,或者无法修改类源码,应使用;如果类有明确的自然顺序且只需一种排序方式,实现更为简单ComparatorComparable显著增强了接口,添加了多种便利方法方法基于键提取函数创建比较器;Java8Comparator comparingComparator.comparingPerson::getName方法用于多级排序;方法反转排thenComparing Comparator.comparingPerson::getLastName.thenComparingPerson::getFirstName reversed序这些方法结合表达式大大简化了排序代码Comparator.comparingPerson::getAge.reversed Lambda排序集合的方法有排序;使用实现排序接口的集合如、;的方法Collections.sortlist,comparator ListTreeSetTreeMapJava8Stream APIsorted对于需要频繁查找但不频繁修改的数据,使用有序集合可以提高查找效率;对于频繁修改的数据,list.stream.sortedcomparator.collectCollectors.toList可能更适合在需要时临时排序异常处理机制基础Error严重错误,程序通常无法恢复Exception程序异常,可以被捕获和处理RuntimeException3运行时异常,通常由程序错误引起异常体系是一个层次结构,根基是类,下分为和两大分支表示严重的系统级错误,如、,Java ThrowableError ExceptionError OutOfMemoryErrorStackOverflowError程序通常无法恢复;表示可恢复的异常情况,又分为受检异常和非受检异常受检异常必须显式处理或Exception CheckedException UncheckedException try-catch声明,如、;非受检异常及其子类不强制处理,如、throwsIOException SQLException RuntimeExceptionNullPointerException ArrayIndexOutOfBoundsException是异常处理的基本结构块包含可能抛出异常的代码;块捕获并处理特定类型的异常,可以有多个块,按从特殊到一般的顺序排列;try-catch-finally Javatry catchcatch块包含无论是否发生异常都会执行的清理代码,通常用于释放资源引入了语句,自动管理资源关闭finally Java7try-with-resources tryResource res=new,无需显式块,更简洁安全Resource{...}finally声明用于方法签名,指明方法可能抛出的受检异常类型,将异常处理责任转移给调用者语句用于显式抛出异常实例throws throwthrow new在设计异常处理策略时,应考虑在最适合处理异常的位置捕获;只捕获能处理的异常;避免空块;保持异常的原始信息;IllegalArgumentExceptionInvalid inputcatch优先使用特定异常类型而非一般类型自定义异常类创建异常类自定义异常类通常继承受检异常或非受检异常类名应以结尾,清晰表达ExceptionRuntimeExceptionException异常含义至少提供两种构造方法无参构造和带详细错误信息的构造方法,必要时添加带参数的构造方法cause使用异常链异常链是将一个异常作为另一个异常的原因,保留原始异常信息,同时提供更高层次的抽象使用cause initCause方法或带参数的构造方法建立异常链多层异常捕获时,通过异常链保留异常上下文,便于问题诊断cause应用异常处理规范有效的异常处理应遵循一些基本原则只创建有意义的异常类;在适当的抽象层次抛出异常;尽量使用标准异常而非创建新类;为异常提供信息丰富的错误消息;保持受检异常与非受检异常的平衡;记录异常信息,但避免泄露敏感数据设计自定义异常类时,首先要决定继承还是继承创建受检异常,强制调用者处理,ExceptionRuntimeExceptionException适用于可恢复的错误情况,如业务逻辑错误;继承创建非受检异常,调用者不强制处理,适用于编程错误,RuntimeException如参数校验失败自定义异常应保持轻量级,包含必要信息但不添加过多字段异常链机制允许在高层捕获低层异常,包装为更符合当前上下文的异常类型,同时保留原始异常信息例如底层操try{//作数据服务异常这样既提供了适合当前抽象层次}catch SQLException e{throw newServiceException,e;}的异常类型,又保留了根本原因,有助于调试和日志记录引入的多重捕获语法简化了异常处理Java7catchIOException|SQLExceptione{...}高质量的异常处理遵循以下实践确保异常包含足够上下文信息;避免过度使用受检异常,它们增加了代码复杂性;优先使用标准异常如、等;清理资源时优先使用结构;不要IllegalArgumentException IllegalStateExceptiontry-with-resources吞下异常即空块,至少记录异常信息;对于无法恢复的情况,考虑让异常传播,交由全局处理器处理catch输入输出流基础IO流提供了读写各种数据源和目标的统一接口,分为字节流和字符流两大类字节流以位字节为单位处理数据,适合处理二进制数据,基本类是和Java I/O8InputStream;字符流以位字符为单位,适合处理文本数据,基本类是和对于纯文本数据,优先使用字符流;对于二进制数据图像、音频等,OutputStream16Unicode ReaderWriter必须使用字节流提供了丰富的流类,按功能分为基本流、处理流和转换流基本流直接连接到数据源或目标,如、;处理流包装其他流提供额外JavaI/O FileInputStreamFileOutputStream功能,如提高读取效率,读取基本数据类型;转换流在字节流和字符流间转换,如将字节流转为字符流这种BufferedInputStream DataInputStreamInputStreamReader装饰器模式设计使流组合灵活多样缓冲流是提高性能的关键,通过内部缓冲区减少底层系统调用次数、、、是最常用的I/O BufferedInputStreamBufferedOutputStream BufferedReader BufferedWriter缓冲流类特别是提供了方法便于按行读取文本,提供了方法写入平台特定的行分隔符在前,手动关闭流是一BufferedReader readLineBufferedWriter newLineJava7个容易出错的过程,需要在块中确保关闭;引入的语法大大简化了资源管理finally Java7try-with-resources tryInputStream in=new FileInputStreamfile{...}文件操作实战文本文件读取文本文件写入使用逐行读取文本文件,或使用使用写入文本文件,或使用方BufferedReaderBufferedWriter/PrintWriter Files.write方法提供了更简便的法对于简单场景,()提供了一行代码写Files.readAllLines/Files.lines Java7NIO.2Files.writeString Java11+,如()一次读取整个文件内容入文件的能力注意正确设置字符编码,避免乱码问题API Files.readString Java11+二进制文件处理文件目录操作使用读写二进制数据,结合使用类或进行文件和目录操作,包括创建、删FileInputStream/FileOutputStream FileJava7Path/Files API提高性能大文件传输除、移动、复制文件,以及目录遍历和文件筛选等功能提供了BufferedInputStream/BufferedOutputStream NIO.2API可考虑零拷贝技术,如的方法更强大和灵活的文件操作能力FileChannel transferTo读取文本文件的方式多样,根据场景可选择不同的逐行读取大型文件的传统方式是Java APIBufferedReader tryBufferedReader reader=new引入的结合BufferedReadernew FileReaderfile,charset{String line;while line=reader.readLine!=null{...}}Java8Stream API Files.lines方法提供了更现代的方式,支持并行处理和函数式操作Files.linesPaths.getfile.txt,charset.forEachline-...文件遍历和过滤在前通常使用配合,代码繁琐且功能有限的提供了更灵活的遍历机制,但较复杂Java7File.listFiles FileFilterJava7Files.walkFileTree APIJava引入的和方法结合简化了这一过程8Files.walk Files.find StreamAPIFiles.walkPaths.getdir.filterp-,轻松实现递归遍历和条件筛选p.toString.endsWith.java.forEachSystem.out::println文件删除和移动在前使用和,但这些方法在操作失败时只返回值,没有提供失败原因的和Java7File.delete File.renameTo booleanJava7Files.delete在操作失败时抛出具体异常,提供了更好的错误处理能力此外,还支持各种复制选项,如、等,增强Files.move Files.move REPLACE_EXISTING ATOMIC_MOVE了文件操作的可控性和可靠性序列化与反序列化对象Java内存中的对象实例序列化对象转换为字节序列存储传输/保存到文件或网络传输反序列化字节序列还原为对象序列化是将对象状态转换为字节流的过程,反序列化则是将字节流恢复为对象的过程对象序列化的主要用途包括持久Java化存储对象状态,如保存游戏进度;通过网络传输对象,如远程方法调用;深度复制对象,避免复杂引用处理要使类RMI可序列化,必须实现接口,这是一个标记接口,不包含任何方法java.io.Serializable序列化的基本是和序列化对象Java APIObjectOutputStream ObjectInputStreamtry ObjectOutputStreamout=反序列化对象new ObjectOutputStreamnewFileOutputStreamobject.ser{out.writeObjectobject;}tryObjectInputStream in=new ObjectInputStreamnewFileInputStreamobject.ser{Object obj=序列化过程递归包含所有引用对象,除非它们被标记为in.readObject;}transient是序列化版本控制的关键每个可序列化类都有一个默认计算的版本号,如果类定义更改,默认版本号也会serialVersionUID改变,导致与旧版本不兼容为确保兼容性,应显式定义serialVersionUID privatestaticfinallong serialVersionUID类演化时,可以通过维持相同的版本号保持兼容性,但需注意添加、删除或修改字段的影响可以通过自定义=1L;和方法控制序列化过程,处理特殊字段或执行额外验证writeObject readObject多线程编程基础线程的创建方式线程基本操作继承类,重写方法启动线程,调用方法•Thread run•start run实现接口,实现方法等待线程终止•Runnable run•join实现接口,实现方法有返回值线程休眠指定时间•Callable call•sleep使用线程池提交任务提示调度器让出时间•ExecutorService•yield CPU表达式简化创建中断线程•Java8Lambda•interrupt线程生命周期创建但未启动•NEW运行中或就绪•RUNNABLE阻塞于锁•BLOCKED无限期等待•WAITING限时等待•TIMED_WAITING已终止•TERMINATED多线程编程是现代应用程序充分利用多核处理器的关键技术在中,线程是程序中的执行单元,多个线程可以并发执行,共享相同的程序资源Java创建线程的两种基本方式类和接口各有优缺点继承类简单直接,但单继承限制了灵活性;实现接口将Thread RunnableThread JavaRunnable任务与执行机制分离,更符合设计原则,允许任务提交给线程池执行和的关系常被误解实际上,是执行线程的抽象,而定义了线程要执行的任务类自身实现了Thread RunnableThread RunnableThread接口,其方法默认检查是否有关联的任务,有则执行该任务,否则什么都不做理解这一点对正确使用线程至关重要Runnable runRunnable启动线程必须调用方法而非直接调用,否则任务会在当前线程而非新线程中执行start run线程生命周期比大多数操作系统复杂,提供了更细粒度的状态控制一个线程从状态创建,调用进入状态包括就绪Java NEWstart RUNNABLE和运行,然后可能因不同原因进入如等待锁、如调用或如调用状态,最BLOCKED synchronizedWAITING waitTIMED_WAITING sleep终完成任务进入状态线程一旦终止不能重新启动,需要创建新线程继续执行任务TERMINATED线程同步与通信同步机制线程通信死锁问题提供了多种同步机制保证线程安全关键字可用于线程间通信是协调多线程工作的关键类提供的、死锁是多线程编程中常见的严重问题,指两个或多个线程互相等待对方Java synchronizedObject waitnotify方法或代码块,基于监视器锁实现;接口及其实现类如和方法实现了基本的线程等待通知机制,必须在持有的资源,导致永久阻塞死锁发生需满足四个必要条件互斥资源monitor LocknotifyAll/提供更灵活的锁操作,支持条件变量、公平锁和可中上下文中使用;接口提供了类似但更灵活的机只能被一个线程使用、持有并等待、不可剥夺、循环等待避免死锁的ReentrantLock synchronizedCondition断锁;关键字确保变量在线程间可见性,但不保证原子性;原子制,与配合使用;实现了生产者消费者模式,自策略包括固定获取锁的顺序;使用超时锁;使用层次锁;检volatile LockBlockingQueue-tryLock类如提供无锁算法实现的原子操作动处理线程同步;、和测和恢复技术AtomicInteger CountDownLatch CyclicBarrier Semaphore等同步工具类解决了特定场景的线程协调问题关键字是最基本的同步机制,使用简单但功能有限方法锁定整个方法,使用当前对象实例方法或类对象静态方法作为锁;块可以指定锁对象,范围更精确后,synchronized Javasynchronizedsynchronized Java6虚拟机引入了偏向锁、轻量级锁和自旋锁等优化,大大提高了性能,但在高度竞争的情况下仍有限制HotSpot synchronized机制是线程间协作的基础模型调用使线程释放锁并进入等待状态;或唤醒等待的线程,但被唤醒线程必须重新获取锁才能继续执行使用此机制常见错误包括在块wait/notify waitnotify notifyAllsynchronized外调用这些方法;使用而非导致线程永久等待;忽略虚假唤醒问题,应在循环中检查等待条件引入的接口改进了这一机制,提供了更精确的线程唤醒控制notify notifyAllJava5Condition引入的包极大丰富了并发编程工具集提供线程池管理;支持高效的生产者消费者模式;等并发集合提供线程安全访问;原子变量类Java5java.util.concurrent ExecutorServiceBlockingQueue-ConcurrentHashMap支持无锁并发操作;用于等待多个事件完成;用于多线程同步到达某点;控制并发访问数量这些工具大大简化了并发编程,减少了出错可能,提高了性能CountDownLatchCyclicBarrierSemaphore编程基础Java GUI与概述创建窗口应用AWT Swing提供两大工具包和是最早的是应用的主窗口容器创建应用的基本步骤Java GUIAWTAbstract WindowToolkit SwingAWT JFrameSwing GUI库,基于本地系统组件,外观依赖平台;是纯实现的库,提供平台无关的GUI Swing Java GUI创建实例
1.JFrame一致外观,功能更丰富组件名通常以开头,如、,继承自对应SwingJJButton JFrame设置窗口属性标题、大小、关闭操作的组件
2.AWT创建和添加组件
3.虽然现代应用更多使用或技术,但理解基础对学习设计原则和事Java JavaFXWeb SwingGUI设置布局管理器件驱动编程仍有价值
4.添加事件监听器
5.显示窗口
6.setVisibletrue组件层次结构包括顶层容器、、中间容器、Swing JFrameJDialog JPanelJScrollPane和基本组件、等JButton JLabel是独立的顶层窗口,包含标题栏、边框和内容面板窗口常用设置包括设置标题;或设置尺寸;JFrame contentPanesetTitle setSizesetPreferredSize setDefaultCloseOperation设置关闭行为;使窗口居中;控制是否可调整大小所有组件都添加到内容面板,而非直接添加到setLocationRelativeTonull setResizableJFrame或简写frame.getContentPane.addcomponent frame.addcomponent基本组件包括显示文本或图像;按钮;单行文本输入;多行文本输入;复选框;单选按钮;下拉列表;Swing JLabelJButton JTextFieldJTextArea JCheckBoxJRadioButton JComboBox列表选择;表格数据;树形结构等每种组件都有特定的方法设置属性和获取用户输入组件可以通过、、、JList JTableJTree setEnabledsetVisible setForegroundsetBackground等方法控制状态和外观在使用时,所有操作应在事件调度线程中执行,避免线程冲突导致的异常方法可将代码安排在中执行Swing UIEDT UISwingUtilities.invokeLater EDTSwingUtilities.invokeLater应用默认使用系统外观,可通过更改为跨平台外观、系统原生外观或其他第三方外观,增强用户体验-{createAndShowGUI;}Swing UIManager.setLookAndFeel Metal布局管理器GUIBorderLayout FlowLayout GridLayout将容器划分为五个区域北、南将组件按添加顺序从左到右、从上到下排列,类似将容器划分为等大小的网格单元,组件填充每个单元BorderLayout NORTHFlowLayoutGridLayout、东、西和中中央区域文本排版当一行放不下时,组件自动换行可以设置对齐方式格并拉伸至单元格大小创建时指定行数和列数,组件按添加顺SOUTH EASTWEST CENTER自动占用所有剩余空间,其他区域根据组件首选大小调整这是左、中、右和组件间距这是的默认布局,适用于简单序填充网格适用于计算器按钮、游戏棋盘等需要均匀分布组件JPanel的默认布局,适用于经典的应用程序窗口布局,如顶部的组件排列,如按钮组或标签组,但不适合复杂界面,因为它不的场景与不同,中的所有组件大小相JFrame FlowLayoutGridLayout工具栏、底部状态栏、侧边导航和中央内容区支持精确定位同除了基本布局管理器外,还提供了更灵活的选项沿单一轴线排列组件,可以是水平或垂直方向,不会换行,常用于创建工具栏或表单;管理多个组件面板,一次只显示Swing BoxLayoutCardLayout一个,适用于向导或选项卡界面;是最灵活也最复杂的布局管理器,允许组件跨行跨列,有不同的大小和对齐方式GridBagLayout实际应用中,通常需要组合多个布局管理器创建复杂界面例如,主窗口使用,中央区域放置一个使用的面板,底部放置一个使用的按钮面板这种嵌套布局的BorderLayout GridLayoutFlowLayout方法比使用单一复杂布局更容易维护,也符合组件层次结构的设计理念引入了,为构建工具专门设计,支持并行和顺序组布局,能够精确定位组件虽然手动编写代码较为复杂,但它是等生成代码的基础现代Java7GroupLayout GUIGroupLayout NetBeansIDE GUI应用开发通常使用的设计器,自动生成布局代码,大大简化了界面设计过程Swing IDEGUI事件处理与监听机制事件源事件监听器产生事件的组件,如按钮、文本框等实现特定接口的对象,接收并处理事件事件处理事件对象监听器中的方法执行特定逻辑包含事件信息的对象,如事件类型、事件源3事件处理基于委托模型,将事件处理逻辑委托给专门的监听器对象每种组件可以触发特定类型的事件,如触发,触发Java DelegationModel JButtonActionEvent JTextField和等监听器通过组件的方法注册,组件在特定事件发生时通知所有注册的监听器ActionEvent KeyEventaddXXXListener常见的事件监听器接口包括用于按钮点击、菜单选择等操作事件;处理鼠标点击、进入、退出等事件;处理键盘输入事件;处理选ActionListener MouseListenerKeyListener ItemListener择状态变化;处理组件获得和失去焦点事件;处理窗口事件如关闭、最小化等每个接口定义了一组必须实现的方法,对应不同的事件状态FocusListener WindowListener实现事件监听有多种方式创建实现监听器接口的独立类;使用匿名内部类就地定义监听器;实现接口在当前类中处理事件;使用适配器类简化监听器实现,只覆盖感兴趣的方XXXAdapter法;在中使用表达式简化单一方法接口的实现事件分发遵循特定顺序,从容器层次结构的底部最具体的组件向上传播,可能被中间组件捕获和消费Java8Lambda网络编程初步Java通信原理Socket是网络通信的端点,通过包提供建立可靠的双向连接,Socket Javajava.net SocketAPI TCPSocket UDP提供无连接通信通信基于客户端服务器模型,服务器监听特定端口,客户端发起连接请求DatagramSocket Socket-服务器实现TCP服务器使用类绑定端口并监听连接请求方法阻塞等待客户端连接,连接成功返回对象服务ServerSocket acceptSocket器通常使用多线程处理多个客户端,每个连接由独立线程处理,避免阻塞主线程客户端实现TCP客户端使用类指定服务器地址和端口创建连接建立连接后,通过的和Socket SocketgetInputStream方法获取流,进行数据交换使用完毕后必须关闭以释放资源getOutputStream I/O Socket数据交换与协议客户端和服务器通过输入输出流交换数据,可以传输文本、二进制数据或对象通过序列化应定义清晰的应用层协议,规定消息格式、命令类型和交互流程,确保双方正确理解通信内容基于的网络通信遵循固定模式服务器创建监听端口;客户端创建连接服务器;双方获取输入输出流交换数Java TCPServerSocket Socket据;通信完成后关闭连接保证数据可靠传输,适合需要数据完整性的应用,如文件传输、网页浏览等基于的简单应用包括TCP TCP客户端、邮件客户端、即时通讯等HTTP基于的通信使用和类无需建立连接,适合对实时性要求高但允许少量数据丢失的应用,UDP DatagramSocketDatagramPacket UDP如视频流、游戏状态更新等与不同,通信需要显式指定每个数据包的目标地址和端口,不保证数据到达顺序,也不自动重传丢失TCP UDP的数据包通常用于广播、多播场景,或网络条件较好的局域网环境UDP实现聊天室等多客户端应用时,关键是服务器端的并发处理常用模式是主线程接受连接请求,为每个新客户端创建工作线程;每个工作线程负责与特定客户端通信;共享数据结构如客户端列表存储所有连接;消息广播机制将一个客户端的消息转发给其他客户端使用线程池可以限制并发线程数量,避免资源耗尽更复杂的应用可能需要非阻塞和选择器机制,以单线程处理多连接I/ONIO Selector注解与反射机制注解反射动态类加载Annotation API注解是引入的元数据形式,为代码提供额外信息,但不直接影响反射是运行时自省机制,允许程序检查和操作自身结构支持运行时动态加载类,主要通过类实现可以使用Java5Java Java ClassLoader程序逻辑注解可用于类、方法、字段、参数等几乎所有程序元素包提供核心,包括类、类、类、或自定义类加载器加载外部类文件,实现插件系统、java.lang.reflect APIClass MethodField Class.forName内置了、等标准注解,并支持自定义注类等通过反射可以获取类的完整结构信息,访问和修改热部署等功能动态加载与反射结合,允许程序根据配置或运行时条件Java@Override@Deprecated Constructor解,通过关键字定义,可指定元素类型、默认值和保留策略私有成员,调用方法,创建对象实例,甚至在运行时生成和修改类定义创建和使用不同的组件实现,提高系统灵活性@interface源码、类文件或运行时注解在现代开发中扮演重要角色,广泛应用于框架配置、依赖注入、单元测试等领域自定义注解需要明确三个要素保留策略定义注解在何时可见;目标类型指定注解可应用的程序元素;Java@Retention@Target文档说明决定是否包含在中注解处理分为编译时处理通过注解处理器和运行时处理通过反射两种方式,前者用于代码生成,后者用于行为注入@Documented JavaDoc反射是实现动态行为的基础,但使用时需注意性能和安全性反射操作通常比直接代码调用慢,因为需要进行类型检查和间接访问常见反射操作包括获取对象或语法;检查类的字段JavaClassClass.forName.class;检查类的方法;创建实例或;调用方法;访问字段反射可以访问私有成员,但需要getFields/getDeclaredFields getMethods/getDeclaredMethods newInstanceConstructor.newInstance invokeget/set先调用破除访问限制setAccessibletrue注解与反射结合使用是许多框架的核心机制典型应用包括的依赖注入,通过等注解标记依赖关系;的测试识别,通过注解标记测试方法;的对象关系映射,通过、Java Spring@Autowired JUnit@Test JPA@Entity等注解定义数据库映射这种方式实现了约定优于配置的理念,简化了应用开发理解这一机制对深入学习企业级框架至关重要@ColumnJava常见项目案例实现控制台应用开发学生成绩管理系统控制台学生信息管理系统是初学者常见的练习项扩展的学生成绩管理系统可以包含学生基本信息管理、Java目,涵盖了基本的输入输出操作、数据存储与检索、课程管理、成绩录入与统计分析等功能系统设计应业务逻辑实现等方面系统通常包括学生信息的添加、遵循分层架构,将数据访问、业务逻辑和用户界面分查询、修改和删除等功能,通过命令行界面与用户交离,提高代码的可维护性和可扩展性数据持久化可互,数据可以存储在内存中或保存到文件采用文件存储或数据库存储系统设计思路项目设计应遵循面向对象思想,合理进行类的抽象与设计采用模型视图控制器架构可以有效分离关注点,MVC--提高代码质量功能实现应考虑异常处理、数据验证和用户体验,设计直观的交互流程和清晰的提示信息控制台小型管理系统是学习基础的理想项目,它涵盖了核心语言特性的应用实现这类系统通常从定义数据模型开始,如Java类包含学号、姓名、年龄等属性;创建集合存储对象,如;实现业务逻辑类处理增删改查操作;最后设计Student ArrayList用户界面类,负责显示菜单、接收用户输入和调用相应功能这种结构让初学者能清晰了解程序各部分的职责和交互方式学生成绩管理系统作为较复杂的项目,可以引入更多高级特性数据模型设计可能包括学生、课程、成绩等多个类,它们之间存在一对多、多对多等关系;持久化层可以使用文件或连接数据库;业务逻辑层实现成绩统计、排名计算等功能;I/O JDBC界面层可以是命令行、图形界面或界面这类项目适合综合应用所学知识,培养系统设计能力Swing Web在设计中应注意以下几点遵循低耦合高内聚原则,使各组件职责明确;利用接口和抽象类增强可扩展性,如定义通用的接口;实现良好的异常处理机制,确保系统稳定性;考虑性能优化,如合理使用缓存减少操作;添加日志记录功能,DAO IO便于问题排查;设计友好的用户体验,包括清晰的操作提示和错误反馈通过这些实践,将理论知识转化为实际应用能力考试与面试常见题型解析课程总结与发展方向高级开发与架构系统设计能力与专业领域深耕框架与高级特性企业级开发工具与技术栈项目实践与应用综合技能应用与团队协作基础知识Java语言核心与编程思想本课程系统介绍了编程的核心知识,从基本语法到面向对象编程,从集合框架到多线程并发,为后续深入学习奠定了坚实基础真正掌握需要不断实践,建议通过小型项目巩固所学知JavaJava识,如实现命令行工具、简单游戏或应用遇到问题时查阅官方文档或参考书籍,逐步培养独立解决问题的能力Web技术生态庞大,后续学习可沿多个方向拓展开发方向学习框架、、等;大数据方向学习、、等;方向深入移动应用开Java WebSpring SpringBootSpringCloud HadoopSpark FlinkAndroid发;云原生方向了解微服务、容器化和实践无论选择哪个方向,都应保持对基础知识的重视,同时跟进语言自身的演进,如的表达式、的模块系统等新DevOps JavaJava8Lambda Java9特性技术发展日新月异,建议养成持续学习的习惯,关注技术社区动态,参与开源项目,与同行交流分享软技能同样重要,包括沟通表达、团队协作、项目管理等最终,优秀的开发者不仅Java精通技术细节,更具备解决实际问题的综合能力和持续创新的学习态度期待各位在编程之路上不断进步,从初学者成长为专业工程师Java。
个人认证
优秀文档
获得点赞 0