本篇文章将作为编程语言 JAVA 的学习笔记,供以后查阅与复习使用。

JAVA 学习笔记参考自 菜鸟 JAVA 教程

本学习笔记以 查询和复习 为主要功能,文章内容应 短小精悍

Java 主要特性

查看Java 主要特性

关于 Java 特性的介绍的文字可能比较多 emm。。。主要因为我是照搬的 ,不过只需要简单了解,但需要特别注意的是 Java 与 C++的一个重要区别为 Java 不使用指针而是引用,这对后面理解 Java 程序有很大的帮助。

  • Java 语言是简单的:
    Java 语言的语法与 C 语言和 C++ 语言很接近,使得大多数程序员很容易学习和使用。另一方面,Java 丢弃了 C++ 中很少使用的、很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强制类型转换。特别地,Java 语言不使用指针,而是引用。并提供了自动分配和回收内存空间,使得程序员不必为内存管理而担忧。
  • Java 语言是面向对象的:
    Java 语言提供类、接口和继承等面向对象的特性,为了简单起见,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制(关键字为 implements)。Java 语言全面支持动态绑定,而 C++语言只对虚函数使用动态绑定。总之,Java 语言是一个纯的面向对象程序设计语言。
  • Java 语言是分布式的:
    Java 语言支持 Internet 应用的开发,在基本的 Java 应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括 URL、URLConnection、Socket、ServerSocket 等。Java 的 RMI(远程方法激活)机制也是开发分布式应用的重要手段。
  • Java 语言是健壮的:
    Java 的强类型机制、异常处理、垃圾的自动收集等是 Java 程序健壮性的重要保证。对指针的丢弃是 Java 的明智选择。Java 的安全检查机制使得 Java 更具健壮性。
  • Java 语言是安全的:
    Java 通常被用在网络环境中,为此,Java 提供了一个安全机制以防恶意代码的攻击。除了 Java 语言具有的许多安全特性以外,Java 对通过网络下载的类具有一个安全防范机制(类 ClassLoader),如分配不同的名字空间以防替代本地的同名类、字节代码检查,并提供安全管理机制(类 SecurityManager)让 Java 应用设置安全哨兵。
  • Java 语言是体系结构中立的:
    Java 程序(后缀为 java 的文件)在 Java 平台上被编译为体系结构中立的字节码格式(后缀为 class 的文件),然后可以在实现这个 Java 平台的任何系统中运行。这种途径适合于异构的网络环境和软件的分发。
  • Java 语言是可移植的:
    这种可移植性来源于体系结构中立性,另外,Java 还严格规定了各个基本数据类型的长度。Java 系统本身也具有很强的可移植性,Java 编译器是用 Java 实现的,Java 的运行环境是用 ANSI C 实现的。
  • Java 语言是解释型的:
    如前所述,Java 程序在 Java 平台上被编译为字节码格式,然后可以在实现这个 Java 平台的任何系统中运行。在运行时,Java 平台中的 Java 解释器对这些字节码进行解释执行,执行过程中需要的类在联接阶段被载入到运行环境中。
  • Java 是高性能的:
    与那些解释型的高级脚本语言相比,Java 的确是高性能的。事实上,Java 的运行速度随着 JIT(Just-In-Time)编译器技术的发展越来越接近于 C++。
  • Java 语言是多线程的:
    在 Java 语言中,线程是一种特殊的对象,它必须由 Thread 类或其子(孙)类来创建。通常有两种方法来创建线程:其一,使用型构为 Thread(Runnable) 的构造子类将一个实现了 Runnable 接口的对象包装成一个线程,其二,从 Thread 类派生出子类并重写 run 方法,使用该子类创建的对象即为线程。值得注意的是 Thread 类已经实现了 Runnable 接口,因此,任何一个线程均有它的 run 方法,而 run 方法中包含了线程所要运行的代码。线程的活动由一组方法来控制。Java 语言支持多个线程的同时执行,并提供多线程之间的同步机制(关键字为 synchronized)。
  • Java 语言是动态的:
    Java 语言的设计目标之一是适应于动态变化的环境。Java 程序需要的类能够动态地被载入到运行环境,也可以通过网络来载入所需要的类。这也有利于软件的升级。另外,Java 中的类有一个运行时刻的表示,能进行运行时刻的类型检查。

Java 基础语法

查看Java 基础语法

此处对 Java 的基础语法只作简单的介绍,以便对 Java 语法有一个整体的印象,Java 语法的详细讲解在后面相应部分。

一个 Java 程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作。下面简要介绍下类、对象、方法和实例变量的概念。

  • 对象:对象是类的一个实例,有状态和行为。例如狗是一个类,而小狗包弟是类的一个实例。
  • 类:类是一个模板,它描述一类对象的行为和状态。
  • 方法:方法就是行为,一个类可以有很多方法。逻辑运算、数据修改以及所有动作都是在方法中完成的。
  • 实例变量:每个对象都有独特的实例变量,对象的状态由这些实例变量的值决定。

第一个 Java 程序,分析主函数的构成

1
2
3
4
5
6
7
8
public class HelloWorld {
    /* 第一个Java程序
     * 它将输出字符串 Hello World
     */
    public static void main(String[] args) {
        System.out.println("Hello World"); // 输出 Hello World
    }
}

主函数语句的构成

编写 Java 程序时应注意一下几点:

  • 大小写敏感:Java 是大小写敏感的,这就意味着标识符 Hellohello 是不同的。
  • 类名:对于所有的类来说,类名的首字母应该大写。如果类名由若干单词组成,那么每个单词的首字母应该大写,例如 MyFirstJavaClass
  • 方法名:所有的方法名都应该以小写字母开头。如果方法名含有若干单词,则后面的每个单词首字母大写。
  • 源文件名:源文件名必须和类名相同。当保存文件的时候,你应该使用类名作为文件名保存(切记 Java 是大小写敏感的),文件名的后缀为 .java 。(如果文件名和类名不相同则会导致编译错误)。
  • 主方法入口:所有的 Java 程序由 public static void main(String[] args) 方法开始执行。

Java 所有的组成部分都需要名字。类名、变量名以及方法名都被称为标识符。

关于 Java 标识符,有以下几点需要注意:

  • 所有的标识符都应该以字母(A-Z 或者 a-z),美元符($)、或者下划线(_)开始
  • 首字符之后可以是字母(A-Z 或者 a-z),美元符($)、下划线(_)或数字的任何字符组合
  • 关键字不能用作标识符
  • 标识符是大小写敏感的
  • 合法标识符举例:age、$salary、_value、__1_value
  • 非法标识符举例:123abc、-salary

一言蔽之:即标识符可由字母,美元符,下划线和数字组成,其中数字不能放在标识符的开头。


像其他语言一样,Java 可以使用修饰符来修饰类中方法和属性。主要有两类修饰符:

  • 访问控制修饰符 : default, public, protected, private
  • 非访问控制修饰符 :final, abstract, static, synchronized


Java 中主要有如下几种类型的变量

  • 局部变量
  • 类变量(静态变量)
  • 成员变量(非静态变量)


数组是储存在堆上的对象,可以保存多个同类型变量。在后面的章节中,我们将会学到如何声明、构造以及初始化一个数组。

Java 5.0 引入了枚举,枚举限制变量只能是预先设定好的值。使用枚举可以减少代码中的 bug。


例如,我们为果汁店设计一个程序,它将限制果汁为小杯、中杯、大杯。这就意味着它不允许顾客点除了这三种尺寸外的果汁。

1
2
3
4
5
6
7
8
9
10
11
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公共的
default 默认
类、方法和变量修饰符abstract声明抽象
class
extends扩充,继承
final最终值,不可改变的
implements实现(接口)
interface接口
native本地,原生方法(非 Java 实现)
new新,创建
static静态
strictfp严格,精准
synchronized线程,同步
transient短暂
volatile易失
程序控制语句break跳出循环
case定义一个值以供 switch 选择
continue继续
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是关键字,但不能使用

注意:Java 的 null 不是关键字,类似于 true 和 false,它是一个字面常量,不允许作为标识符使用。



类似于 C/C++、Java 也支持单行以及多行注释。注释中的字符将被 Java 编译器忽略。

1
2
3
4
5
6
7
8
9
10
11
public class HelloWorld {
   /* 这是第一个Java程序
    * 它将输出 Hello World
    * 这是一个多行注释的示例
    */
    public static void main(String[] args){
       // 这是单行注释的示例
       /* 这个也是单行注释的示例 */
       System.out.println("Hello World");
    }
}


空白行或者有注释的行,Java 编译器都会忽略掉。

在 Java 中,一个类可以由其他类派生。如果你要创建一个类,而且已经存在一个类具有你所需要的属性或方法,那么你可以将新创建的类继承该类。

利用继承的方法,可以重用已存在类的方法和属性,而不用重写这些代码。被继承的类称为超类(super class),派生类称为子类(sub class)。

在 Java 中,接口可理解为对象间相互通信的协议。接口在继承中扮演着很重要的角色。
接口只定义派生要用到的方法,但是方法的具体实现完全取决于派生类。

区别如下图所示:
JAVA源程序与编译型运行区别

Java 对象和类

查看Java 对象和类

  • 类(class):类是一个模板,它描述一类对象的行为和状态。
  • 对象(object):对象是类的一个实例,有状态和行为。

一个类可以包含以下类型的变量:

  • 局部变量:在方法、构造方法或者语句块中定义的变量被称为局部变量。变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。
  • 成员变量:成员变量是定义在类中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。
  • 类变量:类变量也声明在类中,方法体之外,但必须声明为 static 类型。

语句块:用一对{}包括起来的有着相同的变量作用域的相关一组语句的集合。


每个类都有构造方法。如果没有显式地为类定义构造方法,Java 编译器将会为该类提供一个默认构造方法。
在创建一个对象的时候,至少要调用一个构造方法。构造方法的名称必须与类同名,一个类可以有多个构造方法。


下面是一个构造方法示例:

1
2
3
4
5
6
7
8
public class Puppy {
    public Puppy() {
    }

    public Puppy(String name) {
        // 这个构造器仅有一个参数:name
    }
}

对象是根据类创建的。在 Java 中,使用关键字 new 来创建一个新的对象。创建对象需要以下三步:

  • 声明:声明一个对象,包括对象名称和对象类型。
  • 实例化:使用关键字 new 来创建一个对象。
  • 初始化:使用 new 创建对象时,会调用构造方法初始化对象。

下面是一个创建对象的例子:

1
2
3
4
5
6
7
8
9
10
11
public class Puppy {
    public Puppy(String name) {
        // 这个构造器仅有一个参数:name
        System.out.println("小狗的名字是 : " + name);
    }

    public static void main(String[] args) {
        // 下面的语句将创建一个Puppy对象
        Puppy myPuppy = new Puppy("tommy");
    }
}

输出结果为:

1
小狗的名字是 : tommy


通过已创建的对象来访问成员变量和成员方法,如下所示:

1
2
3
4
5
6
/* 实例化对象 */
Object referenceVariable = new Constructor();
/* 访问类中的变量 */
referenceVariable.variableName;
/* 访问类中的方法 */
referenceVariable.methodName();


在本节的最后部分,我们将学习源文件的声明规则。当在一个源文件中定义多个类,并且还有 import 语句和 package 语句时,要特别注意这些规则。

  • 一个源文件中只能有一个 public 类
  • 一个源文件可以有多个非 public 类
  • 源文件的名称应该和 public 类的类名保持一致。例如:源文件中 public 类的类名是 Employee,那么源文件应该命名为 Employee.java。
  • 如果一个类定义在某个包中,那么 package 语句应该在源文件的首行。
  • 如果源文件包含 import 语句,那么应该放在 package 语句和类定义之间。如果没有 package 语句,那么 import 语句应该在源文件中最前面。
  • import 语句和 package 语句对源文件中定义的所有类都有效。在同一源文件中,不能给不同的类不同的包声明。

类有若干种访问级别,并且类也分不同的类型:抽象类和 final 类等。这些将在访问控制章节介绍。
除了上面提到的几种类型,Java 还有一些特殊的类,如:内部类匿名类


包主要用来对类和接口进行分类。当开发 Java 程序时,可能编写成百上千的类,因此很有必要对类和接口进行分类。


在 Java 中,如果给出一个完整的限定名,包括包名、类名,那么 Java 编译器就可以很容易地定位到源代码或者类。import 语句就是用来提供一个合理的路径,使得编译器可以找到某个类。
例如,下面的命令行将会命令编译器载入 java_installation/java/io 路径下的所有类

1
import java.io.*;

Java 基本数据类型

查看Java 基本数据类型

变量就是申请内存来存储值。也就是说,当创建变量的时候,需要在内存中申请空间。
内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来储存该类型数据。
Java 的两大数据类型:

  • 内置数据类型
  • 引用数据类型


Java 语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。

1byte(字节)=8bit(比特)


byte:

  • byte 数据类型是 8 位(1byte)、有符号的,以二进制补码表示的整数;
  • 取值范围:-128(-2^7)~127(2^7-1)
  • 默认值是 0

short:

  • short 数据类型是 16 位(2byte)、有符号的以二进制补码表示的整数;
  • 取值范围:-32768(-2^15)~32767(2^15 - 1)
  • 默认值是 0

int:

  • int 数据类型是 32 位(4byte)、有符号的以二进制补码表示的整数;
  • 取值范围:-2,147,483,648(-2^31)~2,147,483,647(2^31 - 1)
  • 默认值是 0

long:

  • long 数据类型是 64 位(8byte)、有符号的以二进制补码表示的整数;
  • 取值范围:-9,223,372,036,854,775,808(-2^63)~9,223,372,036,854,775,807(2^63 -1)
  • 默认值是 0L

float:

  • float 数据类型是单精度、32 位、符合 IEEE 754 标准的浮点数;
  • 默认值是 0.0f
  • 浮点数不能用来表示精确的值,如货币;

double:

  • double 数据类型是双精度、64 位、符合 IEEE 754 标准的浮点数;
  • 浮点数的默认类型为 double 类型;
  • double 类型同样不能表示精确的值,如货币;
  • 默认值是 0.0d

boolean:

  • boolean 数据类型表示一位的信息;
  • 只有两个取值:true 和 false;
  • 这种类型只作为一种标志来记录 true/false 情况;
  • 默认值是 false

char:

  • char 类型是一个单一的 16 位 Unicode 字符;
  • 最小值是 \u0000(十进制等效值为 0)
  • 最大值是 \uffff(即为 65535)
  • char 数据类型可以储存任何字符;

在Java中,引用类型的变量非常类似于C/C++的指针。引用类型指向一个对象,指向对象的变量是引用变量。这些变量在声明时被指定为一个特定的类型,比如 Employee、Puppy 等。变量一旦声明后,类型就不能被改变了。

对象、数组都是引用数据类型。

所有引用类型的默认值都是null。

一个引用变量可以用来引用任何与之兼容的类型。


例子:Site site = new Site("Runoob")。


常量在程序运行时是不能被修改的。
在 Java 中使用 final 关键字来修饰常量,声明方式和变量类似:

1
2
//虽然常量名也可以用小写,但为了便于识别,通常使用大写字母表示常量。
final double PI = 3.1415927;

Java 语言支持一些特殊的转义字符序列。

符号 字符含义
\n 换行 (0x0a)
\r 回车 (0x0d)
\f 换页符(0x0c)
\b 退格 (0x08)
\0 空字符 (0x0)
\s 空格 (0x20)
\t 制表符
\" 双引号
\' 单引号
\\ 反斜杠
\ddd 八进制字符 (ddd)
\uxxxx 16进制Unicode字符 (xxxx)

整型、实型(常量)、字符型数据可以混合运算。运算中,不同类型的数据先转化为同一类型,然后进行运算。
转换从低级到高级。

1
2
3
低  ------------------------------------>  高

byte,short,char —> int —> long—> float —> double

数据类型转换必须满足如下规则:

  • 不能对 boolean 类型进行类型转换。
  • 不能把对象类型转换成不相关类的对象。
  • 在把容量大的类型转换为容量小的类型时必须使用强制类型转换。
  • 转换过程中可能导致溢出或损失精度,例如:
1
2
3
int i = 128;
byte b = (byte)i;
// 因为 byte 类型是 8 位,最大值为127,所以当 int 强制转换为 byte 类型时,值 128 时候就会导致溢出。
  • 浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入,例如:
1
2
(int)23.7 == 23;
(int)-45.89f == -45

自动类型转换
必须满足转换前的数据类型的位数要低于转换后的数据类型,例如: short 数据类型的位数为 16 位,就可以自动转换位数为 32 的 int 类型,同样 float 数据类型的位数为 32,可以自动转换为 64 位的 double 类型。

1
2
3
4
5
6
7
8
9
10
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);
        }
}

运行结果为:

1
2
char自动类型转换为int后的值等于97
char类型和int计算后的值等于66

强制类型转换

  • 条件是转换的数据类型必须是兼容的。
  • 格式:(type)value type 是要强制类型转换后的数据类型 实例:
1
2
3
4
5
6
7
public class QiangZhiZhuanHuan{
    public static void main(String[] args){
        int i1 = 123;
        byte b = (byte)i1;//强制类型转换为byte
        System.out.println("int强制类型转换为byte后的值等于"+b);
    }
}

运行结果:

1
int强制类型转换为byte后的值等于123

隐含强制类型转换

  • 整数的默认类型是 int。
  • 小数默认是 double 类型浮点型,在定义 float 类型时必须在数字后面跟上 F 或者 f。

Java 变量类型

查看Java 变量类型

在 Java 语言中,所有的变量在使用前必须声明。声明变量的基本格式如下:

1
type identifier [ = value][, identifier [= value] ...] ;

以下列出了一些变量的声明实例。注意有些包含了初始化过程。

1
2
int a, b, c;         // 声明三个int型整数:a、 b、c
int d = 3, e = 4, f = 5; // 声明三个整数并赋予初值

Java 语言支持的变量类型有:

  • 类变量:独立于方法之外的变量,用 static 修饰。
  • 实例变量(成员变量):独立于方法之外的变量,不过没有 static 修饰。
  • 局部变量:类的方法中的变量。
1
2
3
4
5
6
7
8
9
10
11
public class Variable{
    static int allClicks=0;    // 类变量

    String str="hello world";  // 实例变量

    public void method(){

        int i =0;  // 局部变量

    }
}

  1. 局部变量声明在方法、构造方法或者语句块中;
  2. 局部变量在方法、构造方法、或者语句块被执行的时候创建,当它们执行完成后,变量将会被销毁;
  3. 访问修饰符不能用于局部变量;
  4. 局部变量只在声明它的方法、构造方法或者语句块中可见;
  5. 局部变量是在栈上分配的;
  6. 局部变量没有默认值,所以局部变量被声明后,必须经过初始化,才可以使用。

  1. 实例变量声明在一个类中,但在方法、构造方法和语句块之外;
  2. 当一个对象被实例化之后,每个实例变量的值就跟着确定;
  3. 实例变量在对象创建的时候创建,在对象被销毁的时候销毁;
  4. 实例变量的值应该至少被一个方法、构造方法或者语句块引用,使得外部能够通过这些方式获取实例变量信息;
  5. 实例变量可以声明在使用前或者使用后;
  6. 访问修饰符可以修饰实例变量;
  7. 实例变量对于类中的方法、构造方法或者语句块是可见的。一般情况下应该把实例变量设为私有。通过使用访问修饰符可以使实例变量对子类可见;
  8. 实例变量具有默认值。数值型变量的默认值是 0,布尔型变量的默认值是 false,引用类型变量的默认值是 null。变量的值可以在声明时指定,也可以在构造方法中指定;
  9. 实例变量可以直接通过变量名访问。但在静态方法以及其他类中,就应该使用完全限定名: ObjectReference.VariableName

  1. 类变量也称为静态变量,在类中以 static 关键字声明,但必须在方法之外。
  2. 无论一个类创建了多少个对象,类只拥有类变量的一份拷贝。
  3. 静态变量除了被声明为常量外很少使用,静态变量是指声明为 public/private,final 和 static 类型的变量。静态变量初始化后不可改变。
  4. 静态变量储存在静态存储区。经常被声明为常量,很少单独使用 static 声明变量。
  5. 静态变量在第一次被访问时创建,在程序结束时销毁。
  6. 与实例变量具有相似的可见性。但为了对类的使用者可见,大多数静态变量声明为 public 类型。
  7. 默认值和实例变量相似。数值型变量默认值是 0,布尔型默认值是 false,引用类型默认值是 null。变量的值可以在声明的时候指定,也可以在构造方法中指定。此外,静态变量还可以在静态语句块中初始化。
  8. 静态变量可以通过:ClassName.VariableName 的方式访问。
  9. 类变量被声明为 public static final 类型时,类变量名称一般建议使用大写字母。如果静态变量不是 public 和 final 类型,其命名方式与实例变量以及局部变量的命名方式一致。
    实例:
1
2
3
4
5
6
7
8
9
10
11
12
import java.io.*;

public class Employee {
    //salary是静态的私有变量
    private static double salary;
    // DEPARTMENT是一个常量
    public static final String DEPARTMENT = "开发人员";
    public static void main(String[] args){
    salary = 10000;
        System.out.println(DEPARTMENT+"平均工资:"+salary);
    }
}

运行结果:

1
开发人员平均工资:10000.0

Java 修饰符

查看Java 修饰符

Java 语言提供了很多修饰符,主要分为以下两类:

  • 访问修饰符
  • 非访问修饰符

修饰符用来定义类、方法或者变量,通常放在语句的最前端。我们通过下面的例子来说明:

1
2
3
4
5
6
7
8
9
public class ClassName {
   // ...
}
private boolean myFlag;
static final double weeks = 9.5;
protected static final int BOXWIDTH = 42;
public static void main(String[] arguments) {
   // 方法体
}

Java 支持 4 种不同的访问权限:
default & public:使用对象:类、接口、变量、方法。
private & protected:使用对象:变量、方法。(PS:不过二者都能修饰内部类)

修饰符当前类同一包内子孙类(同一包)子孙类(不同包)其它包
publicYYYYY
protectedYYYY/NN
defaultYYYNN
privateYNNNN

default:接口里的变量隐式声明为:public static final,接口里的方法默认访问权限为:public
protected:被 protected 修饰的成员对于本包和其子类可见。

  • 子类与基类在同一包中:被声明为 protected 的变量、方法和构造器能被同一个包中的任何其他类访问。
  • 子类与基类不在同一包中:那么在子类中,子类实例可以访问其从基类继承而来的 protected 方法,而不能访问基类实例的 protected 方法。
    (PS:在判断java.lang包中的clone()等方法是需要注意方法的来源,到底来自于当前包还是java.lang包。)

请注意以下方法继承的规则:

  • 父类中声明为public的方法在子类中也必须为public
  • 父类中声明为protected的方法在子类中要么声明为protected,要么声明为public,不能声明为private
  • 父类中声明为private的方法,不能够被子类继承。

  • 静态变量:static 关键字用来声明独立于对象的静态变量,无论一个类实例化多少对象,它的静态变量只有一份拷贝。 静态变量也被称为类变量。局部变量不能被声明为 static 变量。
  • 静态方法:static 关键字用来声明独立于对象的静态方法。静态方法不能使用类的非静态变量。静态方法从参数列表得到数据,然后计算这些数据。

对类变量和方法的访问可以直接使用classname.variablenameclassname.methodname的方式访问。

final 变量:final 表示”最后的、最终的”含义,变量一旦赋值后,不能被重新赋值。被 final 修饰的实例变量必须显式指定初始值。final 修饰符通常和 static 修饰符一起使用来创建类常量。
final 方法:父类中的 final 方法可以被子类继承,但是不能被子类重写。声明 final 方法的主要目的是防止该方法的内容被修改。
final 类:final 类不能被继承,没有类能够继承 final 类的任何特性。

抽象类:抽象类不能用来实例化对象,声明抽象类的唯一目的是为了将来对该类进行扩充。
一个类不能同时被 abstract 和 final 修饰。如果一个类包含抽象方法,那么该类一定要声明为抽象类,否则将出现编译错误。
抽象类可以包含抽象方法和非抽象方法。
抽象方法:抽象方法是一种没有任何实现的方法,该方法的具体实现由子类提供。

抽象方法不能被声明成 final 和 static。

任何继承抽象类的子类必须实现父类的所有抽象方法,除非该子类也是抽象类。

如果一个类包含若干个抽象方法,那么该类必须声明为抽象类。抽象类可以不包含抽象方法。

抽象方法的声明以分号结尾,例如:public abstract sample();

1
2
3
4
5
6
7
8
9
10
public abstract class SuperClass{
    abstract void m(); //抽象方法
}

class SubClass extends SuperClass{
     //实现抽象方法
      void m(){
          .........
      }
}

synchronized 关键字声明的方法同一时间只能被一个线程访问。synchronized 修饰符可以应用于四个访问修饰符。

1
2
3
public synchronized void showDetails(){
.......
}

序列化的对象包含被 transient 修饰的实例变量时,java 虚拟机(JVM)跳过该特定的变量。
该修饰符包含在定义变量的语句中,用来预处理类和变量的数据类型。

1
2
public transient int limit = 55;   // 不会持久化
public int b; // 持久化

volatile 修饰的成员变量在每次被线程访问时,都强制从共享内存中重新读取该成员变量的值。而且,当成员变量发生变化时,会强制线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。

一个 volatile 对象引用可能是 null。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class MyRunnable implements Runnable
{
    private volatile boolean active;
    public void run()
    {
        active = true;
        while (active) // 第一行
        {
            // 代码
        }
    }
    public void stop()
    {
        active = false; // 第二行
    }
}
/*
通常情况下,在一个线程调用 run() 方法(在 Runnable 开启的线程),在另一个线程调用 stop() 方法。 如果 第一行 中缓冲区的 active 值被使用,那么在 第二行 的 active 值为 false 时循环不会停止。
但是以上代码中我们使用了 volatile 修饰 active,所以该循环会停止。
 */

Java 运算符

查看Java 运算符

Java 运算符方面与其他编程语言基本一致,故简单讲述。


Java 中基本的算数运算符为+,-,*,/,%,++,--


Java 中基本的关系运算符为==,!=,>,<,>=,<=

操作符 描述 例子
如果相对应位都是1,则结果为1,否则为0 (A&B),得到12,即0000 1100
| 如果相对应位都是 0,则结果为 0,否则为 1 (A | B)得到61,即 0011 1101
^ 如果相对应位值相同,则结果为0,否则为1 (A ^ B)得到49,即 0011 0001
按位取反运算符翻转操作数的每一位,即0变成1,1变成0。 (〜A)得到-61,即1100 0011
<<  按位左移运算符。左操作数按位左移右操作数指定的位数。 A << 2得到240,即 1111 0000
>>  按位右移运算符。左操作数按位右移右操作数指定的位数。 A >> 2得到15即 1111
>>>  按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。 A>>>2得到15即0000 1111


Java 支持的逻辑运算符有&&,||,!


Java 支持的赋值运算符有=,+=,-=,*=,/=,%=,<<=,>>=,&=,^=,|=

1
2
3
4
// 基本格式
variable x = (expression) ? value if true : value if false
// 实例
b = (a == 1) ? 20 : 30;

1
2
3
4
5
// 基本格式
( Object reference variable ) instanceof  (class/interface type)
// 实例
String name = "James";
boolean result = name instanceof String; // 由于 name 是 String 类型,所以返回真

Java 循环结构

查看Java 循环结构

1
2
3
4
5
6
7
8
9
10
11
// 基本结构为
while( 布尔表达式 ) {
  //循环内容
}

// 实例
while( x < 20 ) {
         System.out.print("value of x : " + x );
         x++;
         System.out.print("\n");
      }


do...while循环与while循环的区别在于do..while循环至少会执行一次。

1
2
3
4
// 基本格式
do {
       //代码语句
}while(布尔表达式);

注意do...while结尾有;


for 循环语句基本格式与 C 语言完全一致。

1
2
3
4
5
// 实例
for(int x = 10; x < 20; x = x+1) {
         System.out.print("value of x : " + x );
         System.out.print("\n");
      }


通过 Java 增强 for 循环可快速便利数组元素。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 基本格式
for(声明语句 : 表达式)
{
   //代码句子
}
/*
声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配。其作用域限定在循环语句块,其值与此时数组元素的值相等。
表达式:表达式是要访问的数组名,或者是返回值为数组的方法。
*/

for(int x : numbers ){
         System.out.print( x );
         System.out.print(",");
      }


break关键字用于跳出当前的循环语句或者switch语句。


continue关键字用于直接进入下一次循环。

Java 条件语句

查看Java 条件语句

Java 中的if-else条件语句与 C 语言中完全相同,故只做简单示例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public static void main(String args[]){
      int x = 30;
      int y = 10;

      if( x == 30 ){
         if( y == 10 ){
             System.out.print("X = 30 and Y = 10");
          }
       }
    }

if( x == 10 ){
         System.out.print("Value of X is 10");
      }else if( x == 20 ){
         System.out.print("Value of X is 20");
      }else if( x == 30 ){
         System.out.print("Value of X is 30");
      }else{
         System.out.print("这是 else 语句");
      }

Java switch case 语句

查看Java switch case 语句

Java 中switch case语句与 C 语言完全相同,故只做简单示例。

switch case的语法格式如下

1
2
3
4
5
6
7
8
9
10
11
switch(expression){
    case value :
       //语句
       break; //可选
    case value :
       //语句
       break; //可选
    //你可以有任意数量的case语句
    default : //可选
       //语句
}

switch 语句中的变量类型可以是byte,short,int,char。从 Java SE 7 开始,支持字符串String类型,同时case标签必须是字符串常量或字面量。

Java Number&Math 类

查看Java Number&Math类

Java 为每个内置数据类型提供了对应的包装类,与Number类和Object类的关系如下图。

当内置数据类型被当作对象来使用时,编译器会把内置数据类型装箱为包装类,反之,编译器也可以把一个对象拆箱为内置类型。
举例如下

1
2
3
4
5
6
7
8
9
10
public class Test {

   public static void main(String[] args) {
      Integer x = 5;
      x =  x + 10;
      System.out.println(x);
   }
}
// 运行结果为15
// 当 x 被赋为整型值时,由于x是一个对象,所以编译器要对x进行装箱。然后,为了使x能进行加运算,所以要对x进行拆箱。


Java 的 Math 包含了用于执行基本数学运算的属性和方法,如初等指数、对数、平方根和三角函数。
Math 的方法都被定义为 static 形式,通过 Math 类可以在主函数中直接调用。

1
2
3
4
5
6
7
8
9
10
public class App {
    public static void main(String[] args) {
        System.out.println("90 度的正弦值:" + Math.sin(Math.PI / 2));
        System.out.println("0度的余弦值:" + Math.cos(0));
        System.out.println("60度的正切值:" + Math.tan(Math.PI / 3));
        System.out.println("1的反正切值: " + Math.atan(1));
        System.out.println("π/2的角度值:" + Math.toDegrees(Math.PI / 2));
        System.out.println(Math.PI);
    }
}

  • Number 类的xxxValue()方法:将 Number 对象转换为 xxx 数据类型的值并返回。例:x.byteValue()
  • Number 类的compareTo()方法:该方法用于将 Number 对象与方法的参数进行比较,只能用于比较相同的两个数据类型。例:x.compareTo(3)。大于返回1,小于-1,等于0
  • Number 类的equals()方法:判断 Number 对象与参数是否相等。例:x.equals(y),相等返回true,否则返回false
  • Number 类的valueOf方法:返回一个 Number 对象指定的内置数据类型。例:Integer b = Integer.valueOf("444",16);444的十六进制表示。
  • parseInt():将字符串解析为 int 类型。
  • abs():返回参数的绝对值。
  • ceil():返回大于等于给定参数的最小整数,类型为双精度浮点型。
  • floor():返回小于等于给定参数的最大整数,类型为双精度浮点型。
  • rint():返回与参数最接近的整数。返回类型为 double。
  • round():表示四舍五入,数字+0.5后再向下取整。
  • min():返回两个参数中的最小值。
  • max():返回两个参数中的最大值。
  • exp():返回自然数底数 e 的参数次方。
  • log():返回参数的自然数底数的对数值。
  • pow():返回第一个参数的第二个参数次方。
  • sqrt():求参数的算数平方根。
  • sin():求指定 double 类型参数的正弦值。
  • cos():求指定 double 类型参数的余弦值。
  • tan():求指定 double 类型参数的正切值。
  • asin():求指定 double 类型参数的反正弦值。
  • acos():求指定 double 类型参数的反余弦值。
  • atan():求指定 double 类型参数的反正切值。
  • atan2():将笛卡尔坐标转变为极坐标,并返回极坐标的角度值。
  • toDegrees():将参数转化为角度。
  • toRadians():将角度转化为弧度。
  • random():返回一个随机数。

Java Character 类

查看 Java Character类

同样的,内置数据类型char同样有它的包装类Character,同样也有装箱和拆箱操作。

前面有反斜杠(\)的字符代表转义字符,它对编译器来说是有特殊含义的。
下面列表展示了 Java 的转义序列:

转义序列 描述
\t 在文中该处插入一个tab键
\b 在文中该处插入一个后退键
\n 在文中该处换行
\r 在文中该处插入回车
\f 在文中该处插入换页符
\' 在文中该处插入单引号
\" 在文中该处插入双引号
\\ 在文中该处插入反斜杠

  • isLetter():是否是一个字母。
  • isDigit():是否是一个数字字符。
  • isWhitespace():是否是一个空白字符。
  • isUpperCase():是否是大写字母。
  • isLowerCase():是否是小写字母。
  • toUpperCase():指定字母的大写形式。
  • toLowerCase():指定字母的小写形式。
  • toString():返回字符的字符串形式,字符串的长度为 1。

Java String 类

查看Java String 类

字符串广泛应用 在 Java 编程中,在 Java 中字符串属于对象,Java 提供了 String 类来创建和操作字符串。


String直接创建的字符串对象在公共池中,而对象创建的字符串对象在堆上:

1
2
3
4
5
String s1 = "Runoob";              // String 直接创建
String s2 = "Runoob";              // String 直接创建
String s3 = s1;                    // 相同引用
String s4 = new String("Runoob");   // String 对象创建
String s5 = new String("Runoob");   // String 对象创建

String类有 11 种构造方法,这些方法提供不同的参数来初始化字符串。
String类是不可更改的,一旦创建就不可修改。


用于获取有关对象的信息的方法称为访问器方法。
String 类的一个访问器方法是length()方法,它返回字符串对象包含的字符数。

1
2
3
4
5
6
7
public class StringDemo {
    public static void main(String args[]) {
        String site = "www.runoob.com";
        int len = site.length();
        System.out.println( "菜鸟教程网址长度 : " + len );
   }
}


String 类提供了连接两个字符串的方法:

1
string1.concat(string2);

更常用的是使用+操作符来连接字符串,如:

1
"Hello," + " runoob" + "!";


String类的format()方法能用来创建可复用的格式化字符串,而不是仅仅用来一次打印输出。

1
2
3
4
5
String fs;
fs = String.format("浮点型变量的值为 " +
                   "%f, 整型变量的值为 " +
                   " %d, 字符串变量的值为 " +
                   " %s", floatVar, intVar, stringVar);

String类方法较多,请查看api 文档

Java StringBuffer

查看Java StringBuffer

当对字符串进行修改的时候,需要使用StringBufferStringBuilder类,二者的对象能被多次修改,并且不产生新的未使用对象。

由于StringBuilder相较于StringBuffer有速度优势,所以多数情况下建议使用StringBuilder类,然而StringBuilder的方法不是线程安全的(不能同步访问)。

1
2
3
4
5
6
7
8
9
10
11
12
13
public class RunoobTest {
    public static void main(String args[]) {
        StringBuilder sb = new StringBuilder(10);
        sb.append("Runoob..");
        System.out.println(sb);
        sb.append("!");
        System.out.println(sb);
        sb.insert(8, "Java");
        System.out.println(sb);
        sb.delete(5, 8);
        System.out.println(sb);
    }
}

StringBuffer 类的方法:

Java 数组

查看Java 数组


Java 有两种声明数组变量的语法

1
2
3
4
// 首选
dataType[] arrayRefVar;
// 次选,只是符合C/C++的格式方便理解
dataType arrayRefVar[];


Java 使用new操作符来创建数组,数组是通过索引来访问的,索引值从0~arrayRefVar.length-1

1
2
3
4
5
// 模板
dataType[] arrayRefVar = new dataType[arraySize];

// 或者直接赋值
dataType[] arrayRefVar = {value0, value1, ..., valuek};


java.util.Arrays 类能方便地操作数组,它提供的所有方法都是静态的。
具有以下功能:

  • 给数组赋值:通过fill方法。
  • 对数组排序:通过sort方法,按升序。
  • 比较数组:通过equals方法比较数组中元素值是否相等。
  • 查找数组元素:通过binarySearch方法能对排序好的数组进行二分查找法操作。

Arrays 类还有很多方法,详情查看Java Api 文档

Java 日期时间

Java 日期时间

Date类提供了两个构造函数来实例化Date对象。

1
2
3
4
// 使用当前日期和时间来实例化对象
Date date = new Date();
// 接受第一个参数,该参数是从 1970 年 1 月 1 日起的毫秒数
Date(long millisec);
序号 方法和描述
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: dow mon dd hh:mm:ss zzz yyyy 其中: dow 是一周中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat)。

1
2
Date date = new Date();
System.out.println(date.toString());


Java 使用以下三种方法来比较两个日期:

  • 使用getTime()方法获取两个日期(自 1970 年 1 月 1 日经历的毫秒数值),然后比较这两个值。
  • 使用方法before()after()equals()。例如,一个月的 12 号比 18 号早,则new Date(99, 2, 12).before(new Date (99, 2,18))返回 true。
  • 使用compareTo()方法,它是由Comparable接口定义的,Date类实现了这个接口。


SimpleDateFormat 是一个以语言环境敏感的方式来格式化和分析日期的类。SimpleDateFormat 允许你选择任何用户自定义日期时间格式来运行。例如:

1
2
3
4
Date dNow = new Date( );
SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd hh:mm:ss");
System.out.println("当前时间为: " + ft.format(dNow));
// 运行结果为:当前时间为: 2018-09-06 10:16:34

有的格式大写,有的格式小写,例如MM是月份,mm是分;HH是 24 小时制,而hh是 12 小时制。


时间模式字符串用来指定时间格式。在此模式中,所有的 ASCII 字母被保留为模式字母,定义如下:


Calendar类是一个抽象类,在实际使用时实现特定的子类的对象,创建对象的过程对程序员来说是透明的,只需要使用getInstance方法创建即可。

1
2
3
4
Calendar c = Calendar.getInstance();//默认是当前日期
//创建一个代表2009年6月12日的Calendar对象
Calendar c1 = Calendar.getInstance();
c1.set(2009, 6 - 1, 12);


Calendar 类实现了公历日历,GregorianCalendar 是 Calendar 类的一个具体实现。
Calendar 的 getInstance()方法返回一个默认用当前的语言环境和时区初始化的 GregorianCalendar 对象。GregorianCalendar 定义了两个字段:AD 和 BC。这是代表公历定义的两个时代。

Java 正则表达式

Java 正则表达式

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个”规则字符串”,这个”规则字符串”用来表达对字符串的一种过滤逻辑。
给定一个正则表达式和另一个字符串,我们可以达到如下的目的:

  • 给定的字符串是否符合正则表达式的过滤逻辑(称作”匹配”)。
  • 可以通过正则表达式,从字符串中获取我们想要的特定部分。

正则表达式的特点是:

  • 灵活性、逻辑性和功能性非常的强。
  • 可以迅速地用极简单的方式达到字符串的复杂控制。

Java 正则表达式的知识点较为繁琐,详情见Java 正则表达式

Java 方法

查看Java 方法



可变参数,即参数的个数可变。方法的可变参数的声明如下所示:

1
typeName... parameterName

在方法声明中,在指定参数类型后加一个省略号(…) 。
一个方法中只能指定一个可变参数,它必须是方法的最后一个参数。任何普通的参数必须在它之前声明。

Java Stream, File, IO

查看Java Stream

Java.io 包几乎包含了所有操作输入、输出需要的类。所有这些流类代表了输入源和输出目标。
Java.io 包中的流支持很多种格式,比如:基本类型、对象、本地化字符集等等。
一个流可以理解为一个数据的序列。输入流表示从一个源读取数据,输出流表示向一个目标写数据。
Java 为 I/O 提供了强大的而灵活的支持,使其更广泛地应用到文件传输和网络编程中。


Java 的控制台输入由System.in完成。
为了获得一个绑定到控制台的字符流,你可以把System.in包装在一个BufferedReader对象中来创建一个字符流。
下面是创建BufferedReader的基本语法:

1
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

BufferedReader 对象创建后,我们便可以使用 read() 方法从控制台读取一个字符,或者用 readLine() 方法读取一个字符串。

从 BufferedReader 对象读取一个字符要使用 read() 方法,它的语法如下:

1
int read( ) throws IOException

每次调用 read() 方法,它从输入流读取一个字符并把该字符作为整数值返回。 当流结束的时候返回 -1。该方法抛出 IOException。


从标准输入读取一个字符串需要使用BufferedReaderreadLine()方法。
基本格式:

1
String readLine( ) throws IOException

基本示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//使用 BufferedReader 在控制台读取字符
import java.io.*;

public class BRReadLines {
    public static void main(String[] args) throws IOException {
        // 使用 System.in 创建 BufferedReader
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str;
        System.out.println("Enter lines of text.");
        System.out.println("Enter 'end' to quit.");
        do {
            str = br.readLine();
            System.out.println(str);
        } while (!str.equals("end"));
    }
}


在此前已经介绍过,控制台的输出由print()println()完成。这些方法都由类PrintStream定义,System.out是该类对象的一个引用。
PrintStream继承了OutputStream类,并且实现了方法write()。这样,write()也可以用来往控制台写操作。
PrintStream定义write()的最简单格式如下所示:

1
void write(int byteval)

该方法将 byteval 的低八位字节写到流中。


如前所述,一个流被定义为一个数据序列。输入流用于从源读取数据,输出流用于向目标写数据。
下图是一个描述输入流和输出流的类层次图。


两种创建方法:

1
2
3
4
5
6
7
8
9
InputStream f = new FileInputStream("C:/java/hello");

File f = new File("C:/java/hello");
InputStream in = new FileInputStream(f);

OutputStream f = new FileOutputStream("C:/java/hello")

File f = new File("C:/java/hello");
OutputStream fOut = new FileOutputStream(f);

使用实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
//文件名 :fileStreamTest2.java
import java.io.*;

public class fileStreamTest2 {
    public static void main(String[] args) throws IOException {

        File f = new File("a.txt");
        FileOutputStream fop = new FileOutputStream(f);
        // 构建FileOutputStream对象,文件不存在会自动新建

        OutputStreamWriter writer = new OutputStreamWriter(fop, "UTF-8");
        // 构建OutputStreamWriter对象,参数可以指定编码,默认为操作系统默认编码,windows上是gbk

        writer.append("中文输入");
        // 写入到缓冲区

        writer.append("\r\n");
        // 换行

        writer.append("English");
        // 刷新缓存冲,写入到文件,如果下面已经没有写入的内容了,直接close也会写入

        writer.close();
        // 关闭写入流,同时会把缓冲区内容写入文件,所以上面的注释掉

        fop.close();
        // 关闭输出流,释放系统资源

        FileInputStream fip = new FileInputStream(f);
        // 构建FileInputStream对象

        InputStreamReader reader = new InputStreamReader(fip, "UTF-8");
        // 构建InputStreamReader对象,编码与写入相同

        StringBuffer sb = new StringBuffer();
        while (reader.ready()) {
            sb.append((char) reader.read());
            // 转成char加到StringBuffer对象中
        }
        System.out.println(sb.toString());
        reader.close();
        // 关闭读取流

        fip.close();
        // 关闭输入流,释放系统资源

    }
}

Java Scanner 类

查看Java Scanner 类

使用next方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import java.util.Scanner;

public class ScannerDemo {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        // 从键盘接收数据

        // next方式接收字符串
        System.out.println("next方式接收:");
        // 判断是否还有输入
        if (scan.hasNext()) {
            String str1 = scan.next();
            System.out.println("输入的数据为:" + str1);
        }
        scan.close();
    }
}

输出结果:

1
2
3
next方式接收:
runoob com
输入的数据为:runoob

使用nextLine方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import java.util.Scanner;

public class ScannerDemo {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        // 从键盘接收数据

        // nextLine方式接收字符串
        System.out.println("nextLine方式接收:");
        // 判断是否还有输入
        if (scan.hasNextLine()) {
            String str2 = scan.nextLine();
            System.out.println("输入的数据为:" + str2);
        }
        scan.close();
    }
}

输出结果为:

1
2
3
nextLine方式接收:
runoob com
输入的数据为:runoob com

Java 异常处理

查看Java 异常处理



实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 文件名 : ExcepTest.java
import java.io.*;
public class ExcepTest{

   public static void main(String args[]){
      try{
         int a[] = new int[2];
         System.out.println("Access element three :" + a[3]);
      }catch(ArrayIndexOutOfBoundsException e){
         System.out.println("Exception thrown  :" + e);
      }
      System.out.println("Out of the block");
   }
}

1
2
3
4
5
6
7
8
9
10
import java.io.*;
public class className
{
  public void deposit(double amount) throws RemoteException
  {
    // Method implementation
    throw new RemoteException();
  }
  //Remainder of class definition
}