Java基础知识回顾(一)

Java简介,Java基本数据类型、标识符、关键字、注释、运算符、变量、数组等基础内容回顾。

Java编程语言的风格十分接近C语音、C++语音。Java是一个纯粹的面向对象的程序设计语言,它继承了C++语言面向对象技术的核心。也舍弃了C语言中容易引起错误的指针(指针以引用取代)、运算符重载、多重继承等特性,增加了垃圾回收器功能用于回收不再被引用的对象锁占据的内存空间,让程序员不用再为内存管理而担忧。

一、Java语言主要特性

  1. Java语言是强制面向对象的
    Java语言提供类、接口和继承等原语法,为了简单起见,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制(使用implements)。Java语言全面支持动态绑定,而C++语言只对虚函数使用动态绑定。
  2. Java语言是分布式的
    Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。
  3. Java语言是健壮的
    Java的强类型机制、异常处理、垃圾自动收集等是Java程序健壮性的重要保证,对指针的丢弃是Java的明智选择。Java的安全检查机制使得Java更具健壮性。
  4. Java语言是安全的
  5. Java语言是体系结构中立的
  6. Java语言是可移植的
  7. Java语言是解释型的
  8. Java是性能较高的
  9. Java语言是原生支持多线程的
  10. Java语言是动态的
  11. Java应用具有健壮性和可靠性

二、Java和C语言,C++语言的差异

  • Java中对内存的分配是动态的

  • Java不在所有类之外定义全局变量,而是在某个类中定义一种公用静态的变量来完成全局变量的功能。

  • Java不用goto语句,而是用try-catch-finall异常处理语句来代替goto语句处理出错的功能。

  • Java不支持头文件,而C语言和C++都用头文件来声明类的原型、全局变量、库函数等,这种采用头文件的结构使得系统的运行维护相当繁杂。

  • Java不支持宏定义。Java只能使用关键字final来定义常量。

  • Java对每种数据类型都分配固定长度。比如,在Java中int类型总是32位的,而在C语言和C++语言中,对于不同的平台同一个数据类型分配不同的字节中,同样是int类型,在PC机中为2个字节即16位,而在VAX-11中则为32 位。这使得C语言不具有可移植性,而Java则具有跨平台性。

  • 类型转换不同。

  • 结构和联合的处理。

  • Java不再使用指针。

  • 避免平台依赖。

  • 在B/S开发方面Java要远远优于C++。

    三、面向对象的理解

    面向对象是一种程序的设计方法,或者说它是一种程序设计范型,其基本思想是使用对象,类,继承,封装,消息等基本概念来进行程序设计。
    它是从现实世界中客观存在的事务(即对象)出发来构造软件系统,并在系统构造中尽可能运用人类的自然思维方式,强调直接以问题域(现实世界)中的事务为中心来思考问题,认识问题,并根据这些事务的本质特点,把它们抽象地表示为系统中的对象,作为系统的基本构成单位。这可以使系统更直接的映射问题域,保持问题域中事务及其相互关系的本来面貌。
    见过有人从不同层次解读:

  • 从世界观的角度可以认为:面向对象的基本哲学是认为世界是有各种各样具有自己的运动规律和内部状态的对象所组成的;不同对象之间的相互作用和通讯构成了完整的现实世界。因此,人们应当按照现实世界这个本来面貌来理解世界,直接通过对象及其相互关系来反映世界。这样建立起来的系统才能符合现实世界的本来面目。

  • 从方法学的角度可以认为:面向对象的方法时面向对象的世界观在开发方法中的直接运用。它强调系统的结构应该直接与现实世界的结构相对应,应该围绕现实世界中的对象来构造系统,而不是围绕功能来构造系统。

  • 从程序设计角度来看:面向对象的程序设计语言必须有描述对象及其相互之间关系的语言成分。这些程序设计语言可以归纳为以下几类:系统中一切皆为对象;对象是属性及其操作的封装体;对象可按其性质划分为类,对象成为类的实例;实例关系和继承关系时对象之间的静态关系;消息传递对对象之间动态联系的唯一形式,也是计算的唯一形式;方法是消息的序列。

面向对象的编程语言有封装、继承、抽象、多态4个主要特征。

  1. 封装
    封装是保证软件部件具有优良的模块性的基础,封装的目标就是要实现软件部件的“高内聚、低耦合”,防止程序相互依赖性而带来的变动影响。在面向对象的编程语言中,对象是封装的最基本单位,面向对象的封装比传统语言的封装更为清晰、更为有利。面向对象的封装就是把描述一个对象的属性和行为的代码封装在一个“模块”中。也就是一个类中,属性用变量定义,行为用方法进行定义,方法可以直接访问同一个对象的属性。通常情况下,只要记住让变量和访问这个变量的方法放在一起,将一个类中的成员变量全部定义为私有的,只有这个类自己的方法才可以访问这些成员变量,这就基本上实现对象的封装,很容易找出要分配到这个类里面的方法了。即把握一个原则:把对同一事物进行操作的方法和相关的方法放在同一个类中,把方法和它操作的数据放在同一个类中。
    举例说明:司机,火车,刹车。刹车是个动作,很明显塔应该分配给火车,而司机并不是直接能够实现刹车的,司机刹车的过程只是给火车发了一个消息指令,通知火车要执行刹车动作而已,具体怎么实现刹车的机械内部原理自己就无需了解。
  2. 继承
    在定义和实现一个类的时候,可以在一个已经存在的类的基础上来进行,把这个已经存在的类所定义的内容作为自己的内容,并可以加入若干新的内容,或修改原来的方法使之更适应特殊的需要,这就是继承。继承是子类自动共享父类数据和方法的机制,这是类之间的一种关系,提高了软件的可重用性和可扩展性。
  3. 抽象
    抽象就是找出一些事物的相似和共性支出,然后将这些事物归为一个类,这个类只考虑这些事物的相似和共性之处,并且会忽略与当前主题和目标无关的那个方面,将注意力集中在与当前目标有关的方面。这个其实好理解,就是分类和定义。抽象包括行为抽象和状态抽象两个方面。
    举例说明:定义一个Person类,如下:
    class Person{
    String name;
    int age;
    }
    人本来是很复杂的事物,有很多属性和行为,但当前目标只需要研究使用到人的姓名和年龄,所以上面的定义已经足够特定的系统使用,这就是一种抽象,使用抽象避免考虑一些与目标无关的细节。当前系统需要什么,就只考虑什么。
    在实际开发中其实开始定义一个对象时确实做不到该定义哪些不该定义哪些属性和行为,但基础的轮廓可以先假起来,在设计和开发过程中会自然的明白系统需要到对象的哪些内容,这时做好扩展会进一步加深对抽象的理解,有经验后再设计系统就得心应手了。
  4. 多态
    多态是指程序中定义的引用变量所指向的具体类型和通过引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底回指向哪个类中实现的方法,必须在程序运行期间才能决定。因为在程序运行时才确定具体的类,这样不用修改源程序代码就可以让引用变量绑定到不同的类实现上,从而导致该引用调用的具体方法随之改变,即不用修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态。多态性增强了软件的灵活性和扩展性。

四、Java的数据类型

基本数据类型有8种

整型

数据类型 字符 字节 数值范围
byte 1B 8位 -128到127
short 2B 16位 -2^15 到 2^15-1
int 4B 32位 -2^31 到2^15-1
long 8B 64位 -2^63 到2^63-1

浮点类型

数据类型 字符 数值精度范围
float 4B 32位
double 8B 64位

字符类型

数据类型 字符 字节
char 2B 16位

布尔型

数据类型 字符 值域范围
boolean 1B false/true

注:
引用数据类型(Reference Type)
类、接口、数组、字符串

五、标识符

标识符可以用来表示变量名、类名、类中的方法名称和文件名等。
命名规则:

  1. 由字符、数字、下划线、$组成,不能以数字开头。

  2. 大小写敏感。

  3. 不得使用Java中关键字和保留字。

    关键字:都是小写的,true,false,null严格来说不算关键字,称其为保留字更合适。
    命名习惯:
    标识符要符合语义信息
    包名所有字母小写
    类名每个单词首字符大写,其他小写
    变量和方法:第一个单词小写,从第二个单词开始首字母大写
    常量:所有字符大写,每个单词之间用“_”连接

六、Java关键字

Java关键字不能用于常量、变量和任何标识符的名称,以应用场景分类列出一下Java常见关键字:
访问控制
private protected public

类,方法和变量修饰符
abstract class extends final implements interface native new
static strictfp synchronized transient volatile

程序控制
break continue return do while if else for instanceof switch case default

异常处理
try cathc throw throws

包相关
import package

基本类型
boolean byte char double float int long short null true false

变量引用
super this void

保留字
goto const

七、Java注释

程序注释是给人看的,不是给计算机看的。Java中公有3中类型的注释:

// 单行注释,到本行结束的所有字符都会被编辑器忽略;
/* */多行注释,在/* */之间的所有字符会被编译器忽略;
/** */文档注释,Java特有的,在/** */之间的所有字符会被编译器忽略,可以用javadoc把Java源程序中这种注释抽取出来形成html页面(只有写在包、类、属性、方法、构造器、引用之前的注释才可以进行抽取)。

八、Java运算符

算术运算符

单目运算符:+(取正) -(取负) ++(自增1) –(自减1)
双目运算符:+ - * / %(取余)
三目运算符:a>b?true:false

关系运算符

==
!=

<
>=
<=
逻辑运算符

或(||)
与(&&)
非(!)

赋值运算符

=
%=
&=
|=
^=
<<=(左移位)
>>=(右移位)

位运算符

与(&)、非(~)、或(|)、异或(^)
异或解释:两边的位不同时结果为1,否则为0. 如1100^1010=0110

instanceof运算符

该运算符是个双目运算符,左边的操作元是一个对象,右边的操作元是一个类。当左边的对象是右面的类创建的对象时,该运算符返回结果true,否则返回false.

九、局部变量,实例变量,静态变量

局部变量:不是声明在类体括号里面的变量。

1:必须要先赋值后使用,否则不能通过编译,局部变量没有默认初始化值;
2:作用范围:从定义开始到定义它的代码块结束;
3:同一范围内,不允许2个局部变量命名冲突。

静态变量和实例变量的区别?
语法定义上的区别:静态变量前面要加static关键字,而实例变量前不加;

程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称类变量,只要程序加载了类的字节码,不同创建任何实例对象,静态变量就会被分配空间,可通过类名直接引用。

类的静态变量在内存中只有一个,java虚拟机在加载类的过程中为静态变量分配内存,静态变量位于方法区,被类的所有实例共享。静态变量生命周期取决于类的生命周期;而实例变量取决于类的实例,没创建一个实例java虚拟机就会为实例变量分配一次内存,实例变量位于堆区中,其生命周期取决于实例的生命周期。

十、数组

数组是有序数据的集合,数组中每个元素具有相同的数组名和下标来唯一的确定数组中的元素。

声明数组:
形式如下:
类型[] array;
类型 array[];
建议使用第一种方式。

创建数组:
创建基本数据类型数组:int[] i = new int[2];
创建引用数据类型数组:Student[] s = new Student[10];
数组创建后其中的元素有初始值,引用类型的初始值为null。

初始化数组:
初始化即为数组元素赋值,如下:
int[] i; //定义数组
i = new int[2]; //分配空间
i[0] = 1; //初始化
i[1] = 2;

数组拷贝:
系统类System提供了数组拷贝的方法:
static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
src:源数组
srcPos:从源数组的哪个位置(下标)开始拷贝
dest:目标数组
destPos:拷贝的元素在目标数组的哪个位置(下标)开始放置
length:拷贝数据长度

数组排序:
可调用java.util.Arrays.sort(Object o),也可以自己实现数组排序方法。