特点
编译和解释并存。由编译器将Java源程序编译成字节码文件,然后再由Java运行系统解释执行字节码文件(解释器将字节码再翻译成二进制码运行) 。
字节码是Java虚拟机(Java Virtual Machine-JVM)的指令组。字节码最大的好处是可跨平台运行,即Java的字节码可以编写一次,到处运行。
任何一种可以运行Java字节码的软件均可看成是Java的“虚拟机” ,可以把Java的字节码看成是JVM上所运行的机器码(machine code) 。
Java应用程序(Application)
它可以在Java平台上独立运行,通常称之为Java应用程序。Java应用程序是独立完整的程序,在命令行调用独立的解释器软件即可运行。 Java应用程序的主类必须有一个定义为 public static void main(String[] args) 的主方法,这个是Java应用程序执行的入口点方法是Java应用程序的标志。
Java程序注意事项:
Java是严格区分大小写的语言。
一个程序中可以有多个类,但只能有一个类是主类。在Java应用程序中,这个主类是指包含main()方法的类。在Java小程序里,这个主类是一个继承自系统类Applet的子类。应用程序的主类不一定要求是public类,但小程序的主类一定要求是public类。主类是Java程序执行的入口点。
同一个Java程序中定义的若干类之间没有严格的逻辑关系要求,但它们通常是在一起协同工作的,每一个类都可能需要使用其他类中定义的静态属性或方法。
基本数据类型
由程序设计语言系统所定义、不可再划分的数据类型。所占
内存大小是固定的,与软硬件环境无关。在内存中存放的是数
据值本身。
- 整型: byte short int long
- 浮点型: float double
- 逻辑型: boolean
- 字符型:char
- 引用数据类型(复合数据类型)
- 在内存中存放的是指向该数据的地址,不是数据值本身。
类、数组、接口等。
标识符
用来表示变量名、类名、方法名、数组名和文件名的
有效字符序列 。 规定:
可以由字母、数字、下划线(—)、美元符号($)组合而成。
必须以字母、下划线或美元符号开头,不能以数字开头。
关键字不能当标识符使用。
区分大小写。
编码习惯:类名首字母大写,变量、方法及对象首字母小写。
常量
- 整型常量 (八进制、十六进制、十进制长整型后需要加l或L)
- 浮点型常量(单精度后加f或F,双精度后加d或D可省略)
- 逻辑型常量
- 字符型常量
- 单引号。(转义字符见教材表3.6)
- 字符串常量
- 双引号。
常量的声明
final int MAX = 10;
final float PI =3.14f;
变量
变量声明、初始化、赋值
如:
int i, j=0;
i = 8;
float k;
k = 3.6f;
Java 语言程序中可以随时定义变量,不必集中在执行
语句之前。
数值型不同类型数据的转换
自动类型转换
①转换前的数据类型与转换后的类型兼容。
②转换后的数据类型的表示范围比转换前的类型大。
条件②说明不同类型的数据进行运算时,需先转换为同一类型,然后进行运算。转换从“短”到“长”的优先关系为:byte→short→char→int→long→float→double
强制类型转换
如果要将较长的数据转换成较短的数据时(不安全),
就要进行强制类型转换。强制类型转换的格式如下:
字符串型数据与整型数据相互转换
字符串转换成数值型数据(见教材表3.7)
String MyNumber = “1234.56”;
float MyFloat = Float.parseFloat(MyNumber);
数值型数据转换成字符串
在Java语言中,字符串可用加号“+”来实现连接操
作。所以若其中某个操作数不是字符串,该操作在连
接之前会自动将其转换成字符串。所以可用加号来实
现自动的转换。
int MyInt=1234; //定义整形变量MyInt
String MyString=""+MyInt; //将整型数据转换成了字符串
由键盘输入的数据,不管是文字还是数字,Java皆视为
字符串,因此若是要由键盘输入数字则必须再经过转换。 输入字符串
import java.io.*;
public class class_name //类名称
{
public static void main(String[] args) throws IOException
{
……
String str;
InputStreamReader inp;
inp=new InputStreamReader(System.in);
BufferedReader buf;
buf=new BufferedReader(inp);
……
str=buf.readLine();
……
}
}
变形
import java.io.*;
public class class_name //类名称
{
public static void main(String[] args) throws IOException
{
……
String str;
BufferedReader buf;
buf=new BufferedReader(new InputStreamReader(System.in));
……
str=buf.readLine();
……
}
}
由键盘输入的数据,不管是文字还是数字,Java皆视为
字符串,因此若是要由键盘输入数字则必须再经过转换。
输入字符串
//appA_3.java 由键盘输入字符串
import java.io.*; //加载java.io类库里的所有类
public class App3_3
{
public static void main(String[] args) throws IOException
{
BufferedReader buf;
String str;
buf = new BufferedReader (new InputStreamReader (System.in));
System.out.print("请输入字符串;");
str = buf.readLine(); //将输入的文字指定给字符串变量str存放
System.out.println("您输入的字符串是:"+str); //输出字符串
}
}
输入数值
由于从键盘输入的数据均被视为字符串,所以从键盘上输入的数据,必须先利用表3.7中所提供的方法进行转换后,字符串的内容才会变成数值。
//App3_4.java 由键盘输入整数
import java.io.*;
public class App3_4
{
public static void main(String[] args) throws IOException
{
float num;
String str;
BufferedReader buf;
buf=new BufferedReader(new InputStreamReader(System.in));
System.out.print("请输入一个实数:");
str=buf.readLine(); //将输入的文字指定给字符串变量str存放
num= Float.parseFloat(str); //将str转换成float类型后赋给num
System.out.println("您输入的数为:"+num);
}
}
输入多个数据
//方法1:App3_5.java 由键盘输入多个数据
import java.io.*;
public class App3_5
{
public static void main(String[] args) throws IOException
{
int num1,num2;
String str1,str2;
InputStreamReader in;
in= new InputStreamReader(System.in);
BufferedReader buf;
buf=new BufferedReader(in);
System.out.print("请输入第一个数:");
str1=buf.readLine(); //将输入的内容赋值给字符串变量str1
num1=Integer.parseInt(str1); //将str1转成int类型后赋给num1
System.out.print("请输入第二个数:");
str2=buf.readLine(); //将输入的内容赋值给字符串变量str2
num2=Integer.parseInt(str2); //将str2转成int类型后赋给num2
System.out.println(num1+"*"+num2+"="+(num1*num2));
}
}
为了简化输入操作,从Java SE 5版本开始在java.util类库中新增了一个类专门用于输入操作的类Scanner,可以使用该类输入一个对象。
import java.util.*;
public class class_name //类名称
{
public static void main(String[] args)
{
Scanner reader=new Scanner(System.in);
double num;
……
num=reader.nextDouble();
……
}
}
在该结构中用创建的reader对象调用nextDouble()方法来读取用户从键盘上输入的double型数据,也可用reader对象调用下列方法,读取用户在键盘上输入的相应类型的数据:
nextByte()
nextDouble()
nextFloat()
nextInt()
nextLong()
nextShort()
next()
nextLine()。
输入多个数据
为了简化输入操作,从Java SE 5版本开始在java.util类库中新增了一个类专门用于输入操作的类Scanner,可以使用该类输入一个对象。
//方法2:App3_6.java 由键盘输入多个数据
import java.util.*; //加载java.util类库里的所有类
public class App3_6
{
public static void main(String[] args)
{
int num1;
double num2;
Scanner reader=new Scanner(System.in);
System.out.print("请输入第一个数:");
num1= reader.nextInt(); //将输入的内容做int型数据赋值给变量num1
System.out.print("请输入第二个数:");
num2= reader.nextDouble(); //将输入的内容做double型数据赋值给变量num2
System.out.println(num1+"*"+num2+"="+(num1*num2));
}
}
上例中,reader对象还可以调用nextByte()、nextFloat()、nestDouble()、nextInt()等。
next×××()被调用后,则等待用户在命令行输入数据并按回车键(或空格键、Tab键)确认。
next()和nextLine()方法表示等待用户在键盘上输入一行文本,然后返回一个String类型的数据。
输入多个数据
利用Scanner类,使用next()和nextLine()方法接收从键盘输入字符串型数据。
//App3_7.java 由键盘输入多个数据
import java.util.*; //加载java.util类库里的所有类
public class App3_7
{
public static void main(String[] args)
{
String s1,s2;
Scanner reader=new Scanner(System.in);
System.out.print("请输入第一个数:");
s1= reader.nextLine(); //将输入的内容作为字符型数据赋值给变量s1
System.out.print("请输入第二个数:");
s2= reader.next(); //按Enter键后next()方法将回车符和换行符去掉
System.out.println("输入的是"+s1+"和"+s2);
}
}
Scanner类,next()和nextLine()方法区别
next():一定要读取到有效字符后才可以结束输入,对输入有效字符之前遇到的空格键、Tab键或
Enter键等结束符,它将自动将其去掉,只有在输入有效字符之后,该方法才将其后输入的这些符号视为分隔符。
nextLine():结束符为Enter键,即返回Enter之前的所有字符。
运算符与表达式
按照运算符功能来分,基本的运算符有下面几类。
算术运算符 +、-、*、/、%、++、--
关系运算符 >、<、>=、<=、==、!=
逻辑运算符 !、&&、||、&、| 、^
位运算符 >>、<<、>>>、&、|、^、~
赋值运算符 =、扩展赋值运算符,如+=、/=等。
条件运算符 ? :
其他运算符 包括分量运算符.、下标运算符[ ]、实例运算符instanceof、内存分配运算符new、强制类型转换运算符(类型)、方法调用运算符( )等。
算术运算符
+ - * / % +(取正) -(取负) ++ --
两个整数相“/”,结果为整数。对于两个整数之间的除法和取模运算,则式子(a/b)b+(a%b)==a是恒成立的。
对取模运算符“%”来说,其操作数可以为浮点数。即a % b与a-((int)(a/b)b)的语义相同,这表示a % b的结果是除完后剩下的浮点数部分。如37.2%10=7.2。(默认双精度)
值得注意的是Java语言对加运算符进行了扩展,使它能够进行字符串的连接,如"abc"+"de",得到字符串"abcde"。
关系运算符
、<、>=、<=、==、!=
不能在浮点数之间作“==”的比较。
逻辑运算符
!、&&、||、&、|、^(异或)
逻辑运算和关系运算的关系非常紧密,关系运算的结果为布尔型,逻辑运算的操作数与运算结果都是布尔型。
简洁运算(&&、||)与非简洁运算(&、|)的区别在于:非简洁运算在必须计算完左右两个表达式之后,才取结果值;而简洁运算可能只计算左边的表达式而不计算右边的表达式,即对于&&,只要左边表达式为false,就不计算右边表达式,则整个表达式为false;对于||,只要左边表达式为true,就不计算右边表达式,则整个表达式为true。
位运算符和赋值运算符
位运算符: >>、<<、>>>、&、|、^、~
赋值运算符: =、扩展赋值运算符(+=等)
自动类型转换
右结合性
条件运算符和字符串运算符
条件运算符:表达式1 ? 表达式2 :表达式3
字符串运算符
字符串运算符“+”是以String为对象进行的操作。运算符“+”完成字符串连接操作,如果必要,则系统自动把操作数转换为String型。
float a=100.0; //定义变量a为浮点型
print(“The value of a is”+a+“\n”); //系统自动将a转换成字符串
String s1+=a;//s1=s1+a,若a非String型,自动转换为String型。
数组和字符串
数组的概念
相同数据类型的元素按一定顺序排列的集合。Java中,数组元素可以为简单数据类型,也可以为对象。
Java语言内存分配问题
栈内存:定义的基本类型的变量和对象的引用变量,超出作用域将自动释放。
堆内存:存放由new运算符创建的对象和数组。由Java虚拟机的自动垃圾回收器来管理。
Java语言内存分配问题(续)
引用变量:为数组或对象起的一个名称。在堆中创建一个数组或对象后,还可在栈中定义一个引用变量存放该数组或对象在堆内存中的首地址(对象的句柄),以后就可在程序中使用栈的引用变量来访问堆中的数组或对象。
数组和对象在没有引用变量指向它时,就会变成垃圾,不被使用,但占内存,在随后不确定的时间释放。
数组的主要特点
数组是相同数据类型的元素的集合;
数组中的各元素是有先后顺序的,它们在内存中按照这个先后顺序连续存放在一起;
数组元素用整个数组的名字和它自己在数组中的顺序位置来表示。例如,a[0]表示名字为a的数组中的第一个元素,a[1]代表数组a的第二个元素,依次类推。
一维数组的定义
使用Java语言的数组,一般需经过三个步骤:一是声明数组,二是创建空间,三是创建数组元素并赋值。前两个步骤的语法如下:
数据类型[ ] 数组名; //声明一维数组
数组名=new 数据类型[个数];//动态分配内存给数组
或者
数据类型[ ] 数组名= new 数据类型[个数];
例如:
int[ ] x; //声明名称为x的int型数组,未分配内存给数组
x = new int[10]; //x中包含有10个元素,并分配空间
int[] x = new int[10]; //声明数组并动态分配内存
一维数组的定义
用户也可以改变x的值,让它指向另外一个数组对象,或者不指向任何数组对象(如x=null; )。
定义时与C/C++区别
Java定义数组也可为”数据类型 数组名[](如:int x[])” ,但Java中并不为数组元素分配内存,因此[]中不给数组长度。
动态内存分配说明
用new分配内存的同时,数组的每个元素都会自动赋默
认值,整型为0,实数为0.0,布尔型为false,引用型为
null。
一维数组元素的访问
要想使用数组里的元素,可利用数组名和下标来实现。
数组元素的引用方式为: 数组名[下标]
与C/C++不同的是,Java对数组元素要进行越界检查。
对于每个数组都有一个属性length指明它的长度,如x.length指出数组x所包含的元素个数。
一维数组的初始化及应用
若在声明数组时进行赋值即初始化称为静态内存分配。
数据类型[ ] 数组名={初值0,初值1,…,初值n};
如:
int[] a = {1,2,3,4,5};
注意
在Java程序中声明数组时,无论用何种方式定义数组,
都不能指定其长度。
foreach的语句:不用下标就可遍历整个数组。
foreach语句需提供元素类型、循环变量的名字(用于存储连续的元素)和用于从中检索元素的数组。
语法:
for (type element : array)
{
System.out.println(element);
……
}
二维数组(Java中无真正的多维数组,只是数组的数组)
声明和内存分配:
数据类型[ ] [ ] 数组名;
数组名 = new 数据类型 [行数] [列数];
数据类型[ ] [ ] 数组名= new 数据类型 [行数][列数];
分配内存时,必须指明行和列的个数
二维数组定义的含义
Java中的二维数组看作是由多个一维数组构成。
例如: int[][] x; 表示定义了一个数组引用变量x,第一个元素为x[0],最后一个为x[n-1],其长度不确定。
x = new int [3][]; 表示数组x有三个元素,每个元素都是int[]类型的一维数组,分别为int x[0][]、int[] x[1]、
int[] x[2]。
给x[0]、x[1]、x[2]赋值(它们的长度可以不一样),当它们指向真正的数组对象,才可以引用数组中的元素。
x[0]=new int[3]; x[1]=new int[2];
求二维数组的维数
计算某数组的行数:数组名.length
计算某数组中某行元素的个数:数组名[下标].length
如:
x .length; //计算数组x的行数
x[0].length; //计算数组x的第1行元素的个数
x[2].length; //计算数组x的第3行元素的个数
二维数组申请内存方式(必须指定高层维数):
int[][] MyArray = new int [10][];
int[][] MyArray = new int [10][3];
二维数组赋初值
格式:
数据类型[][] 数组名 = {{第1行初值}, …{第n+1行初值}};
例如:
int[][] a = {{11,22,33,44}, {66,77,88,99}};
注意:声明多维数组并初始化时不能指定其长度,否则出错。
字符串
用一对双引号“ ”括起来的字符序列。
Java语言中,字符串常量或变量均用类实现。
字符串变量的创建
格式一:
String 变量名;
变量名 = new String("字符串");
如:
String s; //声明字符串型引用变量s,此时s的值为null
s=new String(“Hello”); //在堆内存中分配空间,并将s指向该字符串首地址