Java 语言的主要特性:
Java 语言的语法与 C 语言和 C++ 语言很接近,使得大多数程序员很容易学习和使用。另一方面,Java 丢弃了 C++ 中很少使用的、很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强制类型转换。特别地,Java 语言不使用指针,而是引用。并提供了自动分配和回收内存空间,使得程序员不必为内存管理而担忧。
Java 语言提供类、接口和继承等面向对象的特性,为了简单起见,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制(关键字为 implements)。Java 语言全面支持动态绑定,而 C++语言只对虚函数使用动态绑定。总之,Java语言是一个纯的面向对象程序设计语言。
Java 语言支持 Internet 应用的开发,在基本的 Java 应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括 URL、URLConnection、Socket、ServerSocket 等。Java 的 RMI(远程方法激活)机制也是开发分布式应用的重要手段。
Java 的强类型机制、异常处理、垃圾的自动收集等是 Java 程序健壮性的重要保证。对指针的丢弃是 Java 的明智选择。Java 的安全检查机制使得 Java 更具健壮性。
Java通常被用在网络环境中,为此,Java 提供了一个安全机制以防恶意代码的攻击。除了Java 语言具有的许多安全特性以外,Java 对通过网络下载的类具有一个安全防范机制(类 ClassLoader),如分配不同的名字空间以防替代本地的同名类、字节代码检查,并提供安全管理机制(类 SecurityManager)让 Java 应用设置安全哨兵。
Java 程序(后缀为 java 的文件)在 Java 平台上被编译为体系结构中立的字节码格式(后缀为 class 的文件),然后可以在实现这个 Java 平台的任何系统中运行。这种途径适合于异构的网络环境和软件的分发。
这种可移植性来源于体系结构中立性,另外,Java 还严格规定了各个基本数据类型的长度。Java 系统本身也具有很强的可移植性,Java 编译器是用 Java 实现的,Java 的运行环境是用 ANSI C 实现的。
如前所述,Java 程序在 Java 平台上被编译为字节码格式,然后可以在实现这个 Java 平台的任何系统中运行。在运行时,Java 平台中的 Java 解释器对这些字节码进行解释执行,执行过程中需要的类在联接阶段被载入到运行环境中。
与那些解释型的高级脚本语言相比,Java 的确是高性能的。事实上,Java 的运行速度随着 JIT(Just-In-Time)编译器技术的发展越来越接近于 C++。
在 Java 语言中,线程是一种特殊的对象,它必须由 Thread 类或其子(孙)类来创建。通常有两种方法来创建线程:其一,使用型构为 Thread(Runnable) 的构造子类将一个实现了 Runnable 接口的对象包装成一个线程,其二,从 Thread 类派生出子类并重写 run 方法,使用该子类创建的对象即为线程。值得注意的是 Thread 类已经实现了 Runnable 接口,因此,任何一个线程均有它的 run 方法,而 run 方法中包含了线程所要运行的代码。线程的活动由一组方法来控制。Java 语言支持多个线程的同时执行,并提供多线程之间的同步机制(关键字为 synchronized)。
Java 语言的设计目标之一是适应于动态变化的环境。Java 程序需要的类能够动态地被载入到运行环境,也可以通过网络来载入所需要的类。这也有利于软件的升级。另外,Java 中的类有一个运行时刻的表示,能进行运行时刻的类型检查。
如:十进制的 10 在计算机内保存为二进制的 1010。
位(Bit):表示一个二进制数码 0 或 1,是计算机存储处理信息的最基本单位。
字节(Byte):一个字节由 8个位组成。它表示作为一个完整处理单位的 8 个二进制数码。
事实上,计算机内的二进制数值是以补码形式表示的。
补码:
由此可知,二进制补码数值的最高位(最左位)是符号位:该位为0,表示数值为正数;该位为1,表示数值为负数。
10 | 00000000 00000000 00000000 00001010 |
---|---|
-10 | 11111111 11111111 11111111 11110110 |
主要原因:
使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。
二进制数转换成十进制数:
按权相加:把二进制数首先写成加权系数展开式,然后按十进制加法规则求和。
例子:
原码 101101 101101 101101 = = = 1 × 2 3 1 \times 2^3 1×23 + 0 × 2 2 +0\times2^2 +0×22 + 1 × 2 1 +1\times2^1 +1×21 + 1 × 2 0 +1\times2^0 +1×20 + 0 × 2 − 1 +0\times2^{-1} +0×2−1 + 1 × 2 − 2 = +1\times2^{-2}=\, +1×2−2= 8 + 0 + 2 + 1 + 0 + 0.25 8+0+2+1+0+0.25\, 8+0+2+1+0+0.25 = 11.25 =11.25 =11.25
十进制数转换成二进制数:
注意:编程时若涉及复杂的进制运算可借助计算器中的程序员模式!
变量就是系统为程序分配的一块内存单元,用来存储各种类型的数据。由于该存储单元中的数据可以发送改变,因此得名为“变量”。
如下图:
因此,通过定义不同类型的变量,可以在内存中储存整数、小数或者字符。
按所属的数据类型划分:
按被声明的位置划分:
特别注意:类的外面不能有变量的声明
由于变量记录的数据内容大小不同,导致所需的存储单元大小不同,在 Java 语言中使用数据类型的概念加以描述。
字节是计算机信息技术用于计量存储容量的一种计量单位,作为一个单位来处理的一个二进制数字串,是构成信息的一个小单位。Java 中的字节是八位的字节,即它包含八位的二进制数。
类型 | 占用内存 | 值范围(含边界值) | 默认值 |
---|---|---|---|
整数型(int) | 4字节 | -214783648 ~ 2147483647 | 0 |
短整型(short) | 2字节 | -32768 ~ 32767 | 0 |
长整型(long) | 8字节 | -9223372036854775808L ~ 9223372036854775807L | 0 |
字节型(byte) | 1字节 | -128 ~ 127 | 0 |
浮点型(float) | 4字节 | -3.40292347E+38 ~ 3.40292347E+38 | 0.0f |
双精度浮点型(double) | 8字节 | -1.79769313486231570E+308 ~ 1.79769313486231570E+308 | 0.0d |
布尔型(boolean) | 1字节 | true 或 false | false |
字符型(char) | 2字节 | ‘\u0000 ~ u\ffff’ | ‘\u0000’ |
boolean 类型不能转换成任何其它数据类型。
自动类型转换: 容量小的类型自动转换成容量大的数据类型。
byte,short,int 不会互相转换,它们三者在计算时会转换成 int 类型。
强制类型转换:容量大的类型转换成容量小的数据类型时,要加上强制转换符:
long l = 100L;
int i = (int)l;
注意:
有可能造成精度降低或数据溢出,使用时要小心。
Java 中有一些赋予特定的含义,有专门用途的字符串称为关键字(keyword),全部都为小写。
方法用于封装一段特定的逻辑功能。方法的主要要素有:权限修饰符、方法名、参数列表和返回值。
格式:
权限修饰符 返回值类型声明 方法名称(参数列表){
方法中封装的逻辑功能;
return 返回值;
}
//返回较大的数
public static int max(int num1, int num2){
return num1 > num2 ? num1 : num2;
}
++ 运算符:
-- 运算符:
实例:
/**
* ++和--放在变量前后的区别,注意观察运算结果
*/
public class IO_test02 {
public static void main(String[] args) {
int i = 3;
System.out.println(i++);
System.out.println(i);
System.out.println("-----------------------");
int j = 3;
System.out.println(++j);
System.out.println(j);
System.out.println("-----------------------");
int k = 3;
System.out.println(k--);
System.out.println(k);
System.out.println("-----------------------");
int n = 3;
System.out.println(--n);
System.out.println(n);
}
}
关系运算符作用是比较两边的操作数,结果总是 boolean 型的。
逻辑运算符用于对 boolean 型结果的表达式进行运算,运算结果总是 boolean 型。
String s = "she "+"is “+“my girl!”,结果为"she is my girl!”
"+"除了可用于字符串相连接,也能将字符串与其它的数据类型相连成一个新的字符串。
如:String s = “你好”+1024;
结果为“你好1024”
实例:
public class IO_test01 {
public static void main(String[] args) {
String s = "she "+"is "+"my girl!";
System.out.println(s);
String s1 = "你好"+"1024";
System.out.println(s1);
}
}
X?Y:Z
X为 boolean 类型表达式,先计算 x 的值,若为 true,整个三目运算的结果为表达式y的值,否则整个运算结果为表达式 z 的值。
实例:
public class IO_test01 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num1 = sc.nextInt();
int num2 = sc.nextInt();
System.out.println(num1>num2?num1+"大":num2+"大");
}
}
在局部变量中,内部范围可以访问外部范围的变量,外部范围不能访问内部范围的变量。
实例1:
public class IO_test02 {
public static void main(String[] args) {
int a = 2,b = 3;
{
System.out.println(a+b);
}
}
}
实例2:
/**
* 变量的作用域
* 代码分为结构定义语句和功能执行语句,
* 功能执行语句必须以英文分号结尾。
*/
public class IO_test01 {
public static void main(String[] args) {
int a = 10;
int b = 20;
int c = a+b;
System.out.println(c);
say(c);
}
private static void say(int d) {
System.out.println(d);
}
}
实例:
public class T8 {
public static void main(String[] args) {
System.out.println("乘法口诀表");
for(int i=1;i<=9;i++){
for (int j=1;j<=i;j++){
System.out.print(j+"*"+i+"="+j*i+"\t");
}
System.out.println();
}
}
}