自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(129)
  • 收藏
  • 关注

原创 JavaScript Ajax

如果要让用户留在当前页面中,同时发出新的HTTP请求,就必须用JavaScript发送这个新请求,接收到数据后,再用JavaScript更新页面,这样一来,用户就感觉自己仍然停留在当前页面,但是数据却可以不断地更新。如果仔细观察一个Form的提交,你就会发现,一旦用户点击“Submit”按钮,表单开始提交,浏览器就会刷新页面,然后在新页面里告诉你操作是成功了还是失败了。用JavaScript写一个完整的AJAX代码并不复杂,但是需要注意:AJAX请求是异步执行的,也就是说,要通过回调函数获得响应。

2024-04-17 13:42:53 246

原创 Java 模块

现在,JRE自身的标准库已经分拆成了模块,只需要带上程序用到的模块,其他的模块就可以被裁剪掉。前面讲了,为了支持模块化,Java 9首先带头把自己的一个巨大无比的rt.jar拆成了几十个.jmod模块,原因就是,运行Java程序的时候,实际上我们用到的JDK模块,并没有那么多。不需要的模块,完全可以删除。在Java 9之前,一个大型Java程序会生成自己的jar文件,同时引用依赖的第三方jar文件,而JVM自带的Java标准库,实际上也是以jar文件形式存放的,这个文件叫rt.jar,一共有60多M。

2024-04-11 06:19:07 674

原创 class 版本

如果用Java 17编译一个Java程序,输出的class文件版本默认就是61,它可以在Java 17、Java 18上运行,但不可能在Java 11上运行,因为Java 11支持的class版本最多到55。如果用Java 11编译一个Java程序,输出的class文件版本默认就是55,这个class既可以在Java 11上运行,也可以在Java 17上运行,因为Java 17支持的class文件版本是61,表示“最多支持到版本61”。然而,指定版本如果低于当前的JDK版本,会有一些潜在的问题。

2024-04-11 06:16:27 347

原创 Java classpath和jar

因为jar包就是zip包,所以,直接在资源管理器中,找到正确的目录,点击右键,在弹出的快捷菜单中选择“发送到”,“压缩(zipped)文件夹”,就制作了一个zip文件。jar包就是用来干这个事的,它可以把package组织的目录层级,以及各个目录下的所有文件(包括.class文件和其他文件)都打成一个jar文件,这样一来,无论是备份,还是发给客户,就简单多了。通常,我们在自己编写的class中,会引用Java核心库的class,例如,String、ArrayList等。例如,在Windows系统上,用;

2024-04-11 06:13:15 246

原创 Java 内部类

nner Class除了能引用Outer实例外,还可以修改Outer Class的private字段,因为Inner Class的作用域在Outer Class内部,所以能访问Outer Class的private字段和方法。上述定义的Outer是一个普通类,而Inner是一个Inner Class,它与普通类有个最大的不同,就是Inner Class的实例不能单独存在,必须依附于一个Outer Class的实例。如果一个类定义在另一个类的内部,这个类就是Inner Class:。

2024-04-11 06:06:35 288

原创 Java 作用域

推荐把private方法放到后面,因为public方法定义了类对外提供的功能,阅读代码的时候,应该先关注public方法…包作用域是指一个类允许访问同一个package的没有public、private修饰的class,以及没有public、protected、private修饰的字段和方法。方法参数也是局部变量。定义为public的field、method可以被其他类访问,前提是首先有访问class的权限。由于Java支持嵌套类,如果一个类内部还定义了嵌套类,那么,嵌套类拥有访问private的权限。

2024-04-11 05:56:36 324

原创 Java 包

如果有两个class名称相同,例如,mr.jun.Arrays和java.util.Arrays,那么只能import其中一个,另一个必须写完整类名。// ok,使用java.lang包的String -> java.lang.String。// ok,使用完整类名 -> java.util.List。注意:自动导入的是java.lang包,但类似java.lang.reflect这些包仍需要手动导入。没有定义包名的class,它使用的是默认包,非常容易引起名字冲突,因此,不推荐不写包名的做法。

2024-04-11 05:47:42 256

原创 Java 静态字段和静态方法

因为静态方法属于class而不属于实例,因此,静态方法内部,无法访问this变量,也无法访问实例字段,它只能访问静态字段。因此,不推荐用实例变量.静态字段去访问静态字段,因为在Java程序中,实例对象并没有静态字段。在代码中,实例对象能访问静态字段只是因为编译器可以根据实例类型自动转换为类名.静态字段来访问静态对象。实例字段在每个实例中都有自己的一个独立“空间”,但是静态字段只有一个共享“空间”,所有实例都会共享该字段。虽然实例可以访问静态字段,但是它们指向的其实都是Person class的静态字段。

2024-04-10 18:08:24 401

原创 Java 接口

因为interface没有字段,default方法无法访问字段,而抽象类的普通方法可以访问实例字段。Java的接口特指interface的定义,表示一个接口类型和一组方法签名,而编程接口泛指接口规范,如方法签名,数据格式,网络协议等。此时,Person接口继承自Hello接口,因此,Person接口现在实际上有3个抽象方法签名,其中一个来自继承的Hello接口。在抽象类中,抽象方法本质上是定义接口规范:即规定高层类的接口,从而保证所有子类都有相同的接口实现,多态就能发挥出威力。

2024-04-10 17:37:47 705

原创 Java 抽象类

因为这个抽象方法本身是无法执行的,所以,Person类也无法被实例化。因为抽象类本身被设计成只能用于被继承,因此,抽象类可以强迫子类实现其定义的抽象方法,否则编译会报错。因此,抽象方法实际上相当于定义了“规范”。如果父类Person的run()方法没有实际意义,不行去掉方法的执行语句,会导致编译错误,因为定义方法的时候,必须实现方法的语句。如果一个class定义了方法,但没有具体执行代码,这个方法就是抽象方法,抽象方法用abstract修饰。答案还是不行,因为去掉父类的run()方法,就失去了多态的特性。

2024-04-10 16:24:53 232

原创 Java 多态

对某个类型调用某个方法,执行的实际方法可能是某个子类的覆写方法,多态具有一个非常强大的功能,就是允许添加更多类型的子类实现功能扩展,却不需要修改基于父类的代码。它传入的参数类型是Person,我们是无法知道传入的参数实际类型究竟是Person,还是Student,还是Person的其他子类,因此,也无法确定调用的是不是Person类定义的run()方法。注意:方法名相同,方法参数相同,但方法返回值不同,也是不同的方法。多态是指,针对某个类型的方法调用,其真正执行的方法取决于运行时期实际类型的方法。

2024-04-10 14:57:42 545

原创 java继承

在OOP的术语中,我们把Person称为超类(super class),父类(parent class),基类(base class),把Student称为子类(subclass),扩展类(extended class)在向下转型的时候,把p1转型为Student会成功,因为p1确实指向Student实例,把p2转型为Student会失败,因为p2的实际类型是Person,不能把父类变为子类,因为子类功能比父类多,多的功能无法凭空变出来。子类默认的构造方法是编译器自动生成的,不是继承的。

2024-04-09 02:28:17 604

原创 Java 方法重载

int indexOf(String str, int fromIndex)根据字符串查找,但指定起始位置。int indexOf(int ch, int fromIndex):根据字符查找,但指定起始位置;方法重载的目的是,功能类似的方法使用同一名字,更容易记住,因此,调用起来更简单。int indexOf(int ch):根据字符的Unicode码查找;int indexOf(String str):根据字符串查找;方法名相同,但各自的参数不同,称为方法重载(Overload)

2024-04-08 13:48:56 231

原创 Java 构造方法

但是,和普通方法相比,构造方法没有返回值(也没有void),调用构造方法,必须用new操作符。没有在构造方法中初始化字段时,引用类型的字段默认是null,数值类型的字段用默认值,int类型默认值是0,布尔类型默认值是false;创建实例的时候,实际上是通过构造方法来初始化实例的。因此,构造方法的代码由于后运行,所以,new Person(“Xiao Ming”, 12)的字段值最终由构造方法的代码确定。要特别注意的是,如果我们自定义了一个构造方法,那么,编译器就不再自动创建默认构造方法。

2024-04-08 13:44:25 180

原创 Java 方法

和private字段一样,private方法不允许外部调用,定义private方法的理由是内部方法是可以调用private方法的。一开始,把fullname数组传进去,然后,修改fullname数组的内容,结果发现,实例p的字段p.name也被修改了!比如,setAge()就会检查传入的参数,参数超出了范围,直接报错。结论:引用类型参数的传递,调用方的变量,和接收方的参数变量,指向的是同一个对象。我们先观察一个基本类型参数的传递,结论:基本类型参数的传递,是调用方值的复制。双方各自的后续修改,互不影响。

2024-04-08 13:26:34 686

原创 Java 面向对象基础

上面的Person类,我们定义了两个字段,一个是String类型的字段,命名为name,一个是int类型的字段,命名为age。一个Java源文件可以包含多个类的定义,但只能定义一个public类,且public类名必须与文件名一致。通过new操作符创建新的instance,然后用变量指向它,即可通过变量来引用这个instance;定义了class,只是定义了对象模版,而要根据对象模版创建出真正的对象实例,必须用new操作符。定义class就是定义了一种数据类型,对应的instance是这种数据类型的实例;

2024-04-08 11:16:52 383

原创 Java 面向对象编程

和面向对象编程不同的,是面向过程编程。面向过程编程,是把模型分解成一步一步的过程。Java是一种面向对象的编程语言。面向对象编程,英文是Object-Oriented Programming,简称OOP。因此,面向对象编程,是一种通过对象的方式,把现实世界映射到计算机模型的一种编程方法。而面向对象编程,顾名思义,你得首先有个对象:object-oriented。

2024-04-08 10:58:37 110

原创 Java 命令行参数

我们可以利用接收到的命令行参数,根据不同的参数执行不同的代码。Java程序的入口是main方法,而main方法可以接受一个命令行参数,它是一个String[]数组。这样,程序就可以根据传入的命令行参数,作出不同的响应。命令行参数由JVM接收用户输入并传给main方法;命令行参数类型是String[]数组;如何解析命令行参数需要由程序自己实现。

2024-04-08 07:55:33 136

原创 Java 多维数组

二维数组就是数组的数组。二维数组的每个数组元素的长度并不要求相同。三维数组就是二维数组的数组。

2024-04-08 07:44:29 182

原创 Java 数组排序

冒泡排序的特点是,每一轮循环后,最大的一个数被交换到末尾,因此,下一轮循环就可以“刨除”最后的数,每一轮循环都比上一轮循环的结束位置靠前一位。实际上,Java的标准库已经内置了排序功能,我们只需要调用JDK提供的Arrays.sort()就可以排序:对数组排序实际上修改了数组本身。常用的排序算法有冒泡排序、插入排序和快速排序等。

2024-04-08 07:25:17 169

原创 Java 遍历数组

显然for each循环更加简洁。但是,for each循环无法拿到数组的索引,因此,到底用哪一种for循环,取决于我们的需要。因为数组的每个元素都可以通过索引来访问,因此,使用标准的for循环可以完成一个数组的遍历。使用for each循环打印也很麻烦。幸好Java标准库提供了Arrays.toString(),可以快速打印数组内容。注意:在for (int n : ns)循环中,变量n直接拿到ns数组的元素,而不是索引。// 类似 [I@7852e922。我们希望打印的数组的元素内容。

2024-04-08 07:15:25 255

原创 Java break和continue

break会跳出当前循环,也就是整个循环都不会执行了。而continue则是提前结束本次循环,直接继续执行下次循环。在循环过程中,可以使用break语句跳出当前循环。

2024-04-08 06:48:13 74

原创 Java do while循环 for循环

在for循环执行前,会先执行初始化语句int i=1,它定义了计数器变量i并赋初始值为1,然后,循环前先检查循环条件i<=100,循环后自动执行i++,因此,和while循环相比,for循环把更新计数器的代码统一放到了一起。for循环会先初始化计数器,然后,在每次循环前检测循环条件,在每次循环后更新计数器。和for循环相比,for each循环的变量n不再是计数器,而是直接对应到数组的每个元素。而另一种do while循环则是先执行循环,再判断条件,条件满足时继续循环,条件不满足时退出。

2024-04-08 06:42:46 319

原创 Java while循环

如果计算结果为true,就把循环体内的语句执行一遍,如果计算结果为false,那就直接跳到while循环的末尾,继续往下执行。因为计算机的特点是计算速度非常快,我们让计算机循环一亿次也用不到1秒,所以很多计算的任务,人去算是算不了的,但是计算机算,使用循环这种简单粗暴的方法就可以快速得到结果。如果计算结果为true,就把循环体内的语句执行一遍,如果计算结果为false,那就直接跳到while循环的末尾,继续往下执行。循环语句就是让计算机根据条件做循环计算,在条件满足时继续循环,条件不满足时退出循环。

2024-04-08 06:25:38 150

原创 Java switch多重选择

使用switch时,如果遗漏了break,就会造成严重的逻辑错误,而且不易在源代码中发现错误。从Java 12开始,switch语句升级为更简洁的表达式语法,使用类似模式匹配(Pattern Matching)的方法,保证只有一种路径会被执行,并且不需要break语句。switch语句根据switch (表达式)计算的结果,跳转到匹配的case结果,然后继续执行后续语句,直到遇到break结束执行。从Java 14开始,switch语句正式升级为表达式,不再需要break,并且允许使用yield返回值。

2024-04-08 06:16:37 385

原创 Java if 判断

由于使用缩进格式,很容易把两行语句都看成if语句的执行块,但实际上只有第一行语句是if的执行块。当if语句块只有一行语句时,可以省略花括号{}:但是,省略花括号并不总是一个好主意。还可以把一定不是null的对象"hello"放到前面:例如:if (“hello”.equals(s)) { …根据if的计算结果(true还是false),JVM决定是否执行if语句块(即花括号{}包含的所有语句)。在Java中,判断值类型的变量是否相等,可以使用==运算符。但是,判断引用类型的变量是否相等,

2024-04-08 05:45:32 252

原创 Java 流程控制—输入和输出

直接使用System.in读取用户输入虽然是可以的,但需要更复杂的代码,而通过Scanner就可以简化后续的代码。有了Scanner对象后,要读取用户输入的字符串,使用scanner.nextLine(),要读取用户输入的整数,使用scanner.nextInt()。但是,在实际的代码中,程序经常需要做条件判断、循环,因此,需要有多种流程控制语句,来实现程序的跳转和循环等功能。// 创建Scanner对象。在前面的代码中,我们总是使用System.out.println()来向屏幕输出一些内容。

2024-04-08 05:37:45 311

原创 java 数组类型

定义一个数组类型的变量,使用数组类型“类型[]”,例如,int[]。和单个基本类型变量不同,数组变量初始化必须使用new int[5]表示创建一个可容纳5个int元素的数组。数组是引用类型,在使用索引访问数组元素时,如果索引超出范围,运行时将报错。也可以在定义数组时直接指定初始化的元素,这样就不必写出数组大小,而是由编译器自动推算数组大小。数组索引从0开始,例如,5个元素的数组,索引范围是0~4。数组元素可以是值类型(如int)或引用类型(如String),但数组本身是引用类型;

2024-04-08 05:05:03 597

原创 Java字符和字符串

例如,“abc"xyz”,编译器就无法判断中间的引号究竟是字符串的一部分还是表示字符串结束。因为Java在内存中总是使用Unicode表示字符,所以,一个英文字符和一个中文字符都用一个char类型表示,它们都占用两个字节。至于变量,可以一会指向字符串"hello",一会指向字符串"world"。Java的编译器对字符串做了特殊照顾,可以使用+连接任意字符串和其他数据类型,这样极大地方便了字符串的处理。注意要区分空值null和空字符串"",空字符串是一个有效的字符串对象,它不等于null。

2024-04-08 04:55:35 326

原创 java 布尔运算

x : y会首先计算b,如果b为true,则只计算x,否则,只计算y。此外,x和y的类型必须相同,因为返回值不是boolean,而是x和y之一。因为false && x的结果总是false,无论x是true还是false,因此,与运算在确定第一个值为false后,不再继续计算,而是直接返回false。x : y,它根据第一个布尔表达式的结果,分别返回后续两个表达式之一的计算结果。如果一个布尔运算的表达式能提前确定结果,则后续的计算不再执行,直接返回结果。比较运算符:>,>=,<,<=,==,!

2024-04-07 18:50:16 154

原创 java 浮点数运算

因为浮点数常常无法精确表示,因此,浮点数运算会产生误差,所以比较两个浮点数是否相等常常会出现错误的结果。如果转型后超过了整型能表示的最大范围,将返回整型的最大值。计算结果为5.2,原因是编译器计算24 / 5这个子表达式时,按两个整数进行运算,结果仍为整数4。在计算机中,浮点数虽然表示的范围大,但是浮点数有个非常重要的特点,就是浮点数常常无法精确表示。需要特别注意,在一个复杂的四则运算中,两个整数的运算不会出现自动提升的情况。浮点数运算和整数运算相比,只能进行加减乘除这些数值计算,不能做位运算和移位运算。

2024-04-07 18:28:55 180

原创 Java整数运算

在运算过程中,如果参与运算的两个数类型不一致,那么计算结果为较大类型的整型。例如,short和int计算,结果总是int,原因是short首先自动被转型为int。也可以将结果强制转型,即将大范围的整数转型为小范围的整数。要特别注意,整数由于存在范围限制,如果计算结果超出了范围,就会产生溢出,而溢出不会出错,却会得到一个奇怪的结果。// 12345÷67的余数是17。Java还提供了++运算和–运算,它们可以对一个整数进行加1和减1的操作。对两个整数进行位运算,实际上就是按位对齐,然后依次对每一位进行运算。

2024-04-07 18:10:49 308

原创 Java变量和数据类型

浮点类型的数就是小数,因为小数用科学计数法表示的时候,小数点是可以“浮动”的,如1234.5可以表示成12.345x102,也可以表示成1.2345x103,所以称为浮点数。Java的char类型除了可表示标准的ASCII外,还可以表示一个Unicode字符.注意char类型使用单引号’,且仅有一个字符,要和双引号"的字符串类型区分开。定义变量时,要遵循作用域最小化原则,尽量将变量定义在尽可能小的作用域,并且,不要重复使用变量名。在Java中,变量必须先定义后使用,在定义变量的时候,可以给它一个初始值。

2024-04-07 17:19:58 218

原创 Java程序基本结构

Java程序对格式没有明确的要求,多几个空格或者回车不影响程序的正确性,但是我们要养成良好的编程习惯,注意遵守Java社区约定的编码格式。在Java程序中,注释是一种给人阅读的文本,不是程序的一部分,所以编译器会自动忽略注释。在方法内部,语句才是真正的执行代码。这里的方法名是main,返回值是void,表示没有任何返回值。注意到public是访问修饰符,表示该class是公开的。方法定义了一组执行语句,方法内部的代码将会被依次顺序执行。类名必须以英文字母开头,后接字母,数字和下划线的组合。

2024-04-07 12:47:52 336

原创 Java初学

方法是可执行的代码块,一个方法除了方法名main,还有用()括起来的方法参数,这里的main方法有一个参数,参数类型是String[],参数名是args,public、static用来修饰方法,这里表示它是一个公开的静态方法,void是方法的返回类型,而花括号{}中间的就是方法的代码。而花括号{}中间则是类的定义。注意到Java源码的缩进不是必须的,但是用缩进后,格式好看,很容易看出代码块的开始和结束,缩进一般是4个空格或者一个tab。方法的代码每一行用;它用来打印一个字符串到屏幕上。

2024-04-07 12:35:58 90

原创 Java

Java EE:Enterprise Edition企业版,它只是在Java SE的基础上加上了大量的API和库,以便方便开发Web应用、数据库、消息服务等,Java EE的应用使用的虚拟机和Java SE完全相同 ,是进一步学习Web应用所必须的。Java ME:Micro Edition是一个针对嵌入式设备的“瘦身版”,Java SE的标准库无法在Java ME上使用,Java ME的虚拟机也是“瘦身版”Java虚拟机拥有工业级的稳定性和高度优化的性能,且经过了长时期的考验;Android移动平台。

2024-04-06 03:12:01 585

原创 JavaScript 操作文件

在JavaScript中,浏览器的JavaScript执行引擎在执行JavaScript代码时,总是以单线程模式执行,也就是说,任何时候,JavaScript代码都不可能同时有多于1个线程在执行。由于JavaScript对用户上传的文件操作非常有限,尤其是无法读取文件内容,使得很多需要操作文件的网页不得不用Flash这样的第三方插件来实现。随着HTML5的普及,新增的File API允许JavaScript读取文件内容,获得更多的文件信息。下面的例子演示了如何读取用户选取的图片文件,并在一个。

2024-04-05 02:58:06 355

原创 JavaScript操作表单

注意要return true来告诉浏览器继续提交,如果return false,浏览器将不会继续提交form,这种情况通常对应用户输入有误,提示用户错误信息后终止提交form。例如,很多登录表单希望用户输入用户名和口令,但是,安全考虑,提交表单时不传输明文口令,而是口令的MD5。不过表单的输入框、下拉框等可以接收用户输入,所以用JavaScript来操作表单,可以获得用户输入的内容,或者对一个输入框设置新的内容。隐藏文本,对应的,用户不可见,但表单提交时会把隐藏文本发送到服务器。// ‘用户输入的值’

2024-04-05 01:21:17 242

原创 JavaScript 操作DOM

严格地讲,我们这里的DOM节点是指Element,但是DOM节点实际上是Node,在HTML中,Node包括Element、Comment、CDATA_SECTION等很多种,以及根节点Document类型,但是,绝大多数时候我们只关心Element,也就是实际控制页面结构的Node,其他类型的Node忽略即可。一个是使用appendChild,把一个子节点添加到父节点的最后一个子节点。当你遍历一个父节点的子节点并进行删除操作时,要注意,children属性是一个只读属性,并且它在子节点变化时会实时更新。

2024-04-05 01:02:39 321

原创 JavaScript 浏览器对象

此后,浏览器访问该网站时,会在请求头附上这个Cookie,服务器根据Cookie即可区分出用户。history对象保存了浏览器的历史记录,JavaScript可以调用history对象的back()或forward (),相当于用户点击了浏览器的“后退”或“前进”按钮。如果引入的第三方的JavaScript中存在恶意代码,则www.foo.com网站将直接获取到www.example.com网站的用户登录信息。Cookie还可以存储网站的一些设置,例如,页面显示的语言等等。

2024-04-05 00:58:44 317

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除