Java 是由Sun Microsystems公司于1995年5月推出的高级程序设计语言。
Java可运行于多个平台,如Windows, Mac OS,及其他多种UNIX版本的系统。
本教程通过简单的实例将让大家更好的了解JAVA编程语言。
Java 在线工具
JDK 1.6 在线中文手册
以下我们通过一个简单的实例来展示 Java 编程,创建文件 HelloWorld.java(文件名需与类名一致) , 代码如下:
public class HelloWorld { public static void main ( String [ ] args ) { System . out . println ( “ Hello World “ ) ; } }
运行实例 »
注: String args[] 与 String[] args 都可以执行,但推荐使用 String[] args ,这样可以避免歧义和误读。
运行以上实例,输出结果如下:
$ javac HelloWorld.java $ java HelloWorld Hello World
以上我们使用了两个命令 javac 和 java 。
javac后面跟着的是java文件的文件名,例如 HelloWorld.java。 该命令用于将 java 源文件编译为 class 字节码文件,如: javac HelloWorld.java 。
运行javac命令后,如果成功编译没有错误的话,会出现一个 HelloWorld.class 的文件。
java后面跟着的是java文件中的类名,例如 HelloWorld 就是类名,如: java HelloWorld。
注意:java命令后面不要加.class。
Gif 图演示:
———–
Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计语言和Java平台的总称。由James Gosling和同事们共同研发,并在1995年正式推出。
Java分为三个体系:
2005年6月,JavaOne大会召开,SUN公司公开Java SE 6。此时,Java的各种版本已经更名以取消其中的数字”2″:J2EE更名为Java EE, J2SE更名为Java SE,J2ME更名为Java ME。
Java语言尽量保证系统内存在1G以上,其他工具如下所示:
安装好以上的工具后,我们就可以输出Java的第一个程序”Hello World!”
public class HelloWorld { public static void main ( String [ ] args ) { System . out . println ( “ Hello World “ ) ; } }
在下一章节我们将介绍如何配置java开发环境。
——
在本章节中我们将为大家介绍如何搭建Java开发环境。
首先我们需要下载java开发工具包JDK,下载地址: http://www.oracle.com/technetwork/java/javase/downloads/index.html ,点击如下下载按钮:
在下载页面中你需要选择接受许可,并根据自己的系统选择对应的版本,本文以 Window 64位系统为例:
下载后JDK的安装根据提示进行,还有安装JDK的时候也会安装JRE,一并安装就可以了。
安装JDK,安装过程中可以自定义安装目录等信息,例如我们选择安装目录为 C:/Program Files (x86)/Java/jdk1.8.0_91 。
1.安装完成后,右击”我的电脑”,点击”属性”,选择”高级系统设置”;
2.选择”高级”选项卡,点击”环境变量”;
然后就会出现如下图所示的画面:
在”系统变量”中设置3项属性,JAVA_HOME,PATH,CLASSPATH(大小写无所谓),若已存在则点击”编辑”,不存在则点击”新建”。
变量设置参数如下:
注意:在 Windows10 中,Path 变量里是分条显示的,我们需要将 %JAVA_HOME%/bin;%JAVA_HOME%/jre/bin; 分开添加,否则无法识别:
%JAVA_HOME%/bin; %JAVA_HOME%/jre/bin;
更多内容可参考: Windows 10 配置Java 环境变量
这是 Java 的环境配置,配置完成后,你可以启动 Eclipse 来编写代码,它会自动完成java环境的配置。
注意:如果使用1.5以上版本的JDK,不用设置CLASSPATH环境变量,也可以正常编译和运行Java程序。
1、”开始”->”运行”,键入”cmd”;
2、键入命令: java -version 、 java 、 javac 几个命令,出现以下信息,说明环境变量配置成功;
环境变量PATH应该设定为指向Java二进制文件安装的位置。如果设置遇到困难,请参考shell文档。
例如,假设你使用bash作为shell,你可以把下面的内容添加到你的 .bashrc文件结尾: export PATH=/path/to/java:$PATH
正所谓工欲善其事必先利其器,我们在开发java语言过程中同样需要一款不错的开发工具,目前市场上的IDE很多,本文为大家推荐以下下几款java开发工具:
选择 Eclipse IDE for Java Developers :
视频演示如下所示:
HelloWorld.java 文件代码:
public class HelloWorld { public static void main ( String [ ] args ) { System . out . println ( “ Hello World “ ) ; } }
Java 是一种跨平台的编程语言,想要让你的计算机能够运行 Java 程序那么就需要安装 JRE,而想要开发 Java 程序,那么就需要安装 JDK。这对新手来说可能有些复杂、安装配置的过程中可能会遇到一些问题。对于老手来说,有些时候可能会面临在一台陌生的(配置没有 Java 环境)计算机下临时开发、调试代码。因此,这里推荐基于腾讯云主机的在线云端开发工具 Cloud Studio 来快速开始你的 Java 项目。
"PHP + Python + Java 三种语言环境"
Tips:从终端中输入命令可以看出 Cloud Studio 为我们集成了 Ubuntu16.04 + java1.8 的开发环境:
有任何疑问,可以查阅 帮助文档 。
现在 CODING 正在举办一场基于 Cloud Studio 工作空间的【我最喜爱的 Cloud Studio 插件评选大赛】。进入活动官网: https://studio.qcloud.coding.net/campaign/favorite-plugins/index ,了解更多活动信息。
————
一个Java程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作。下面简要介绍下类、对象、方法和实例变量的概念。
下面看一个简单的Java程序,它将打印字符串 Hello World
public class HelloWorld { /* 第一个Java程序 * 它将打印字符串 Hello World */ public static void main ( String [ ] args ) { System . out . println ( “ Hello World “ ) ; // 打印 Hello World } }
运行实例 »
下面将逐步介绍如何保存、编译以及运行这个程序:
你将会在窗口看到 Hello World
C : > javac HelloWorld.java C : > java HelloWorld Hello World
Gif 图演示:
编写Java程序时,应注意以下几点:
Java所有的组成部分都需要名字。类名、变量名以及方法名都被称为标识符。
关于Java标识符,有以下几点需要注意:
像其他语言一样,Java可以使用修饰符来修饰类中方法和属性。主要有两类修饰符:
在后面的章节中我们会深入讨论Java修饰符。
Java中主要有如下几种类型的变量
数组是储存在堆上的对象,可以保存多个同类型变量。在后面的章节中,我们将会学到如何声明、构造以及初始化一个数组。
Java 5.0引入了枚举,枚举限制变量只能是预先设定好的值。使用枚举可以减少代码中的bug。
例如,我们为果汁店设计一个程序,它将限制果汁为小杯、中杯、大杯。这就意味着它不允许顾客点除了这三种尺寸外的果汁。
class FreshJuice { enum FreshJuiceSize { SMALL , MEDIUM , LARGE } FreshJuiceSize size ; } public class FreshJuiceTest { public static void main ( String [ ] args ) { FreshJuice juice = new FreshJuice ( ) ; juice . size = FreshJuice . FreshJuiceSize . MEDIUM ; } }
注意:枚举可以单独声明或者声明在类里面。方法、变量、构造函数也可以在枚举中定义。
下面列出了Java 关键字。这些保留字不能用于常量、变量、和任何标识符的名称。
类别 | 关键字 | 说明 |
---|---|---|
访问控制 | private | 私有的 |
protected | 受保护的 | |
public | 公共的 | |
类、方法和变量修饰符 | abstract | 声明抽象 |
class | 类 | |
extends | 扩充,继承 | |
final | 最终值,不可改变的 | |
implements | 实现(接口) | |
interface | 接口 | |
native | 本地,原生方法(非Java实现) | |
new | 新,创建 | |
static | 静态 | |
strictfp | 严格,精准 | |
synchronized | 线程,同步 | |
transient | 短暂 | |
volatile | 易失 | |
程序控制语句 | break | 跳出循环 |
case | 定义一个值以供switch选择 | |
continue | 继续 | |
default | 默认 | |
do | 运行 | |
else | 否则 | |
for | 循环 | |
if | 如果 | |
instanceof | 实例 | |
return | 返回 | |
switch | 根据值选择执行 | |
while | 循环 | |
错误处理 | assert | 断言表达式是否为真 |
catch | 捕捉异常 | |
finally | 有没有异常都执行 | |
throw | 抛出一个异常对象 | |
throws | 声明一个异常可能被抛出 | |
try | 捕获异常 | |
包相关 | import | 引入 |
package | 包 | |
基本类型 | boolean | 布尔型 |
byte | 字节型 | |
char | 字符型 | |
double | 双精度浮点 | |
float | 单精度浮点 | |
int | 整型 | |
long | 长整型 | |
short | 短整型 | |
变量引用 | super | 父类,超类 |
this | 本类 | |
void | 无返回值 | |
保留关键字 | goto | 是关键字,但不能使用 |
const | 是关键字,但不能使用 | |
null | 空 |
类似于C/C++,Java也支持单行以及多行注释。注释中的字符将被Java编译器忽略。
public class HelloWorld { /* 这是第一个Java程序 *它将打印Hello World * 这是一个多行注释的示例 */ public static void main ( String [ ] args ) { // 这是单行注释的示例 /* 这个也是单行注释的示例 */ System . out . println ( “ Hello World “ ) ; } }
空白行,或者有注释的行,Java编译器都会忽略掉。
在Java中,一个类可以由其他类派生。如果你要创建一个类,而且已经存在一个类具有你所需要的属性或方法,那么你可以将新创建的类继承该类。
利用继承的方法,可以重用已存在类的方法和属性,而不用重写这些代码。被继承的类称为超类(super class),派生类称为子类(subclass)。
在Java中,接口可理解为对象间相互通信的协议。接口在继承中扮演着很重要的角色。
接口只定义派生要用到的方法,但是方法的具体实现完全取决于派生类。
如下图所示:
下一节介绍Java编程中的类和对象。之后你将会对Java中的类和对象有更清楚的认识。
———–
Java作为一种面向对象语言。支持以下基本概念:
本节我们重点研究对象和类的概念。
下图中男孩女孩为类,而具体的每个人为该类的对象:
现在让我们深入了解什么是对象。看看周围真实的世界,会发现身边有很多对象,车,狗,人等等。所有这些对象都有自己的状态和行为。
拿一条狗来举例,它的状态有:名字、品种、颜色,行为有:叫、摇尾巴和跑。
对比现实对象和软件对象,它们之间十分相似。
软件对象也有状态和行为。软件对象的状态就是属性,行为通过方法体现。
在软件开发中,方法操作对象内部状态的改变,对象的相互调用也是通过方法来完成。
类可以看成是创建Java对象的模板。
通过下面一个简单的类来理解下Java中类的定义:
public class Dog { String breed ; int age ; String color ; void barking ( ) { } void hungry ( ) { } void sleeping ( ) { } }
一个类可以包含以下类型变量:
一个类可以拥有多个方法,在上面的例子中:barking()、hungry()和sleeping()都是Dog类的方法。
每个类都有构造方法。如果没有显式地为类定义构造方法,Java编译器将会为该类提供一个默认构造方法。
在创建一个对象的时候,至少要调用一个构造方法。构造方法的名称必须与类同名,一个类可以有多个构造方法。
下面是一个构造方法示例:
public class Puppy { public Puppy ( ) { } public Puppy ( String name ) { // 这个构造器仅有一个参数:name } }
对象是根据类创建的。在Java中,使用关键字new来创建一个新的对象。创建对象需要以下三步:
下面是一个创建对象的例子:
public class Puppy { public Puppy ( String name ) { // 这个构造器仅有一个参数:name System . out . println ( “ 小狗的名字是 : “ + name ) ; } public static void main ( String [ ] args ) { // 下面的语句将创建一个Puppy对象 Puppy myPuppy = new Puppy ( “ tommy “ ) ; } }
编译并运行上面的程序,会打印出下面的结果:
小狗的名字是 : tommy
通过已创建的对象来访问成员变量和成员方法,如下所示:
/* 实例化对象 */ ObjectReference = new Constructor ( ) ; /* 访问类中的变量 */ ObjectReference . variableName ; /* 访问类中的方法 */ ObjectReference . methodName ( ) ;
下面的例子展示如何访问实例变量和调用成员方法:
public class Puppy { int puppyAge ; public Puppy ( String name ) { // 这个构造器仅有一个参数:name System . out . println ( “ 小狗的名字是 : “ + name ) ; } public void setAge ( int age ) { puppyAge = age ; } public int getAge ( ) { System . out . println ( “ 小狗的年龄为 : “ + puppyAge ) ; return puppyAge ; } public static void main ( String [ ] args ) { /* 创建对象 */ Puppy myPuppy = new Puppy ( “ tommy “ ) ; /* 通过方法来设定age */ myPuppy . setAge ( 2 ) ; /* 调用另一个方法获取age */ myPuppy . getAge ( ) ; /* 你也可以像下面这样访问成员变量 */ System . out . println ( “ 变量值 : “ + myPuppy . puppyAge ) ; } }
编译并运行上面的程序,产生如下结果:
小狗的名字是 : tommy 小狗的年龄为 : 2 变量值 : 2
在本节的最后部分,我们将学习源文件的声明规则。当在一个源文件中定义多个类,并且还有import语句和package语句时,要特别注意这些规则。
类有若干种访问级别,并且类也分不同的类型:抽象类和final类等。这些将在访问控制章节介绍。
除了上面提到的几种类型,Java还有一些特殊的类,如:内部类、匿名类。
包主要用来对类和接口进行分类。当开发Java程序时,可能编写成百上千的类,因此很有必要对类和接口进行分类。
在Java中,如果给出一个完整的限定名,包括包名、类名,那么Java编译器就可以很容易地定位到源代码或者类。Import语句就是用来提供一个合理的路径,使得编译器可以找到某个类。
例如,下面的命令行将会命令编译器载入java_installation/java/io路径下的所有类
import java.io.*;
在该例子中,我们创建两个类: Employee 和 EmployeeTest 。
首先打开文本编辑器,把下面的代码粘贴进去。注意将文件保存为 Employee.java。
Employee类有四个成员变量:name、age、designation和salary。该类显式声明了一个构造方法,该方法只有一个参数。
import java . io .*; public class Employee { String name ; int age ; String designation ; double salary ; // Employee 类的构造器 public Employee ( String name ) { this . name = name ; } // 设置age的值 public void empAge ( int empAge ) { age = empAge ; } /* 设置designation的值 */ public void empDesignation ( String empDesig ) { designation = empDesig ; } /* 设置salary的值 */ public void empSalary ( double empSalary ) { salary = empSalary ; } /* 打印信息 */ public void printEmployee ( ) { System . out . println ( “ 名字: “ + name ) ; System . out . println ( “ 年龄: “ + age ) ; System . out . println ( “ 职位: “ + designation ) ; System . out . println ( “ 薪水: “ + salary ) ; } }
程序都是从main方法开始执行。为了能运行这个程序,必须包含main方法并且创建一个实例对象。
下面给出EmployeeTest类,该类实例化2个 Employee 类的实例,并调用方法设置变量的值。
将下面的代码保存在 EmployeeTest.java文件中。
import java . io .*; public class EmployeeTest { public static void main ( String [ ] args ) { /* 使用构造器创建两个对象 */ Employee empOne = new Employee ( “ RUNOOB1 “ ) ; Employee empTwo = new Employee ( “ RUNOOB2 “ ) ; // 调用这两个对象的成员方法 empOne . empAge ( 26 ) ; empOne . empDesignation ( “ 高级程序员 “ ) ; empOne . empSalary ( 1000 ) ; empOne . printEmployee ( ) ; empTwo . empAge ( 21 ) ; empTwo . empDesignation ( “ 菜鸟程序员 “ ) ; empTwo . empSalary ( 500 ) ; empTwo . printEmployee ( ) ; } }
编译这两个文件并且运行 EmployeeTest 类,可以看到如下结果:
$ javac EmployeeTest.java $ java EmployeeTest 名字:RUNOOB1 年龄:26 职位:高级程序员 薪水:1000.0 名字:RUNOOB2 年龄:21 职位:菜鸟程序员 薪水:500.0 ------
变量就是申请内存来存储值。也就是说,当创建变量的时候,需要在内存中申请空间。
内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来储存该类型数据。
因此,通过定义不同类型的变量,可以在内存中储存整数、小数或者字符。
Java 的两大数据类型:
Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。
对于数值类型的基本类型的取值范围,我们无需强制去记忆,因为它们的值都已经以常量的形式定义在对应的包装类中了。请看下面的例子:
public class PrimitiveTypeTest { public static void main ( String [ ] args ) { // byte System . out . println ( “ 基本类型:byte 二进制位数: “ + Byte . SIZE ) ; System . out . println ( “ 包装类:java.lang.Byte “ ) ; System . out . println ( “ 最小值:Byte.MIN_VALUE= “ + Byte . MIN_VALUE ) ; System . out . println ( “ 最大值:Byte.MAX_VALUE= “ + Byte . MAX_VALUE ) ; System . out . println ( ) ; // short System . out . println ( “ 基本类型:short 二进制位数: “ + Short . SIZE ) ; System . out . println ( “ 包装类:java.lang.Short “ ) ; System . out . println ( “ 最小值:Short.MIN_VALUE= “ + Short . MIN_VALUE ) ; System . out . println ( “ 最大值:Short.MAX_VALUE= “ + Short . MAX_VALUE ) ; System . out . println ( ) ; // int System . out . println ( “ 基本类型:int 二进制位数: “ + Integer . SIZE ) ; System . out . println ( “ 包装类:java.lang.Integer “ ) ; System . out . println ( “ 最小值:Integer.MIN_VALUE= “ + Integer . MIN_VALUE ) ; System . out . println ( “ 最大值:Integer.MAX_VALUE= “ + Integer . MAX_VALUE ) ; System . out . println ( ) ; // long System . out . println ( “ 基本类型:long 二进制位数: “ + Long . SIZE ) ; System . out . println ( “ 包装类:java.lang.Long “ ) ; System . out . println ( “ 最小值:Long.MIN_VALUE= “ + Long . MIN_VALUE ) ; System . out . println ( “ 最大值:Long.MAX_VALUE= “ + Long . MAX_VALUE ) ; System . out . println ( ) ; // float System . out . println ( “ 基本类型:float 二进制位数: “ + Float . SIZE ) ; System . out . println ( “ 包装类:java.lang.Float “ ) ; System . out . println ( “ 最小值:Float.MIN_VALUE= “ + Float . MIN_VALUE ) ; System . out . println ( “ 最大值:Float.MAX_VALUE= “ + Float . MAX_VALUE ) ; System . out . println ( ) ; // double System . out . println ( “ 基本类型:double 二进制位数: “ + Double . SIZE ) ; System . out . println ( “ 包装类:java.lang.Double “ ) ; System . out . println ( “ 最小值:Double.MIN_VALUE= “ + Double . MIN_VALUE ) ; System . out . println ( “ 最大值:Double.MAX_VALUE= “ + Double . MAX_VALUE ) ; System . out . println ( ) ; // char System . out . println ( “ 基本类型:char 二进制位数: “ + Character . SIZE ) ; System . out . println ( “ 包装类:java.lang.Character “ ) ; // 以数值形式而不是字符形式将Character.MIN_VALUE输出到控制台 System . out . println ( “ 最小值:Character.MIN_VALUE= “ + ( int ) Character . MIN_VALUE ) ; // 以数值形式而不是字符形式将Character.MAX_VALUE输出到控制台 System . out . println ( “ 最大值:Character.MAX_VALUE= “ + ( int ) Character . MAX_VALUE ) ; } }
运行实例 »
编译以上代码输出结果如下所示:
基本类型:byte 二进制位数:8 包装类:java.lang.Byte 最小值:Byte.MIN_VALUE=-128 最大值:Byte.MAX_VALUE=127 基本类型:short 二进制位数:16 包装类:java.lang.Short 最小值:Short.MIN_VALUE=-32768 最大值:Short.MAX_VALUE=32767 基本类型:int 二进制位数:32 包装类:java.lang.Integer 最小值:Integer.MIN_VALUE=-2147483648 最大值:Integer.MAX_VALUE=2147483647 基本类型:long 二进制位数:64 包装类:java.lang.Long 最小值:Long.MIN_VALUE=-9223372036854775808 最大值:Long.MAX_VALUE=9223372036854775807 基本类型:float 二进制位数:32 包装类:java.lang.Float 最小值:Float.MIN_VALUE=1.4E-45 最大值:Float.MAX_VALUE=3.4028235E38 基本类型:double 二进制位数:64 包装类:java.lang.Double 最小值:Double.MIN_VALUE=4.9E-324 最大值:Double.MAX_VALUE=1.7976931348623157E308 基本类型:char 二进制位数:16 包装类:java.lang.Character 最小值:Character.MIN_VALUE=0 最大值:Character.MAX_VALUE=65535
Float和Double的最小值和最大值都是以科学记数法的形式输出的,结尾的”E+数字”表示E之前的数字要乘以10的多少次方。比如3.14E3就是3.14 × 10 3 =3140,3.14E-3 就是 3.14 x 10 -3 =0.00314。
实际上,JAVA中还存在另外一种基本类型void,它也有对应的包装类 java.lang.Void,不过我们无法直接对它们进行操作。
常量在程序运行时是不能被修改的。
在 Java 中使用 final 关键字来修饰常量,声明方式和变量类似:
final double PI = 3.1415927;
虽然常量名也可以用小写,但为了便于识别,通常使用大写字母表示常量。
字面量可以赋给任何内置类型的变量。例如:
byte a = 68; char a = 'A'
byte、int、long、和short都可以用十进制、16进制以及8进制的方式来表示。
当使用常量的时候,前缀 0 表示 8 进制,而前缀 0x 代表 16 进制, 例如:
int decimal = 100; int octal = 0144; int hexa = 0x64;
和其他语言一样,Java的字符串常量也是包含在两个引号之间的字符序列。下面是字符串型字面量的例子:
"Hello World" "two/nlines" "/"This is in quotes/""
字符串常量和字符常量都可以包含任何Unicode字符。例如:
char a = '/u0001'; String a = "/u0001";
Java语言支持一些特殊的转义字符序列。
符号 | 字符含义 |
---|---|
/n | 换行 (0x0a) |
/r | 回车 (0x0d) |
/f | 换页符(0x0c) |
/b | 退格 (0x08) |
/0 | 空字符 (0x20) |
/s | 字符串 |
/t | 制表符 |
/” | 双引号 |
/’ | 单引号 |
// | 反斜杠 |
/ddd | 八进制字符 (ddd) |
/uxxxx | 16进制Unicode字符 (xxxx) |
整型、实型(常量)、字符型数据可以混合运算。运算中,不同类型的数据先转化为同一类型,然后进行运算。
转换从低级到高级。
低 ------------------------------------> 高 byte,short,char—> int —> long—> float —> double
数据类型转换必须满足如下规则:
4. 转换过程中可能导致溢出或损失精度,例如:
int i =128; byte b = (byte)i;
因为 byte 类型是 8 位,最大值为127,所以当 int 强制转换为 byte 类型时,值 128 时候就会导致溢出。
(int)23.7 == 23; (int)-45.89f == -45
必须满足转换前的数据类型的位数要低于转换后的数据类型,例如: short数据类型的位数为16位,就可以自动转换位数为32的int类型,同样float数据类型的位数为32,可以自动转换为64位的double类型。
public class ZiDongLeiZhuan { public static void main ( String [ ] args ) { char c1 = ‘ a ‘ ; // 定义一个char类型 int i1 = c1 ; // char自动类型转换为int System . out . println ( “ char自动类型转换为int后的值等于 “ + i1 ) ; char c2 = ‘ A ‘ ; // 定义一个char类型 int i2 = c2 + 1 ; // char 类型和 int 类型计算 System . out . println ( “ char类型和int计算后的值等于 “ + i2 ) ; } }
运行结果为:
char自动类型转换为int后的值等于97 char类型和int计算后的值等于66
解析:c1 的值为字符 a ,查 ASCII 码表可知对应的 int 类型值为 97, A 对应值为 65,所以 i2=65+1=66 。
2. 格式:(type)value type是要强制类型转换后的数据类型 实例:
public class QiangZhiZhuanHuan { public static void main ( String [ ] args ) { int i1 = 123 ; byte b = ( byte ) i1 ; // 强制类型转换为byte System . out . println ( “ int强制类型转换为byte后的值等于 “ + b ) ; } }
运行结果:
int强制类型转换为byte后的值等于123
这一节讲解了 Java 的基本数据类型。下一节将探讨不同的变量类型以及它们的用法。