还剩28页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
教学讲解课件Java语言简介JavaJava是一种广泛使用的计算机编程语言,由James Gosling及其团队于1991年在SunMicrosystems(现已被Oracle收购)开发Java设计之初就秉承了一次编写,到处运行(Write Once,Run Anywhere,简称WORA)的理念,这使得Java程序能够在任何支持Java的平台上运行,而无需重新编译Java语言的主要特点包括•平台无关性Java代码编译成字节码后,可以在任何装有Java虚拟机(JVM)的设备上运行•面向对象完全支持面向对象编程范式,包括封装、继承和多态•简单易学语法与C/C++类似,但去除了指针等复杂特性•安全性高内置垃圾回收机制,避免内存泄漏•多线程支持内置线程支持,便于开发高并发应用Java创始人James Gosling与Java吉祥物Duke应用领域Java•企业级应用开发•移动应用开发(Android)•Web应用服务器•嵌入式系统•大数据处理平台发展历程Java孕育期11991-1995James Gosling团队开始开发Oak语言(Java前身),1995年正式发布Java
1.0版本,引入了applet技术,使网页具有交互能力2快速发展期1996-2000Java
1.1版本发布,引入JDBC、JavaBeans等重要特性1998年发布Java2(JDK
1.2),将平台分为J2SE、J2EE和J2ME三个版本,覆盖成熟期32001-2006不同应用场景发布多个重要版本,包括Java
5.0(引入泛型、注解、枚举等)2006年,Sun公司宣布将Java开源,采用GPL协议,极大促进了Java4接管期的发展2007-2014Oracle2010年Oracle收购Sun公司,接管Java平台发布Java7和Java8,后者引入Lambda表达式、Stream API等函数式编程特性,成为里程碑至今现代时代52015-Java版本Oracle改变发布策略,每六个月发布一个新版本Java9引入模块系统,Java11和Java17成为长期支持(LTS)版本现在主流使用的是Java17及以上版本平台组成JavaJDK JavaDevelopment KitJRE JavaRuntime EnvironmentJava开发工具包,包含了开发Java应用程序所需的所Java运行环境,是运行已编译Java程序所需的一切有工具•Java虚拟机(JVM)执行Java字节码的虚拟计•javac Java编译器,将.java源文件编译算机为.class字节码文件•Java类库包含运行Java程序所需的预定义类和•java Java解释器,用于运行编译后的Java程序方法•javadoc文档生成工具,从源代码中提取注释生•部分核心组件如Java运行时插件和Java Web成API文档Start•jdb Java调试器,用于查找和修复Java程序中JRE是JDK的子集,不包含开发工具,仅供运行Java程的错误序使用•jar归档工具,用于打包Java应用程序JVM JavaVirtual MachineJava虚拟机,是Java平台的核心,负责执行Java字节码•类加载器加载编译后的.class文件到内存•字节码验证器确保代码不会危害系统安全•即时编译器将字节码转换为本地机器代码以提高性能•垃圾回收器自动管理内存,释放不再使用的对象JVM是实现Java平台独立性的关键,不同操作系统上的JVM实现使同一个字节码能在不同平台上运行程序结构示例Java程序结构要素解析Java//HelloWorld.javapublic classHelloWorld{//main方法是程序的入口点public staticvoid mainString[]args{//输出Hello,World!到控类定义以public class开头,定义一个公共类制台System.out.printlnHello,World!;//声明并初main方法程序执行的入口点,必须具有特定的签名始化变量String message=欢迎学习Java!;int version=17;System.out.println标准输出语句,用于向控制台输出文本//使用变量进行输出System.out.printlnmessage;System.out.println当前Java版本:+version;}}语句结束每个语句必须以分号;结束注释用//表示单行注释,/**/表示多行注释程序执行流程Java
1.编写源代码.java文件
2.使用javac编译源代码生成字节码.class文件
3.使用java命令运行字节码
4.JVM加载、验证并执行字节码上面的代码展示了一个最基本的Java程序结构每个Java程序都必须有一个类,而且文件名必须与公共类名称完全相同(包括大小写)基本语法规则区分大小写语句结束Java是严格区分大小写的语言关键字、变量名、方法名和类名都必须按照确切的大小写使用每个语句必须以分号;结束,这告诉编译器一个语句的结束例如int number;和int Number;是两个不同的变量例如int a=10;System.out.printlna;注释类型标识符命名规范Java支持三种注释类型Java标识符命名规则•单行注释//这是单行注释•必须以字母、下划线_或美元符号$开头•多行注释/*这是多行注释*/•后面可以是字母、数字、下划线或美元符号•文档注释/**这是文档注释,可被javadoc提取*/•不能使用Java关键字•不限长度命名约定•类名首字母大写的驼峰命名法如PascalCase•方法名和变量名首字母小写的驼峰命名法如camelCase•常量名全部大写,用下划线分隔如MAX_VALUE•包名全部小写如java.util数据类型分类基本数据类型引用数据类型类(Class)用户定义的类型,如String,ArrayList等类型大小范围默认值接口(Interface)定义方法签名但不实现的抽象类型byte8位-128至1270数组(Array)同类型数据的集合,如int[],String[]引用数据类型存储对象的引用(内存地址),对象本身存储在堆内存中short16位-32,768至32,7670类型转换示例int32位-2^31至2^31-10long64位-2^63至2^63-10Lfloat32位IEEE754标准
0.0fdouble64位IEEE754标准
0.0dchar16位0至65,535\u0000boolean1位true或false false基本数据类型直接存储数值,存放在栈内存中,操作效率高变量与常量123变量声明与初始化常量定义变量作用域变量是用于存储数据的内存位置,必须先声明后使用常量是在程序执行过程中值不会改变的变量,使用final关键字变量的作用域决定了它在程序中的可见性和生命周期定义//变量声明int age;String name;//变量初始化age//实例变量(成员变量)public classPerson=25;name=张三;//声明并初始化double salary//常量定义final doublePI=
3.14159;final int{private String name;//实例变量=
5000.50;boolean isEmployed=true;//多个变量MAX_USERS=100;//尝试修改常量会导致编译错误//private staticint count;//类变量(静态变量)同时声明int x,y,z;int a=1,b=2,c=3;PI=
3.14;//错误!//类常量(静态常量)public public void setNameStringn{name=n;static finalString COMPANY_NAME=ABC公司;////访问实例变量int len=n.length;//符号常量的好处final intSECONDS_PER_DAY=24*局部变量forint i=0;ilen;60*60;//提高代码可读性和可维护性i++{//i是循环变量//i只在for循环内可见char c=n.charAti;//c是块级变量,只在这个块内可见}//这里不能访问i和c}}运算符详解算术运算符位运算符+加法a+b按位与ab-减法a-b|按位或a|b*乘法a*b^按位异或a^b/除法a/b~按位取反~a%取模a%b左移a2++自增a++或++a右移a2--自减a--或--a无符号右移a2关系运算符赋值运算符==等于a==b=简单赋值c=a+b!=不等于a!=b+=加等于a+=b等同于a=a+b大于ab-=减等于a-=b等同于a=a-b小于ab*=乘等于a*=b等同于a=a*b=大于等于a=b/=除等于a/=b等同于a=a/b=小于等于a=b%=模等于a%=b等同于a=a%b逻辑运算符三元运算符逻辑与ab//格式条件表达式1:表达式2int max=aba:b;//如果ab,返回a,否则返回b||逻辑或a||b!逻辑非!a运算符优先级从高到低排序(部分)
1.括号
2.一元运算符++,--,!
3.乘法、除法、取模*,/,%
4.加法、减法+,-
5.关系运算符,=,,=
6.相等运算符==,!=
7.逻辑与流程控制语句条件语句循环语句跳转语句//if语句if condition{//条件为真时执行}//if-else语句if condition//for循环for initialization;condition;update{//循环体}//例如for//break语句//用于提前结束循环或switch语句for int i=0;i10;i++{if i{//条件为真时执行}else{//条件为假时执行}//if-else if-else语句if inti=0;i10;i++{System.out.printlni;}//增强for循环for-eachfor==5{break;//当i等于5时,跳出循环}System.out.printlni;}//condition1{//条件1为真时执行}else ifcondition2{//条件1为假且条件ElementType element:collection{//循环体}//例如for String name:continue语句//用于跳过当前循环迭代的剩余部分for inti=0;i10;i++{if2为真时执行}else{//所有条件都为假时执行}//switch语句switch expressionnames{System.out.printlnname;}//while循环while condition{//循环i%2==0{continue;//当i是偶数时,跳过此次迭代}{case value1://当expression等于value1时执行break;case体}//例如inti=0;while i10{System.out.printlni;i++;}//do-System.out.printlni;//只打印奇数}//带标签的break和continueouter:for intivalue2://当expression等于value2时执行break;default:while循环do{//循环体}while condition;//例如int j=0;do=0;i3;i++{for intj=0;j3;j++{if i*j==4//当expression不匹配任何case时执行}{System.out.printlnj;j++;}while j10;{break outer;//跳出外层循环}System.out.printlni+,+j;}}//return语句//用于从方法返回,可选择性地返回一个值public intsumint a,int b{return a+b;//返回a和b的和}方法与参数方法定义参数传递机制Java中所有参数传递都是值传递(pass-by-value)//方法定义语法访问修饰符返回类型方法名参数列表{//方法体return返回值;//如果返回类型不是void}//无参无返回值方法public voidsayHello{System.out.println你好!;}//有参有返回值方法public intaddint a,int b{return a+b;}//•对于基本数据类型,传递的是值的副本可变参数方法public int sumint...numbers{int total=0;for intnum:numbers{total+=num;}return•对于引用数据类型,传递的是引用的副本(不是对象本身)total;}//调用sum1,2,3,4,5;//基本类型参数传递示例public voidtestPrimitiveint x{x=100;//改变的只是参数x的值,不影响调用处}inta=10;testPrimitivea;//a仍然是10//引用类型参数传递示例public voidtestReferenceint[]arr{arr
[0]=100;//修改的是数组对象本身,会影响调用处arr=new int
[3];//但重新赋值不影响调用处}int[]nums={1,2,3};testReferencenums;//nums
[0]变为100,但nums仍指向原数组方法重载方法重载允许在同一个类中定义多个同名但参数列表不同的方法方法是Java中组织和重用代码的基本单位一个设计良好的方法应该只完成一个特定的任务,并且具有明确的输入(参数)和输出(返回值)面向对象编程概念封装封装是隐藏对象内部实现细节,只暴露必要的接口,通过访问修饰符和getter/setter方法实现类与对象基础public classPerson{//私有属性,实现封装private Stringname;private类是创建对象的蓝图或模板,定义了对象的属性(状态)和方法(行为)int age;//公共getter和setter方法public StringgetName{return name;}public voidsetNameString name//类的定义public classStudent{//属性(成员变量)private Stringname;{this.name=name;}public intgetAge{returnprivate int age;//构造方法public StudentStringname,int ageage;}public voidsetAgeint age{if age0age120{this.name=name;this.age=age;}//方法public{//添加验证逻辑this.age=age;}else{throwvoid study{System.out.printlnname+正在学习;}}//创建对象new IllegalArgumentException年龄无效;}}}Student student1=new Student小明,18;student
1.study;//调用方法多态继承多态允许使用父类类型引用子类对象,实现一个接口,多种实现继承允许一个类(子类)继承另一个类(父类)的属性和方法,实现代码重用和层次关系//多态示例Animal animal1=new Dog旺财,金毛;animal
1.eat;//调用的是//父类public classAnimal{protected Stringname;publicDog类继承自Animal的eat方法//但不能直接调用Dog类特有的方法//animal
1.bark;//错AnimalString name{this.name=name;}public voideat误!//需要类型转换后才能调用if animal1instanceof Dog{Dog dog=Dog{System.out.printlnname+正在吃东西;}}//子类public classDoganimal1;dog.bark;//现在可以调用了}//方法重写实现多态public classCatextends Animal{private String breed;public DogStringname,Stringextends Animal{public CatStringname{supername;}breed{supername;//调用父类构造方法this.breed=breed;}@Override//重写父类方法public voideat{System.out.printlnnamepublic voidbark{System.out.printlnname+正在汪汪叫;}}+小口小口地吃东西;}}Animal animal2=new Cat咪咪;animal
2.eat;//调用的是Cat类重写的eat方法类的详细结构成员变量成员方法访问修饰符成员变量(也称为字段或属性)是在类中定义的变量,用于存储对象的状态成员方法定义了类的行为,可以访问和操作对象的成员变量访问修饰符控制类、变量、方法和构造方法的访问权限public classEmployee{//实例变量(每个对象独有)private public class BankAccount{private String accountNumber;修饰符同一类同一包子类其他包Stringname;private double salary;//静态变量(所有对象共private doublebalance;//实例方法public void享)private staticint count=0;//常量public depositdoubleamount{if amount0{balance public✓✓✓✓static finaldouble MIN_WAGE=
2000.0;//构造方法public+=amount;System.out.println存款成功,当前余额+protected✓✓✓✗EmployeeString name,doublesalary{this.name=name;balance;}}public voidwithdrawdouble amountthis.salary=salary;count++;//每创建一个对象,计数器加{if amount0amount=balance{balance-default✓✓✗✗1}//静态方法,获取已创建的员工数量public staticint=amount;System.out.println取款成功,当前余额+getCount{return count;}}balance;}else{System.out.println余额不足private✓✗✗✗;}}//静态方法public staticdoublecalculateInterestdouble principal,double rate{return一般原则尽可能使用最严格的访问级别,实现良好的封装principal*rate;}}实例变量属于对象,每个对象有独立的副本;静态变量属于类,被所有对象共享实例方法可以访问所有成员变量和方法;静态方法只能访问静态成员,不能使用this关键字继承与重写继承的实现方法重写规则//父类public classVehicle{protected Stringbrand;protected int year;public VehicleStringbrand,int year//在Car类中重写Vehicle类的方法@Override//注解表明这是一个重写方法public voidstart{System.out.printlnbrand+汽车启动{this.brand=brand;this.year=year;}public voidstart{System.out.println车辆启动引擎;}@Overridepublic StringgetInfo{//调用父类方法并添加额外信息return super.getInfo+,车门数+doors;};}public void stop{System.out.println车辆停止;}public StringgetInfo{return品牌+brand+,年份+year;}}//子类public classCar extendsVehicle{private int doors;publicCarString brand,intyear,intdoors{superbrand,year;//调用父类构造方法this.doors=doors;}//子类特有的方法public voidhonk{System.out.println汽车鸣笛;}}方法重写(Override)必须遵循以下规则
1.方法名、参数列表和返回类型必须与父类方法相同(返回类型可以是父类方法返回类型的子类)
2.访问修饰符不能比父类方法更严格(可以更宽松)
3.不能抛出比父类方法更多或更广泛的异常
4.静态方法不能被重写(可以被隐藏,但不是多态)
5.final方法不能被重写
6.构造方法不能被重写关键字用法superJava中使用extends关键字实现继承子类继承父类的所有非私有成员(变量和方法),可以添加自己特有的成员,也可以重写父类的方法多态机制引用类型多态1向上转型与向下转型2方法重写多态3接口多态4基于类层次结构的抽象设计5多态概念详解多态是面向对象编程的三大特性之一,允许不同类型的对象对同一消息做出不同的响应Java的多态主要通过继承和接口实现,具体表现在多态的实现机制Java通过动态绑定机制实现多态,在运行时确定调用哪个方法//父类引用指向子类对象(向上转型)Animal animal=new Cat;//自动类型转换animal.makeSound;//调用的是Cat类重写的makeSound方法//方法参数多态public voidfeedAnimalAnimal animal{animal.eat;//根据实际对象类型调用相应的eat方法}//可以传入任何编译时绑定静态方法、私有方法、final方法和构造方法在编译时就确定了调用哪个方法Animal的子类feedAnimalnew Dog;feedAnimalnew Cat;//向下转型(需要显式类型转换)if animalinstanceof Dog{Dog dog=运行时绑定虚方法(非static、非final、非private的方法)在运行时根据对象的实际类型动态确定Dog animal;//显式类型转换dog.fetch;//调用Dog特有的方法}多态的优势•提高代码的灵活性和可扩展性•实现解耦,降低代码耦合度•支持开闭原则对扩展开放,对修改关闭•简化代码,消除类型判断的条件语句接口与抽象类接口抽象类接口多继承Interface AbstractClass//接口定义public interfaceMovable{//常量(隐式public staticfinal)//抽象类定义public abstractclass Shape{//成员变量protected String//多个接口继承public interfaceFlyable{void fly;}public interfacedoubleMAX_SPEED=
100.0;//抽象方法(隐式public abstract)void color;//构造方法public ShapeStringcolor{this.color=Swimmable{void swim;}//接口可以继承多个接口public interfaceSuperPoweredmovedouble distance;//默认方法(Java8引入)default voidstop color;}//抽象方法(没有实现体)public abstractdouble getArea;extends Flyable,Swimmable{void useSuperPower;}//类可以实现多个接口public{System.out.println停止移动;}//静态方法(Java8引入)//具体方法public StringgetColor{return color;}class SuperHeroimplements Flyable,Swimmable{@Override public voidstatic doubleconvertToMPHdouble kmh{return kmh*
0.621371;}public voidsetColorString color{this.color=color;}//fly{System.out.println超人在飞行;}@Override public//私有方法(Java9引入,供默认方法使用)private voidlogString message静态方法public staticShape createDefaultShape{return newvoid swim{System.out.println超人在游泳;}}{System.out.println日志+message;}}//接口实现public classRectangle黑色,1,1;}}//抽象类的子类public classCircle extendsShapeCar implementsMovable{@Override public void movedoubledistance{private double radius;public CircleStringcolor,doubleradius{System.out.println汽车行驶了+distance+公里;}//可{supercolor;this.radius=radius;}//实现抽象方法以选择性地重写默认方法@Override public voidstop@Override public double getArea{return Math.PI*radius*{System.out.println汽车刹车停止;}}radius;}}接口多继承的优势•克服了Java单继承的限制•实现了代码的多重复用•支持组合优于继承的设计原则•提供更灵活的类型系统异常处理机制结构自定义异常类try-catch-finally//基本异常处理结构try{//可能抛出异常的代码int result=10/0;//会抛出ArithmeticException System.out.println此//自定义检查型异常public classInsufficientFundsException extendsException{private doubleamount;public行不会执行;}catch ArithmeticExceptione{//处理特定类型的异常System.out.println发生算术异常+e.getMessage;}InsufficientFundsExceptiondouble amount{super余额不足,差额+amount;this.amount=amount;}catch Exceptione{//处理其他类型的异常System.out.println发生异常+e.getMessage;}finally{//无论是否发生publicdoublegetAmount{return amount;}}//自定义运行时异常public classInvalidUserInputException extends异常,都会执行的代码System.out.printlnfinally块总是执行;}//Java7引入的try-with-resourcestryFileInputStream inputRuntimeException{public InvalidUserInputExceptionString message{supermessage;}}//使用自定义异常public=new FileInputStreamfile.txt;BufferedReader reader=new BufferedReadernewInputStreamReaderinput{//使用资class BankAccount{private doublebalance;public voidwithdrawdouble amountthrows源String line=reader.readLine;System.out.printlnline;}catch IOException e{//处理异常InsufficientFundsException{if amountbalance{throw newInsufficientFundsExceptionamount-e.printStackTrace;}//资源会自动关闭,无需finally块//多重捕获(Java7引入)try{//可能抛出多种异常的代码}catch balance;}balance-=amount;}}IOException|SQLException e{//同时处理多种异常e.printStackTrace;}关键字throws//声明方法可能抛出的异常public voidreadFileString paththrows IOException{FileReader reader=new FileReaderpath;//读取文件...reader.close;}//调用可能抛出异常的方法public voidprocessFile{try{readFiledata.txt;}catch IOExceptione{System.out.println文件处理错误+e.getMessage;}}常用介绍Java API包集合框架文件操作java.lang java.util java.io提供Java语言的核心类,无需导入即可使用提供数据结构和算法的实现提供输入输出流操作Object所有类的基类,提供equals,hashCode,toString等方法Collection接口集合的根接口File文件和目录操作List接口有序集合,可包含重复元素字节流处理二进制数据String不可变字符串,提供丰富的字符串处理方法•ArrayList基于动态数组,随机访问快•InputStream/OutputStream抽象基类StringBuffer/StringBuilder可变字符串,用于高效字符串操作•LinkedList基于链表,插入删除快•FileInputStream/FileOutputStream文件读写Math数学运算工具类,提供各种数学函数•Vector线程安全的动态数组(较少使用)•BufferedInputStream/BufferedOutputStream缓冲流System系统相关功能,如标准输入输出、系统属性Set接口不允许重复元素的集合•DataInputStream/DataOutputStream基本类型读写Class反射API的入口,提供类信息访问•HashSet基于哈希表,无序字符流处理文本数据Thread线程类,用于多线程编程•LinkedHashSet保持插入顺序•Reader/Writer抽象基类包装类Integer,Double,Boolean等,将基本类型包装为对象•TreeSet有序集合,基于红黑树•FileReader/FileWriter文件读写Map接口键值对映射•BufferedReader/BufferedWriter缓冲流•HashMap高效的哈希表实现•PrintWriter格式化输出•LinkedHashMap保持插入顺序对象序列化ObjectInputStream/ObjectOutputStream•TreeMap基于红黑树,按键排序•Hashtable线程安全(较少使用)工具类Collections,Arrays提供算法和操作字符串处理类特性与String StringBuilderStringBuffer//字符串创建String s1=Hello;//字符串字面量,存储在字符串常量池中String s2=Hello;//重用常量池中的对象String s3=new//StringBuilder非线程安全,但性能更高StringBuilder sb=new StringBuilder;sb.appendHello;sb.appendStringHello;//强制创建新对象//字符串不可变性String str=Hello;str=str+World;//创建新字符串对象,原字符串不变//.appendWorld;sb.insert5,,;//在指定位置插入sb.delete5,6;//删除指定范围的字符sb.replace0,5,Hi;//替换指字符串比较Stringa=Java;Stringb=java;boolean isEqual=a.equalsb;//false,区分大小写boolean isEqualIgnoreCase=定范围的字符sb.reverse;//反转字符串String result=sb.toString;//转换为String//StringBuffer线程安全,适用于多线程环境a.equalsIgnoreCaseb;//true,不区分大小写boolean isSameRef=a==b;//false,比较引用而非内容//常用方法String text=StringBuffer buffer=new StringBuffer;buffer.append多线程;buffer.append安全;//其他方法与StringBuilder相同//性能比较Hello,Java World!;int length=text.length;//18char firstChar=text.charAt0;//HString sub=text.substring7,String s=;for inti=0;i10000;i++{s+=i;//非常低效,每次都创建新对象}StringBuilder builder=new11;//JavaString lower=text.toLowerCase;//hello,java world!String upper=text.toUpperCase;//HELLO,JAVA StringBuilder;for inti=0;i10000;i++{builder.appendi;//高效,复用同一对象}String result=WORLD!boolean contains=text.containsJava;//trueString replaced=text.replaceJava,Python;//Hello,Python builder.toString;World!String[]parts=text.split,;//[Hello,Java World!]String trimmed=abc.trim;//abcString vsStringBuilder vsStringBuffer特性String StringBuilderStringBuffer可变性不可变可变可变线程安全是否是性能连接操作低效高效较高效(有同步开销)适用场景不频繁修改单线程频繁修改多线程频繁修改数组与集合数组基础与基本用法ArrayList LinkedListHashMap//一维数组声明与初始化int[]numbers=new int
[5];//创建长度为5的整数数组int[]//ArrayList基于动态数组实现ArrayList list=newscores={95,85,75,65,55};//创建并初始化数组//数组访问与修改numbers
[0]ArrayList;list.addApple;//添加元素=10;//设置第一个元素值int first=numbers
[0];//获取第一个元素值int list.addBanana;list.addCherry;list.add1,Blueberry;//在指定位length=numbers.length;//获取数组长度//二维数组int[][]matrix=new置插入String item=list.get0;//获取元素Applelist.set0,Apricot;int
[3]
[4];//3行4列的二维数组int[][]jaggedArray=new int
[3][];//行数固//修改元素list.remove2;//删除指定位置的元素boolean contains=定,列数可变的交错数组jaggedArray
[0]=new int
[4];jaggedArray
[1]=new list.containsBanana;//检查是否包含int size=list.size;//获取大小int
[2];jaggedArray
[2]=new int
[5];//初始化二维数组int[][]grid={{1,2,list.clear;//清空列表//LinkedList基于双向链表实现LinkedList linkedList3},{4,5,6},{7,8,9}};//数组工具类int[]data={3,1,4,1,5,=new9};Arrays.sortdata;//排序[1,1,3,4,5,9]int index=LinkedList;linkedList.addFirst;linkedList.addSecond;linkedList.adArrays.binarySearchdata,4;//二分查找返回3int[]copy=dFirstZero;//在头部添加linkedList.addLastThird;//在尾部添加Arrays.copyOfdata,data.length;//复制数组boolean isEqual=String first=linkedList.getFirst;//获取首元素String last=Arrays.equalsdata,copy;//比较数组内容Arrays.filldata,0;//填充数组linkedList.getLast;//获取尾元素linkedList.removeFirst;//删除首元素[0,0,0,0,0,0]linkedList.removeLast;//删除尾元素//ArrayList vsLinkedList性能对比//ArrayList:随机访问快,插入删除慢//LinkedList:随机访问慢,插入删除快(特别是首尾操作)输入输出基础控制台输入输出文件读写//标准输出System.out.printlnHello,World!;//输出并换行System.out.printNo newline;//输出不换行//文件读取(字符流)import java.io.FileReader;import java.io.BufferedReader;tryFileReader fr=newSystem.out.printfNumber:%d,String:%s,42,test;//格式化输出//使用Scanner读取控制台输入import FileReaderinput.txt;BufferedReader br=new BufferedReaderfr{String line;while line=br.readLine!=java.util.Scanner;Scanner scanner=new ScannerSystem.in;System.out.print请输入您的姓名;Stringname=scanner.nextLine;null{System.out.printlnline;}}catch IOExceptione{e.printStackTrace;}//文件写入(字符流)import//读取一行文本System.out.print请输入您的年龄;intage=scanner.nextInt;//读取整数scanner.nextLine;//消费换行符java.io.FileWriter;import java.io.BufferedWriter;tryFileWriter fw=new FileWriteroutput.txt;BufferedWriter bw=System.out.print请输入您的收入;double income=scanner.nextDouble;//读取浮点数System.out.println姓名+new BufferedWriterfw{bw.write这是第一行;bw.newLine;//写入换行符bw.write这是第二行;}catchname;System.out.println年龄+age;System.out.println收入+income;//一定要关闭Scannerscanner.close;IOExceptione{e.printStackTrace;}//文件读取(字节流)import java.io.FileInputStream;try FileInputStreamfis=newFileInputStreamdata.bin{byte[]buffer=new byte
[1024];int bytesRead;while bytesRead=fis.readbuffer!=-1{//处理读取的字节...}}catch IOExceptione{e.printStackTrace;}//文件写入(字节流)import java.io.FileOutputStream;try FileOutputStreamfos=new FileOutputStreamdata.bin{byte[]data={65,66,67,68,69};//ABCDE fos.writedata;}catch IOExceptione{e.printStackTrace;}Scanner类提供了各种方法来解析不同类型的输入,包括nextInt,nextDouble,nextBoolean等但需要注意的是,在调用next*方法后可能需要调用nextLine来消费换行符,避免意外跳过下一次输入多线程基础线程创建方式线程生命周期新建(New)线程对象已创建但尚未启动//
1.继承Thread类class MyThreadextends Thread{@Override public void run{for inti=0;i5;i++{System.out.printlnThread A:+i;try{Thread.sleep100;//线程休眠100毫可运行(Runnable)线程已启动,正在执行或等待CPU调度秒}catch InterruptedExceptione{e.printStackTrace;}}}}//使用Thread子阻塞(Blocked)线程因等待锁而暂停类MyThread threadA=new MyThread;threadA.start;//启动线程//
2.实现Runnable接口class MyRunnableimplements Runnable等待(Waiting)线程等待其他线程的通知{@Override public void run{for inti=0;i5;i++{System.out.printlnThread B:+i;计时等待(Timed Waiting)线程等待指定的时间try{Thread.sleep100;}catch InterruptedExceptione终止(Terminated)线程执行完毕或异常退出{e.printStackTrace;}}}}//使用Runnable实现Thread threadB=new ThreadnewMyRunnable;threadB.start;//
3.使用匿名内部类Thread threadC=new ThreadnewRunnable{@Override public void run{System.out.printlnThread Cis running;}};threadC.start;//
4.使用Lambda表达式(Java8+)Thread threadD=newThread-{System.out.printlnThread Dis running;};threadD.start;//
5.使用Callable和Future(有返回值)importjava.util.concurrent.Callable;import java.util.concurrent.FutureTask;Callable callable=new Callable{@Overridepublic Integercall throws Exception{intsum=0;for inti=1;i=100;i++{sum+=i;}return sum;}};FutureTask futureTask=new FutureTaskcallable;Thread threadE=newThreadfutureTask;threadE.start;try{//获取线程执行结果(会阻塞直到结果可用)Integer result=futureTask.get;System.out.printlnSum:+result;}catch Exceptione{e.printStackTrace;}线程同步与锁机制//
1.synchronized方法public classCounter{private intcount=0;//同步实例方法public synchronized voidincrement{count++;}//同步静态方法public staticsynchronizedvoidstaticMethod{//同步代码...}public intgetCount{return count;}}//
2.synchronized代码块public voidincrementBlock{synchronizedthis{//使用this作为锁对象count++;}}//使用特定对象作为锁private finalObject lock=newObject;publicvoidmethod{synchronizedlock{//同步代码...}}//
3.使用Lock接口importjava.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;private finalLock lock=newReentrantLock;private intcount=0;publicvoidincrement{lock.lock;//获取锁try{count++;}finally{lock.unlock;//释放锁(一定要在finally中)}}编程入门GUI组件介绍事件监听机制Swingimport javax.swing.*;import java.awt.*;import java.awt.event.*;public classSimpleGUI extendsJFrame{//组件声明//按钮点击事件监听button.addActionListenernew ActionListener{@Override publicvoid actionPerformedActionEventeprivate JButtonbutton;private JLabellabel;private JTextFieldtextField;private JCheckBoxcheckBox;private{String text=textField.getText;JOptionPane.showMessageDialogSimpleGUI.this,您输入了+JRadioButton radioButton1,radioButton2;private JComboBoxcomboBox;public SimpleGUI{//设置窗口标题text,信息,JOptionPane.INFORMATION_MESSAGE;}};//使用Lambda表达式(Java8+)superSwing组件示例;//设置窗口关闭行为setDefaultCloseOperationJFrame.EXIT_ON_CLOSE;button.addActionListenere-{String text=textField.getText;JOptionPane.showMessageDialogSimpleGUI.this,//设置布局管理器setLayoutnew FlowLayout;//创建并添加组件label=new JLabel请输入文本;您输入了+text,信息,JOptionPane.INFORMATION_MESSAGE;};//复选框状态变化监听addlabel;textField=new JTextField20;addtextField;button=new JButton确定;checkBox.addItemListenere-{boolean selected=e.getStateChange==ItemEvent.SELECTED;button.setEnabledselected;addbutton;checkBox=new JCheckBox接受条款;addcheckBox;//单选按钮组//根据复选框状态启用/禁用按钮};//文本框输入监听textField.addKeyListenernew KeyAdapter{@Override publicvoidradioButton1=new JRadioButton选项1;radioButton2=new JRadioButton选项2;ButtonGroup group=new keyReleasedKeyEvente{label.setText当前输入+textField.getText;}};//窗口事件监听addWindowListenernewButtonGroup;group.addradioButton1;group.addradioButton2;addradioButton1;WindowAdapter{@Override publicvoid windowClosingWindowEvente{int option=addradioButton2;//下拉列表String[]options={选项A,选项B,选项C};comboBox=new JOptionPane.showConfirmDialogSimpleGUI.this,确定要退出吗?,确认,JComboBoxoptions;addcomboBox;//设置窗口大小和可见性setSize300,200;JOptionPane.YES_NO_OPTION;if option==JOptionPane.YES_OPTION{dispose;}}};setVisibletrue;}public staticvoid mainString[]args{//在事件调度线程中创建GUISwingUtilities.invokeLater-{new SimpleGUI;};}}网络编程基础Java通信原理客户端与服务器示例Socket TCPSocket(套接字)是网络通信的端点,提供了应用程序访问网络服务的接口Java的网络编程主要基于TCP/IP协议,支持两种套接字//TCP服务器端import java.io.*;import java.net.*;public classSimpleServer{public staticvoid mainString[]argsTCP Socket基于连接的、可靠的、面向流的通信{try//创建服务器套接字,监听12345端口ServerSocket serverSocket=newUDP Socket无连接的、不可靠的、面向数据包的通信ServerSocket12345{System.out.println服务器启动,等待连接...;//接受客户端连接trySocket clientSocket=serverSocket.accept;PrintWriter out=newTCP通信流程PrintWriter clientSocket.getOutputStream,true;BufferedReader in=newBufferedReader newInputStreamReaderclientSocket.getInputStream
1.服务器创建ServerSocket,绑定端口,监听客户端连接{System.out.println客户端已连接+clientSocket.getInetAddress;
2.客户端创建Socket,连接服务器//读取客户端消息String inputLine;while inputLine=in.readLine!=null
3.服务器接受连接,创建新Socket与客户端通信{System.out.println收到+inputLine;//发送响应
4.双方通过输入输出流交换数据out.println服务器回复+inputLine;//如果客户端发送bye,结束通信
5.通信结束后关闭连接if inputLine.equalsbye{break;}}}}catchIOException e{e.printStackTrace;}}}//TCP客户端import java.io.*;import java.net.*;public classSimpleClient{public staticvoid mainString[]args{try//连接到服务器Socket socket=new Socketlocalhost,12345;PrintWriter out=new PrintWritersocket.getOutputStream,true;BufferedReader in=new BufferedReadernew InputStreamReadersocket.getInputStream;BufferedReader stdIn=new BufferedReadernew InputStreamReaderSystem.in{System.out.println已连接到服务器;String userInput;System.out.print请输入消息;while userInput=stdIn.readLine!=null{//发送消息到服务器out.printlnuserInput;//接收服务器响应String response=in.readLine;System.out.println服务器+response;//如果输入bye,结束通信ifuserInput.equalsbye{break;}System.out.print请输入消息;}}catch IOExceptione{e.printStackTrace;}}}开发工具介绍JavaEclipse IntelliJ IDEA MavenEclipse是一个开源的、免费的集成开发环境IDE,广泛用于Java开发特点包括IntelliJIDEA是JetBrains公司开发的商业IDE,提供社区版免费和旗舰版付费特点包括Maven是一个项目管理和构建自动化工具,基于项目对象模型POM的概念主要功能包括•丰富的插件生态系统,支持多种编程语言•智能代码补全和分析•依赖管理自动下载和管理项目依赖•内置的调试器和测试工具•强大的静态代码检查和提示•构建生命周期编译、测试、打包、部署等•强大的重构功能和代码导航•集成的版本控制工具•项目结构标准化•工作空间和项目管理•数据库工具和SQL支持•插件机制扩展构建过程•与Git等版本控制系统的集成•内置构建工具支持(Maven,Gradle)•仓库管理本地和远程仓库•现代化的用户界面和优秀的用户体验使用pom.xml文件定义项目配置,包括依赖、构建设置和插件调试技巧与断点设置有效的调试是Java开发的重要技能,主要包括常见调试场景及处理方法断点设置在可能出错的代码行设置断点空指针异常检查对象是否为null,使用条件断点在可能为null的地方停止单步执行逻辑错误使用单步执行跟踪程序流程,检查变量值是否符合预期•Step OverF6执行当前行,不进入方法死循环使用断点和计数器追踪循环变量的变化•Step IntoF5进入当前行调用的方法多线程问题使用线程视图和线程断点隔离线程问题•Step OutF7执行完当前方法并返回性能问题使用分析器(Profiler)识别性能瓶颈变量监视观察变量的值和变化调试提示条件断点仅在满足特定条件时暂停•使用日志代替临时打印语句表达式求值在调试过程中执行表达式•创建简化的测试用例复现问题异常断点在发生特定异常时暂停•使用版本控制记录工作中的变化热交换在调试时修改代码而不重启程序•写单元测试验证修复•学会阅读堆栈跟踪信息代码规范与最佳实践Java12命名规范注释要求包名全部小写,使用域名反转,如com.company.project/***类级Javadoc注释,描述类的用途和责任**@author作者名*@version版本号*/public classExample{/***方法级类名大驼峰命名法(PascalCase),名词,如CustomerServiceJavadoc注释,描述方法的功能**@param param1参数1的描述*@param param2参数2的描述*@return返回值的描述接口名大驼峰命名法,形容词或名词,常用Able/ible结尾,如Runnable*@throws Exception可能抛出的异常及原因*/public StringdoSomethingString param1,int param2throwsException方法名小驼峰命名法(camelCase),动词开头,如calculateTotal{//单行注释,解释复杂逻辑if param1==null{throw newIllegalArgumentExceptionparam1不能为变量名小驼峰命名法,有意义的名称,如customerName null;}/*多行注释用于较长的解释*///TODO:标记需要完成的任务//FIXME:标常量名全大写,下划线分隔,如MAX_VALUE记需要修复的问题return result;}}泛型参数单个大写字母,如T表示类型,E表示元素,K表示键,V表示值34代码格式与排版常见设计模式•使用4个空格缩进(不用制表符)设计模式是解决特定问题的常用方案,Java中常用的设计模式包括•行宽不超过80-120个字符单例模式确保一个类只有一个实例,如配置管理器•花括号与声明在同一行,内容新起一行工厂模式通过工厂方法创建对象,隐藏创建逻辑•每个语句占一行,避免多语句一行观察者模式对象间的一对多依赖关系,如事件监听•import语句不使用通配符*,按字母顺序排列策略模式定义算法族,使它们可互换,如排序算法•空行分隔逻辑相关的代码块装饰器模式动态添加职责,如Java I/O流实战案例学生信息管理系统需求分析与设计关键代码讲解学生信息管理系统需求//学生类public classStudent{private Stringid;//学号private Stringname;//姓名private intage;•学生基本信息管理(增删改查)//年龄private Stringgender;//性别private Stringmajor;//专业//构造方法、getter/setter、toString•课程信息管理等}//成绩类public classGrade{private StringstudentId;//学生ID private String courseId;//课程ID privatedoublescore;//分数//构造方法、getter/setter等}//学生服务类public classStudentService{private List•成绩记录与统计students;private DataStoragestorage;public StudentServiceDataStoragestorage{this.storage=storage;•数据持久化存储this.students=storage.loadStudents;}//添加学生public booleanaddStudentStudent student{//检查学•用户身份验证号是否已存在if findStudentByIdstudent.getId!=null{return false;}students.addstudent;storage.saveStudentsstudents;return true;}//根据ID查找学生public系统架构设计Student findStudentByIdStringid{return students.stream.filters-表示层用户界面,处理用户交互s.getId.equalsid.findFirst.orElsenull;}//更新学生信息public boolean业务逻辑层处理业务规则和数据处理updateStudentStudent student{//实现略}//删除学生public booleandeleteStudentString id{//实现略}//获取所有学生public ListgetAllStudents{return newArrayListstudents;}}数据访问层处理数据存取核心类设计•Student学生信息类•Course课程信息类•Grade成绩记录类•StudentService学生业务逻辑类•CourseService课程业务逻辑类•GradeService成绩业务逻辑类•DataStorage数据持久化类•UserAuthentication用户认证类实战案例简单聊天室多线程与网络通信结合客户端与服务器架构消息广播机制聊天室应用是多线程和网络编程的典型应用场景,需要同时处理多个客户端连接和消息传递采用C/S(客户端/服务器)架构设计服务器需要实现消息广播功能,确保一个客户端发送的消息能被所有其他客户端接收关键技术点•服务器管理客户端连接,转发消息实现方式•服务器需要为每个客户端创建独立线程•客户端提供用户界面,发送和接收消息•维护所有客户端连接的集合•使用Socket实现客户端与服务器通信数据流向•当接收到消息时,遍历集合将消息发送给每个客户端•线程安全处理共享资源(客户端列表)
1.客户端连接到服务器•使用线程安全的集合类,如CopyOnWriteArrayList•实现消息广播机制
2.客户端发送消息到服务器•处理客户端断开连接的情况
3.服务器将消息广播给所有客户端
4.每个客户端显示接收到的消息服务器端实现客户端实现import java.io.*;import java.net.*;import java.util.concurrent.*;public classChatServer{//使用线程安全的集合存储客户端处理import java.io.*;import java.net.*;import java.util.Scanner;publicclassChatClient{private finalString serverAddress;线程private finalCopyOnWriteArrayList clients=new CopyOnWriteArrayList;private finalServerSocket private final int serverPort;private Socketsocket;private PrintWriterout;private BufferedReaderin;privateserverSocket;public ChatServerintport throwsIOException{serverSocket=new ServerSocketport;String username;public ChatClientStringserverAddress,intserverPort{this.serverAddress=serverAddress;System.out.println服务器启动,监听端口+port;}publicvoidstart{try{while truethis.serverPort=serverPort;}publicvoidstart{try{//连接到服务器socket=new{//接受新的客户端连接Socket clientSocket=serverSocket.accept;SocketserverAddress,serverPort;out=new PrintWritersocket.getOutputStream,true;in=newSystem.out.println新客户端连接+clientSocket.getInetAddress.getHostAddress;B ufferedReadernew InputStreamReadersocket.getInputStream;//获取用户名//为每个客户端创建处理线程ClientHandler handler=new ClientHandlerclientSocket,this;Scanner scanner=new ScannerSystem.in;System.out.print请输入您的用户名;username=clients.addhandler;//启动客户端处理线程new scanner.nextLine;out.printlnusername;//创建并启动消息接收线程ThreadThreadhandler.start;}}catch IOExceptione{System.out.println服务器异常+receiveThread=new Threadthis::receiveMessages;receiveThread.setDaemontrue;receiveThread.start;e.getMessage;}}//广播消息给所有客户端publicvoidbroadcastString message,ClientHandler sender//发送消息循环System.out.println开始聊天,输入bye退出;String message;while true{for ClientHandlerclient:clients{//不发送给消息发送者if client!=sender{message=scanner.nextLine;out.printlnmessage;if message.equalsbye{client.sendMessagemessage;}}}//移除断开连接的客户端publicvoid{break;}}//关闭连接removeClientClientHandler client{clients.removeclient;System.out.println客户端断开连接,当前连接数+socket.close;}catch IOExceptione{System.out.println客户端异常+clients.size;}public staticvoid mainString[]args{try{ChatServer server=new e.getMessage;}}//接收消息的方法private voidreceiveMessages{try{StringChatServer9999;server.start;}catch IOExceptione{System.out.println无法启动服务器+message;while message=in.readLine!=nulle.getMessage;}}}//客户端处理线程class ClientHandlerimplements Runnable{privatefinalSocket clientSocket;{System.out.printlnmessage;}}catch IOExceptione{if!socket.isClosedprivate finalChatServer server;private PrintWriterout;private BufferedReaderin;privateStringclientName;{System.out.println接收消息异常+e.getMessage;}}}public staticvoidpublic ClientHandlerSocketsocket,ChatServer server{this.clientSocket=socket;this.server=server;}mainString[]args{ChatClient client=new ChatClientlocalhost,9999;client.start;}}@Override publicvoid run{try{//设置输入输出流out=newPrintWriterclientSocket.getOutputStream,true;in=new BufferedReadernewInputStreamReaderclientSocket.getInputStream;//获取客户端用户名clientName=in.readLine;server.broadcastclientName+加入了聊天室,this;//处理客户端消息Stringmessage;while message=in.readLine!=null{if message.equalsbye{break;}server.broadcastclientName+:+message,this;}}catch IOExceptione{System.out.println客户端处理异常+e.getMessage;}finally{//断开连接清理try{if out!=null out.close;if in!=null in.close;if clientSocket!=null clientSocket.close;}catch IOExceptione{e.printStackTrace;}server.removeClientthis;server.broadcastclientName+离开了聊天室,this;}}//发送消息给客户端publicvoidsendMessageStringmessage{out.printlnmessage;}}学习资源推荐官方文档与教程开源项目与代码库在线社区与技术论坛官方资源是学习Java的权威参考通过阅读和参与优质开源项目可以提升实际开发能力在线社区提供互动学习和问题解决Oracle JavaSE文档最权威的Java参考文档,包含API文档、教程和开发指南GitHub热门Java项目如Spring框架、Elasticsearch、Guava等,可以学习业界最佳实践Stack Overflow最大的编程问答社区,几乎所有Java问题都能找到答案Java教程(The Java™Tutorials)由Oracle提供的全面教程,涵盖Java编程的各个方面GitHub Discussions许多Java项目的讨论区,可以与核心开发者互动Java API文档详细的类库参考,是开发时必备的查询工具Apache项目如Tomcat、Hadoop、Maven等,都是学习企业级Java开发的好资源Reddit Java社区分享最新Java新闻和讨论Java语言规范Java语言的官方规范文档,适合深入理解语言细节Java设计模式示例很多开源项目专门展示Java设计模式的实现Java专业技术论坛如JavaRanch、CodeRanch等JVM规范Java虚拟机的官方规范,适合了解Java底层运行机制LeetCode/HackerRank提供编程挑战和题解,帮助提升算法和数据结构能力各大博客平台如Medium、InfoQ、DZone等有大量Java技术文章这些文档提供了最准确的信息,但有些部分可能比较技术性和学术性,适合有一定基础的学习者参JavaFX示例程序学习GUI开发的实例技术会议与演讲如JavaOne、Devoxx等会议的视频资料考开源游戏引擎如libGDX,学习Java游戏开发各种Java用户组(JUG)本地Java社区活动和资源通过阅读代码学习是提升高级编程能力的重要途径,建议选择与自己兴趣相关的项目深入研究积极参与社区不仅可以解决技术问题,还能扩展人脉、了解行业动态,甚至找到工作机会推荐学习路径初学阶段1建立基础•掌握Java语法和基本概念2进阶阶段•学习面向对象编程原则•熟悉Java标准库扩展技能•完成小型控制台项目•深入学习集合框架和多线程推荐资源《Java核心技术》、《Head FirstJava》、Codecademy Java课程•理解设计模式与最佳实践•学习数据库连接和JDBC专业阶段3•探索GUI开发(JavaFX或Swing)框架与工具•尝试Web开发基础(Servlet/JSP)•学习Spring框架生态系统推荐资源《Effective Java》、《Java并发编程实战》、《设计模式》•掌握构建工具(Maven/Gradle)•学习ORM框架(如Hibernate)4高级阶段•理解微服务架构深入探索•学习测试框架(JUnit、Mockito)•JVM调优与性能优化推荐资源Spring官方文档、Baeldung网站、《Spring实战》•函数式编程与响应式编程•云原生应用开发总结与展望核心知识回顾进阶学习方向建议Java在本课程中,我们系统地学习了Java编程的核心概念和技术语言基础•Java语言特性与发展历程•基本语法、数据类型和运算符•流程控制语句和方法定义•异常处理机制Java生态系统非常庞大,有多个专业方向可以深入探索企业级应用开发Spring框架生态、微服务架构、云原生应用面向对象编程Web开发Servlet/JSP、Spring MVC、Spring Boot、RESTful API•类与对象的概念移动应用开发Android应用开发、跨平台框架•封装、继承和多态大数据处理Hadoop生态系统、Spark、Storm、Flink•接口与抽象类云计算容器化技术、Kubernetes、云服务集成•设计模式初步函数式编程Java8+函数式特性、响应式编程性能优化JVM调优、并发编程高级技术、性能分析标准库Java安全编程加密解密、安全框架、安全最佳实践•字符串处理测试与持续集成单元测试、集成测试、CI/CD流程•集合框架建议根据个人兴趣和职业规划选择1-2个方向深入学习,同时保持对其他领域的基本了解•输入输出流•多线程编程实用技能•GUI编程入门•网络编程基础•开发工具使用•代码规范与最佳实践这些知识构成了Java编程的坚实基础,为进一步学习更高级的Java技术和框架奠定了基础鼓励持续实践与创新构建个人项目参与开源社区保持学习习惯实践是掌握编程技能的最佳途径开源贡献是提升技能和建立声誉的有效方式技术不断发展,持续学习至关重要•从小型项目开始,逐步增加复杂度•从文档改进和小bug修复开始•关注Java新版本特性和改进•尝试不同类型的应用(Web、桌面、移动等)•参与开源项目的讨论和规划•阅读技术博客和专业书籍•解决实际问题或满足个人需求•学习业界最佳实践和协作流程•参加线上/线下技术交流活动•将项目开源,接受反馈和建议•建立专业网络和人脉关系•尝试相关技术和语言,拓宽视野•在简历中展示你的项目经验•获得真实世界的软件开发经验•解决编程挑战,提升算法能力。
个人认证
优秀文档
获得点赞 0