Java教程 第2页 在本章节中我们将为大家介绍如何搭建Java开发环境,以及不同系统下的环境变量怎么配置。 本站提供java在线运行工具:https://www.w3cschool.cn/tryrun/runcode?lang=java-openjdk,但由于在线环境权限不足,大部分代码都不能直接在线运行,所以搭好一个本地可运行的环境相当重要!!! window系统安装java 下载JDK 首先我们需要下载java开发工具包JDK,下载地址:https://www.oracle.com/java/technologies/downloads/#java11-windows 点击如下下载按钮: 在下载页面中你需要选择接受许可,并根据自己的系统选择对应的版本,本文以 Window 64位系统为例: 下载后JDK的安装根据提示进行,还有安装JDK的时候也会安装JRE,一并安装就可以了。 安装JDK,安装过程中可以自定义安装目录等信息,例如我们选择安装目录为 C:\Program Files (x86)\Java\jdk11.0.1。 配置环境变量 1.右击“我的电脑”→“属性”→“高级系统设置”→“高级”→“环境变量”; 2.选择”高级”选项卡,点击”环境变量”; 3. 新建“JAVA_HOME”系统变量(点击“系统变量”下方的“新建”按钮,填写变量名与变量值,点击“确定”) 4. 同上,新建“CLASSPATH”系统变量,变量值为“.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;”。(引号内的全部内容,注意最前方是点不是逗号) 5. 双击“系统变量”下的“Path”变量进行编辑。(此时可以看到JAVA_HOME已经存在于系统变量中),(有的电脑”Path”也写作“PATH”) 这是 Java 的环境配置,配置完成后,你可以启动 Eclipse 来编写代码,它会自动完成java环境的配置。 在”系统变量”中设置3项属性,JAVA_HOME,PATH,CLASSPATH(大小写无所谓),若已存在则点击”编辑”,不存在则点击”新建”。 变量设置参数如下: 变量名:JAVA_HOME 变量值:C:\Program Files (x86)\Java\jdk1.8.0_91 // 要根据自己的实际路径配置 变量名:CLASSPATH 变量值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar; //记得前面有个”.” 变量名:Path 变量值:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin; 注意:如果使用1.5以上版本的JDK,不用设置CLASSPATH环境变量,也可以正常编译和运行Java程序。 通过控制台测试JDK是否安装成功 1、同时按键盘上“win”、“R”两个键打开运行,输入“cmd”确定打开控制台。 2、键入命令: java -version、java、javac 几个命令,出现以下信息,说明环境变量配置成功; Linux,UNIX,Solaris,FreeBSD环境变量设置 环境变量PATH应该设定为指向Java二进制文件安装的位置。如果设置遇到困难,请参考shell文档。 例如,假设你使用bash作为shell,你可以把下面的内容添加到你的 .bashrc文件结尾: export PATH=/path/to/java:$PATH 流行JAVA开发工具 正所谓工欲善其事必先利其器,我们在开发java语言过程中同样需要一款不错的开发工具,目前市场上的IDE很多,本文为大家推荐以下几款java开发工具: Eclipse:另一个免费开源的java IDE,下载地址: https://www.eclipse.org/eclipseide/ 选择 Eclipse IDE for Java Developers: IntelliJ IDEA(推荐):一个好用的java IDE,专业版功能强大但需要付费,开源版基础功能足够雄厚让你有更好的代码开发体验 下载地址:https://www.jetbrains.com/zh-cn/idea/ Notepad++ : Notepad++ 是在微软windows环境之下的一个免费的代码编辑器,下载地址: http://notepad-plus-plus.org/ 此外还有很多优秀的代码编辑器,比如vscode,sublime,vim等,在此不做过多介绍。 使用 Eclipse 运行第一个 Java 程序 HelloWorld.java 文件代码: public class HelloWorld { public static void main(String []args) { System.out.println("Hello World"); } }
2024-04-01
java.util包提供了Date类来封装当前的日期和时间。 Date类提供两个构造函数来实例化Date对象。 第一个构造函数使用当前日期和时间来初始化对象。 Date( ) 第二个构造函数接收一个参数,该参数是从1970年1月1日起的毫秒数。 Date(long millisec) Date对象创建以后,可以调用下面的方法。 序号 方法和描述 1 boolean after(Date date) 若当调用此方法的Date对象在指定日期之后返回true,否则返回false。 2 boolean before(Date date) 若当调用此方法的Date对象在指定日期之前返回true,否则返回false。 3 Object clone( ) 返回此对象的副本。 4 int compareTo(Date date) 比较当调用此方法的Date对象和指定日期。两者相等时候返回0。调用对象在指定日期之前则返回负数。调用对象在指定日期之后则返回正数。 5 int compareTo(Object obj) 若obj是Date类型则操作等同于compareTo(Date) 。否则它抛出ClassCastException。 6 boolean equals(Object date) 当调用此方法的Date对象和指定日期相等时候返回true,否则返回false。 7 long getTime( ) 返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。 8 int hashCode( ) 返回此对象的哈希码值。 9 void setTime(long time) 用自1970年1月1日00:00:00 GMT以后time毫秒数设置时间和日期。 10 String toString( ) 转换Date对象为String表示形式,并返回该字符串。 获取当前日期时间 Java中获取当前日期和时间很简单,使用Date对象的 toString()方法来打印当前日期和时间,如下所示: import java.util.Date; public class Main{ public static void main(String args[]) { // 初始化 Date 对象 Date date = new Date(); // 使用 toString() 函数显示日期时间 System.out.println(date.toString()); } } 尝试一下 以上实例编译运行结果如下: Mon May 04 09:51:52 CDT 2013 日期比较 Java使用以下三种方法来比较两个日期: 使用getTime( ) 方法获取两个日期(自1970年1月1日经历的毫秒数值),然后比较这两个值。 使用方法before(),after()和equals()。例如,一个月的12号比18号早,则new Date(99,...
2024-04-01
计算机的最基本用途之一就是执行数学运算,作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量。我们可以把运算符分成以下几组: 算术运算符 关系运算符 位运算符 逻辑运算符 赋值运算符 其他运算符 算术运算符 算术运算符用在数学表达式中,它们的作用和在数学中的作用一样。下表列出了所有的算术运算符。 表格中的实例假设整数变量A的值为10,变量B的值为20: 操作符 描述 例子 + 加法 – 相加运算符两侧的值 A + B等于30 – 减法 – 左操作数减去右操作数 A – B等于-10 * 乘法 – 相乘操作符两侧的值 A * B等于200 / 除法 – 左操作数除以右操作数 B / A等于2 % 取模 – 左操作数除以右操作数的余数 B%A等于0 ++ 自增 – 操作数的值增加1 B++ 或 ++B 等于 21 — 自减 – 操作数的值减少1 B– 或 –B 等于 19 虽然都是自增(他们的运算结果都是等于B+1),但B++和++B还是有所区别,++B是左值,直接原地操作(可以理解为直接在变量B上+1),B++是右值,在编译器中运算的时候会先构建一个临时变量,用临时变量运算+1后再赋值给B。 所以,在下面实例代码中,打印d++的时候发现结果并没有+1(这个时候打印的是d这个变量,运算的是d的临时变量),但是后一条打印的语句显示的结果又是+1后的结果(临时变量的值赋给变量d了)。而打印++d的结果是直接+1的。 实例 下面的简单示例程序演示了算术运算符。复制并粘贴下面的Java程序并保存为Test.java文件,然后编译并运行这个程序: public class Test { public static void main(String args[]) { int a = 10; int b = 20; int c = 25; int d = 25; System.out.println("a + b = " + (a + b) ); System.out.println("a - b = " + (a - b) ); System.out.println("a * b = " +...
2024-04-01
Java教程 – Java continue语句 continue 语句强制循环的早期迭代。在 while 和 do-while 循环中, continue 语句使控制转移到条件语句表达式控制循环。在 for 循环中,控制首先进行迭代for语句的部分,然后到条件表达式。 Java continue语句 continue 语句的语法 continue; 或者 continue labelName; 以下代码显示如何使用continue语句。 public class Main { public static void main(String[] argv) { for (int i = 0; i < 10; i++) { System.out.print(i + " "); if (i % 2 == 0) continue; System.out.println(""); } } } 上面的代码生成以下结果。 例子 continue 可以指定 label 来描述要继续的封闭循环。 public class Main { public static void main(String args[]) { outer: for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { if (j > i) { System.out.println(); continue outer; } System.out.print(" " + (i * j)); } } System.out.println(); } } 这里是这个程序的输出: 例2 下面的代码显示了如何使用标签while循环。 public class...
2024-04-01
Java教程 – Java For语句 Java for 循环语句提供了一种强大的写循环语句的方法。 for循环的最简单形式如下所示: for(initialization; condition; iteration) statement; Java for循环语句有三个部分: 初始化将循环控制变量设置为初始值。 condition 是测试循环控制变量的布尔表达式。 如果condition为true,for循环继续迭代。 如果condition为false,循环终止。 迭代决定了每次循环迭代时循环控制变量的变化。 这里是一个简短的程序,说明了for循环。 i 是循环控制变量, i 被初始化为零初始化。在每次迭代的开始,条件测试 x 10 。如果该测试的结果为真,则执行 println()语句,然后执行循环的迭代部分。此过程继续,直到条件测试为 false 。 public class Main { public static void main(String args[]) { int i; for (i = 0; i < 10; i = i + 1) System.out.println("This is i: " + i); } } 此程序生成以下输出: 例子 下面的代码再次从上面写入代码逻辑,但是循环反转: public class Main { public static void main(String args[]) { for (int n = 10; n > 0; n--) System.out.println("n:" + n); } } ]]> 输出: 例2 这里是一个程序,使用 for 循环语句测试素数。 public class Main { public static void main(String args[]) { int num; boolean isPrime = true; num = 50; for (int i = 2; i...
2024-04-01
Java流 – Java创建流 已将新方法添加到Java库以返回流。 我们可以通过以下方式创建流。 从值创建流 从空流创建流 从函数创建流 从数组创建流 从集合创建流 从文件创建流 从其他来源创建流 在以下部分中,我们将学习如何创建流。 从值创建流 我们可以使用Stream接口的()从单个值和多个值创建顺序流。 <T> Stream<T> of(T t) <T> Stream<T> of(T...values) 从方法签名,我们可以看到第一个of()方法从单个值创建流,而第二个of()方法从不同长度参数创建流 以下代码创建包含单个值的流。 import java.util.stream.Stream; public class Main { public static void main(String[] args) { Stream<String> stream = Stream.of("www.w3cschool.cn"); stream.forEach(System.out::println); } } 上面的代码生成以下结果。 例2 以下代码创建具有四个字符串的流。 import java.util.stream.Stream; public class Main { public static void main(String[] args) { Stream<String> stream = Stream.of("XML", "Java", "CSS", "SQL"); stream.forEach(System.out::println); } } 上面的代码生成以下结果。 例3 以下代码从对象数组创建流。 import java.util.stream.Stream; public class Main { public static void main(String[] args) { String[] names = { "XML", "Java", "SQL", "CSS" }; Stream<String> stream = Stream.of(names); stream.forEach(System.out::println); } } 上面的代码生成以下结果。 流构建器 我们可以使用Stream.Builder<T>创建流。 以下代码创建流构建器。 Stream.Builder<String> builder = Stream.builder(); import java.util.stream.Stream; public class Main { public static void main(String[] args) { Stream<String>...
2024-04-01
Java面向对象设计 – Java Object.Clone方法 Java不提供克隆(复制)对象的自动机制。 克隆对象意味着逐位复制对象的内容。 要支持克隆操作,请在类中实现clone()方法。 Object类中的clone()方法的声明如下: protected Object clone() throws CloneNotSupportedException clone()方法声明为protected。因此,我们不能从客户端代码调用它。以下代码无效: Object obj = new Object(); Object clone = obj.clone(); // Error. Cannot access protected clone() method 我们需要在类中声明clone()方法public克隆类的对象。 它的返回类型是Object。这意味着您将需要转换clone()方法的返回值。 假设MyClass是可克隆的。克隆代码将如下所示: MyClass mc = new MyClass(); MyClass clone = (MyClass)mc.clone(); // Need to use a cast Object类中的clone()方法会抛出CloneNotSupportedException。 要调用clone()方法,我们需要将调用放在try-catch块中,或者重新抛出异常。 例子 以下代码显示了如何实现克隆方法。 class MyClass implements Cloneable { private double value; public MyClass(double value) { this.value = value; } public void setValue(double value) { this.value = value; } public double getValue() { return this.value; } public Object clone() { MyClass copy = null; try { copy = (MyClass) super.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return copy; } } public class Main { public static void main(String[] args) { MyClass...
2024-04-01
Java String类 substring() 方法返回字符串的子字符串。可以理解为字符串切片。 语法 public String substring(int beginIndex) 或 public String substring(int beginIndex, int endIndex) 参数 beginIndex — 起始索引(包括)。 endIndex — 结束索引(不包括)。 注意:这两个参数都为int类型 返回值 子字符串。 实例 public class Test { public static void main(String args[]) { String Str = new String("www.w3cschool.cn"); System.out.print("返回值 :" ); System.out.println(Str.substring(4) ); System.out.print("返回值 :" ); System.out.println(Str.substring(4, 13) ); } } 以上程序执行结果为: 返回值 :w3cschool.cn 返回值 :w3cschool Java String类
2024-04-01
applet是一种Java程序。它一般运行在支持Java的Web浏览器内。因为它有完整的Java API支持,所以applet是一个全功能的Java应用程序。 如下所示是独立的Java应用程序和applet程序之间重要的不同: Java中applet类继承了 java.applet.Applet类 Applet类没有定义main(),所以一个 Applet程序不会调用main()方法, Applets被设计为嵌入在一个HTML页面。 当用户浏览包含Applet的HTML页面,Applet的代码就被下载到用户的机器上。 要查看一个applet需要JVM。 JVM可以是Web浏览器的一个插件,或一个独立的运行时环境。 用户机器上的JVM创建一个applet类的实例,并调用Applet生命周期过程中的各种方法。 Applets有Web浏览器强制执行的严格的安全规则,applet的安全机制被称为沙箱安全。 applet需要的其他类可以用Java归档(JAR)文件的形式下载下来。 Applet的生命周期 Applet类中的四个方法给你提供了一个框架,你可以在该框架上开发小程序: init: 该方法的目的是为你的applet提供所需的任何初始化。在Applet标记内的param标签被处理后调用该方法。 start: 浏览器调用init方法后,该方法被自动调用。每当用户从其他页面返回到包含Applet的页面时,则调用该方法。 stop:当用户从包含applet的页面移除的时候,该方法自动被调用。因此,可以在相同的applet中反复调用该方法。 destroy: 此方法仅当浏览器正常关闭时调用。因为applets只有在HTML网页上有效,所以你不应该在用户离开包含Applet的页面后遗漏任何资源. paint: 该方法在start()方法之后立即被调用,或者在applet需要重绘在浏览器的时候调用。paint()方法实际上继承于java.awt。 “Hello, World” Applet: 下面是一个简单的Applet程序HelloWorldApplet.java: import java.applet.*; import java.awt.*; public class HelloWorldApplet extends Applet { public void paint (Graphics g) { g.drawString ("Hello World", 25, 50); } } 这些import语句将以下类导入到我们的applet类中: java.applet.Applet. java.awt.Graphics. 没有这些import语句,Java编译器就识别不了Applet和Graphics类。 Applet 类 每一个applet都是java.applet.Applet 类的子类,基础的Applet类提供了供衍生类调用的方法,以此来得到浏览器上下文的信息和服务。 这些方法做了如下事情: 得到applet的参数 得到包含applet的HTML文件的网络位置 得到applet类目录的网络位置 打印浏览器的状态信息 获取一张图片 获取一个音频片段 播放一个音频片段 调整此 applet 的大小 除此之外,Applet类还提供了一个接口,该接口供Viewer或浏览器来获取applet的信息,并且来控制applet的执行。 Viewer可能是: 请求applet作者、版本和版权的信息 请求applet识别的参数的描述 初始化applet 销毁applet 开始执行applet 结束执行applet Applet类提供了对这些方法的默认实现,这些方法可以在需要的时候重写。 “Hello,World”applet都是按标准编写的。唯一被重写的方法是paint方法。 Applet的调用 applet是一种Java程序。它一般运行在支持Java的Web浏览器内。因为它有完整的Java API支持,所以applet是一个全功能的Java应用程序。 <applet>标签是在HTML文件中嵌入applet的基础。以下是一个调用”Hello World”applet的例子; <html> <title>The Hello, World Applet</title> <hr> <applet code="HelloWorldApplet.class" width="320" height="120"> If your browser was Java-enabled, a "Hello, World" message would appear here. </applet> <hr> </html> 注意: 你可以参照HTML Applet标签来更多的了解从HTML中调用applet的方法。 <applet>标签的属性指定了要运行的Applet类。Width和height用来指定applet运行面板的初始大小。applet必须使用</applet>标签来关闭。 如果applet接受参数,那么参数的值需要在标签里添加,该标签位于<applet>和</applet>之间。浏览器忽略了applet标签之间的文本和其他标签。 不支持Java的浏览器不能执行<applet>和</applet>。因此,在标签之间显示并且和applet没有关系的任何东西,在不支持的Java的浏览器里是可见的。 Viewer或者浏览器在文档的位置寻找编译过的Java代码,要指定文档的路径,得使用<applet>标签的codebase属性指定。 如下所示: <applet...
2024-04-01
Java 8 Stream Java 8 新特性 Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。 Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。 Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。 这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。 元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。 +--------------------+ +------+ +------+ +---+ +-------+ | stream of elements +-----> |filter+-> |sorted+-> |map+-> |collect| +--------------------+ +------+ +------+ +---+ +-------+ 以上的流程转换为 Java 代码为: List<Integer> transactionsIds = widgets.stream() .filter(b -> b.getColor() == RED) .sorted((x,y) -> x.getWeight() - y.getWeight()) .mapToInt(Widget::getWeight) .sum(); 什么是 Stream? Stream(流)是一个来自数据源的元素队列并支持聚合操作 元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算。 数据源 流的来源。 可以是集合,数组,I/O channel, 产生器generator 等。 聚合操作 类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等。 和以前的Collection操作不同, Stream操作还有两个基础的特征: Pipelining: 中间操作都会返回流对象本身。 这样多个操作可以串联成一个管道, 如同流式风格(fluent style)。 这样做可以对操作进行优化, 比如延迟执行(laziness)和短路( short-circuiting)。 内部迭代: 以前对集合遍历都是通过Iterator或者For-Each的方式, 显式的在集合外部进行迭代, 这叫做外部迭代。 Stream提供了内部迭代的方式, 通过访问者模式(Visitor)实现。 生成流 在 Java 8 中, 集合接口有两个方法来生成流: stream() − 为集合创建串行流。 parallelStream() − 为集合创建并行流。 List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl"); List<String> filtered = strings.stream().filter(string ->...
2024-04-01