Java基本语法笔记

在一个独立的原始程序里,只能有一个 public 类,却可以有许多 non-public 类。

此外,若是在一个 Java 程序中没有一个类是 public,那么该 Java 程序的文件名就可以随意命名了。


文档注释,是以单斜线加两个星形标记( /**)开头,并以一个星形标记加单斜线( */)结束。用这种方法注释的内容会被解释成程序的正式文档,并能包含进如 javadoc之类的工具生成的文档里,用以说明该程序的层次结构及其方法。


Java 把整数常量的数据类型均视为 int 型,因此,如果在程序中使用了超过 2147483647 这个大小的常量,编译时将发生错误

要解决这个问题,只要在整数常量后面加上一个大写的“ L”即可,此举代表该常量是long 类型的整数常量。

最大值的代码是 MAX_VALUE,最小值是 MIN_VALUE。如果要取用某个类型的最大值或最小值,只要在这些代码之前,加上它们所属的类的全名即可。


\f 换页 \\ 反斜线

\b 倒退一格 \‘ 单引号

\r 归位 \" 双引号


在程序中已经定义好了数据类型的变量,若是想用另一种数据类型表示时, Java

会在下列的条件皆成立时,自动做数据类型的转换:

 1、 转换前的数据类型与转换后的类型兼容。

 2、 转换后的数据类型的表示范围比转换前的类型大


若是将一个超出该变量可表示范围的值赋值给这个变量时,这种转换称为缩小转换。由于在转换的过程中可能会丢失数据的精确度, Java 并不会自动做这些类型的转换,此时就必须要做强制性的转换。


+3 ; // 表示正 3

~a ; // 表示取 a 的补码


优先级 运算符 类 结合性

1 () 括号运算符 由左至右

1 [] 方括号运算符 由左至右

2 !、 +(正号)、 -(负号) 一元运算符 由右至左

2 ~ 位逻辑运算符 由右至左

2 ++、 -- 递增与递减运算符 由右至左

3 *、 /、 % 算术运算符 由左至右

4 +、 - 算术运算符 由左至右

5 <<、 >> 位左移、右移运算符 由左至右

6 >、 >=、 <、 <= 关系运算符 由左至右

7 ==、 != 关系运算符 由左至右

8 &(位运算符 AND) 位逻辑运算符 由左至右

9 ^(位运算符号 XOR) 位逻辑运算符 由左至右

10 |(位运算符号 OR) 位逻辑运算符 由左至右

11 && 逻辑运算符 由左至右

12 || 逻辑运算符 由左至右

13 ?: 条件运算符 由右至左

14 = 赋值运算符 由右至左


1、 占用字节较少的类型转换成占用字节较多的类型。

2、 字符类型会转换成 int 类型。

3、 int 类型会转换成 float 类型。

4、 表达式中若某个操作数的类型为 double,则另一个操作数字也会转换成 double

类型。

5、 布尔类型不能转换成其它类型。


在 switch 语句里的选择值只能是字符或是常量。


1、 第一次进入 for 循环时,为循环控制变量赋起始值。

2、 根据判断条件的内容检查是否要继续执行循环,当判断条件值为真( true)

时,继续执行循环主体内的语句;判断条件值为假( false)时,则会跳出循

环,执行其他语句。

3、 执行完循环主体内的语句后,循环控制变量会根据增减量的要求,更改循环

控制变量的值,再回到步骤 2 重新判断是否继续执行循环。


System.arrayCopy(source,0,dest,0,x):语句的意思就是:复制源数组从下标 0 开始

的 x 个元素到目标数组,从目标数组的下标 0 所对应的位置开始存取。

Arrays.sort(数组名 )为数组排序的操作

值得一提的是 Java 允许二维数组中每行的元素个数均不相同,这点与一般的程序

语言是不同的。

“匿名对象”,顾名思义,就是没有明确的声明的对象。读者也可以简单的理解

为只使用一次的对象,即没有任何一个具体的对象名称引用它。


有两种方式可用于对象间的比较,它们是“ = =”运算符与 equals()方法,“ = =”

操作符用于比较两个对象的内存地址值是否相等, equals()方法用于比较两个对象的内

容是否一致。

this 表示当前对象,而

所谓的当前对象就是指调用类中方法或属性的那个对象。

如果在程序中想用某一构造方法调用另一构造方法,可以用 this 来实现,具体的

调用形式如下:

 this() ;

在类中的所有方法

里,只有构造方法是被优先调用的,所以使用 this 调用构造方法必须也只能放

在构造方法的第一行

一个类可以使用不包含在任何方法体中的静态代码块,当类被载入时,静态代码

块被执行,且只执行一次,静态代码块经常用来进行类属性的初始化。


构造方法虽然

被私有了,但并不一定是说此类不能产生实例化对象,只是产生这个实例化对象的位

置有所变化,即只能在本类中产生实例化对象。


内部类在声明时,会破坏程序的结

构,在开发中往往不建议读者去使用。


用 static 也可以

声明内部类,用 static 声明的内部类则变成外部类,但是用 static 声明的内部类不能访

问非 static 的外部类属性。

内部类也可以通过创建对象从外部类之外被调用,只要将内部类声明为 public 即


在本书的第一部分已经提到过, Java 支持三种形式的注释。前两种是// 和/*… */。

第三种方式被称为文档注释。它以“ /**”开始,以“ */”标志结束。文档注释提供将

程序信息嵌入到程序中的功能。开发者可以使用 javadoc 工具将信息取出,然后转换

为 HTML 文件。


子类对象在实例化时会默认先去调用父类中的构造方法,之后再

调用本类中的相应构造方法。

用 super 调用父类中的构造方法,只能放在程序的第一行。


在抽象

类中声明构造方法后,在子类中 必须明确调用

如果一个类没

有使用 extends 关键字明确标识继承另外一个类,那么这个类就默认继承 Object 类。


接口里的数据成员必须初始化,且数据成员均为常量。

2、 接口里的方法必须全部声明为 abstract,也就是说,接口不能像抽象类一样保有一

般的方法,而必须全部是“抽象方法”。


接口与一般类一样,本身也具有数据成员与方法,但数据成员一定要赋初值,且

此值将不能再更改


接口是 java 实现多继承的一种机制,一个类只能继承一个父类,但如果需要一

个类继承多个抽象方法的话,就明显无法实现,所以就出现了接口的概念。一个类只

可以继承一个父类,但却可以实现多个接口。

同样的,接口的扩展(或继承)也是通过关键字 extends 来实现的。有趣的是,

一个接口可以继承多个接口

父类用其本身类实例化自己的对

象,但它并不知道谁是自己的子类,那肯定在转换的时候会出现错误


可以用 instanceof 判断一个类是否实现了某个接口,也可以用它来判断一个实

例对象是否属于一个类。


前面已经介绍过 Object 是所有类的父类,其中的 toString()方法是需要被复写的,

如果读者去查 JDK 手册,会发现在 Object 类中有一个 equals 方法,此方法用于比较

对象是否相等,而且此方法必须被复写


接口是无法直接实例化

的,因为接口中没有构造方法,但是却可以根据对象多态性的概念,通过接口的子类

对其进行实例化


异常可分为两大类: java.lang.Exception 类与 java.lang.Error 类。这两个类均继承

自 java.lang.Throwable 类。


如果在类的方法中用 throws 抛出一个异常,则在

调用它的地方就必须明确地用 try-catch 来捕捉。


jar 命令是 Java 中提供的一个非常有用的命令,可以用来对大量的类(.class 文件)

进行压缩,然后存为.jar 文件。



class 类名称 extends Thread // 从 Thread 类扩展出子类

{

修饰符 run(){ // 复写 Thread 类里的 run()方法

// 以线程处理的程序;

}

}

用start()可以启动

也可通过implements Runnable实现

在 Runnable 接口中并没有 start()方法,所以一个类实现了

Runnable 接口也必须用 Thread 类中的 start()方法来启动多线程。

Thread 类实现了 Runnable 接口,也就是说 Thread 类也是

Runnable 接口的一个子类。


一个类继承 Thread 类之后,这个类的对象无论调用

多少次 start()方法,结果都只有一个线程在运行。


new Thread(t).start();//其中t是一个实现了Runnable接口的类

这样连续调用多次之后会产生多个共享数据的线程


任何线程一般具有五种状态,即创建、就绪、运行、阻塞、终止。

允许两个 Thread 对象有相同的名字,但为了清晰,应该尽量避免这种情况的发生。

如果程序并没有为线程指定名称,则系统会自动的为线程分配一个名称


可以通过 isAlive()方法来测试线程是否已经启动而且仍然在启动。


如果某个线程对

象在启动(调用 start()方法)之前调用了 setDaemon(true)方法,这个线程就变成了后

台线程。

进程中只有后台线程运行时,进程就会结束。

join()方法用来强制某一线程运行(强制运行完后再运行后面的线程)


在 Thread 类之中可以发现有一个名为 sleep(long millis)的静态方法,此方法用于

线程的休眠。


当一个线程运行时,另一个线程可以调用对应的 Thread 对象的 interrupt()方法来

中断它。


也可以用 Thread 对象调用 isInterrupted()方法来检查每个线程的中断状态。


一旦被打上interrupt状态以后,线程执行到可中断阻塞(有些中断是不可以被中断的)

的时候,就会抛出异常并且结束当前的操作,然后重置状态。


synchronized(对象)

{

 需要同步的代码 ;

}

需要注意的是,同步监视器一般可以由任何对象充当,只要其唯一恒定就可以,

通常推荐使用可能被并发访问的共享资源充当同步监视器。


除了可以对代码块进行同步外,也可以对函数实现同步,只要在需要同步的函数

定义前加上 synchronized 关键字即可。


 wait()方法使当前线程等待,释放对该同步器的锁定。

    notify()方法唤醒该同步器上等待的单个线程,对于唤醒的选择是任意的。

    notifyAll()唤醒全部等待的线程。


控制线程生命周期的方法有很多种,如: suspend 方法、 resume 方法和 stop 方法。

虽然 stop 能够避免死锁的发生,但是也有其它的不足:如果一个线程正在操作共

享数据段,操作过程没有完成就被“ stop”了的话,将会导致数据的不完整性。


图9-11线程的生命周期


通过控制 run 方法中循环条件的方式来结束一个线程的方法是推荐读

者使用的,这也是实际中用的最多的方法。


StringBuffer 类用于内容可以改变的字符串,可以将其它各种类型的数据增加、插

入到字符串中,也可以转置字符串中原来的内容。


在实际开发中,如果需要频繁改变字符串的内容就需要考虑用 StringBuffer 类实

现,因为其内容可以改变,所以执行性能会比 String 类更高。


exit(int status)方法,提前终止虚拟机的运行。对于发生了异常情况而想终止虚拟

机的运行,传递一个非零值作为参数。


CurrentTimeMillis 方法返回自 1970 年 1 月 1 日 0 点 0 分 0 秒起至今的以毫秒为单

位的时间,这是一个 long 类型的大数值。


Runtime 类封装了 Java 命令本身的运行进程,其中的许多方法与 System 中的方法

重复。不能直接创建 Runtime 实例,但可以通过静态方法 Runtime.getRuntime 获得正

在运行的 Runtime 对象的引用。


getInputStream()方法可以得到一个输入流,客户端的 Socket 对象上的 getInputStream()

方法得到的输入流其实就是从服务器端发回的数据流。 getOutputStream()方法得到一个

输出流,客户端 Socket 对象上的 getOutputStream()方法返回的输出流就是将要发送到

服务器端的数据流。


Sockets 有两种主要的操作方式:面向连接的和无连接的。


无连接的操作使用数据报协议。一个数据报是一个独立的单元,它包含了所有的

这次投递的信息。


面向连接的操作使用 TCP 协议。一个这个模式下的 socket 必须在发送数据之前与

目的地的 socket 取得一个连接。一旦连接建立了, sockets 就可以使用一个流接口













郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。