内容简述:
包括一些学习java的需要了解的最基本的知识,如:数据类型,static和final关键字、变量的类型
一、基础知识
Java采用Uincode字符编码编写,标识符(变量名、函数或者类名称)是不限长度的uincode字母和数字的序列,序列的第一个字符必须是字母。字母和数字可以从整个的unicode字符集中选择。两个标识符只有在有具有相同的unicode编码才是相同的,有相同外形的标识符仍然有可能不同。标识符不能和java的关键字或者布尔文字相同。
二、数据类型
Java语言的类型分为两类:primitive 和 reference
Primitive |
boolean |
Numeric type |
integers |
floates |
char |
byte |
short |
int |
long |
double |
float |
8位 |
16位 |
32位 |
64位 |
64位 |
32位 |
Java是严格类型语言,必须每一个变量声明类型
变量类型之间的转换规则:
byte |
short |
int |
float |
char |
double |
long |
三、两个关键字解释
static(分配空间不变的)
当设计一个class的时候,其实只是描述其长相和行为。除非用new来实例化一个class否则并不存在任何实质的对象。产生对象的时候才会分配存储空间。但是存在下面两种情况是上述方法不能处理的:一、希望不论产生多少对象,那些特定的数据存储空间都只分配一份(对属性);二、希望某函数不要和class object绑在一起(方法)。这时可以使用static关键字
一般情况下,需要产生对象,再通过对象访问其属性和方法。所以non-static 数据/函数必须知道其隶属与那个对象。但是用static声明的属性或者方法可以不通过对象访问。因此static函数中不能取用non-static 数据/函数。
将关键字static放在属性或者函数之前,将他们置为静态。
1. static 数据
如果定义一个属性是static类型的,那么所有的此class声明的对象拥有同一个此属性。
class StaticTest{
static int i = 47;
}
即使产生两个StaticTest对象,但是StaticTest.i只有一份。产生出来的那两个对象会拥有一个共同的i。
2. static 方法
static方法是不用reference调用的方法,因此它不能用this做参数,也不能取用non-static 数据/函数。
在下面两种情况下使用static方法:一、因为所有的需要的参数是明确的,因此方法不用访问对象的属性时;二、当方法仅需要访问某个class的静态属性的时候。
final(数据值不可改变的)
可以使用final的三个地方:data、methods 和classes
1. final data
ü 永远不变的编译期常量(compile-time constant)
ü 在执行期(run-time)被初始化,但是不希望其值变化
是否编译期常量要看其值的初始化是否发生在编译期,而和这个值是否声明为static或者final无关。
当final用于基本类型的时候,final让数值保持不变;但是当其用于object reference 的时候,final让reference保持不变,即此reference 不能再指向其他的对象。但是对象本身的内容是可以变化的。
Blank finals
Java允许将数据成员声明为final但是不赋初值。编译器会保证变量在使用前被初始化。因此class内的final数据成员可以在每个对象中有不同的值,但是保持此值不变。
2. final methods
使用final method函数原因有二:
ü 锁住这个函数,使这个函数在继承的过程中不被改变。就是保证此函数不能被覆写(overridde)
ü 出于效率。编译器将某个final函数直接放在调用它的那个位置,省去了调用的整个过程。
Class中所有的private函数都是final的,因为他们不能被覆写
3. final class
将整个class声明为final表示你不想继承这个class也不许别人继承这个class。
四、变量
变量(variable)是一种存储位置。他有一个相应的类型,有时称为他的编译期类型(compile-time-type)。
根据变量的作用域将其分为七种类型:
1. 类变量(class variable)
在类声明中用关键字static,或是在接口声明中用(或不用)关键字static声明的类类型的属性。类变量在类或者接口被装载时创建,并在创建时按照缺省值被初始化。
2. 实例变量(instant variable)
类声明中不用static的变量。一个实例对应一个
Java虚拟机会自动进行初始化。如果给出了初始值,则初始化为该初始值。如果没有给出,则把它初始化为该类型变量的默认初始值。
int类型变量默认初始值为0
float类型变量默认初始值为0.0f
double类型变量默认初始值为0.0
boolean类型变量默认初始值为false
char类型变量默认初始值为0(ASCII码)
long类型变量默认初始值为0
所有对象引用类型变量默认初始值为null,即不指向任何对象。注意数组本身也是对象,所以没有初始化的数组引用在自动初始化后其值也是null。
对于两种不同的类属性,static属性与instance属性,初始化的时机是不同的。instance属性在创建实例的时候初始化,static属性在类加载,也就是第一次用到这个类的时候初始化,对于后来的实例的创建,不再次进行初始化。这个问题会在以后的系列中进行详细讨论。
3. 数组成分(array components)
是在一个数组新对象被创建的时候被创建的,并且初始化为缺省的未命名变量。数组成分在数组不再被引用时有效的终止存在。
4. 方法参数(method parameters)
指定传递给方法的参数值。每次方法被调用的时候都创建一个新的参数变量。新的变量用来自方法调用相应的参数初始化,在方法主体执行结束时结束。
术语“传值(或称实参call by value)”的意思是方法仅仅得到调用者传给它的参数的value。相反的传引用(形参,传指针 call by reference)意思是方法获得调用者提供给它的变量的位置(location)。因此,方法可以通过传引用的方式改变一个变量的值而不是通过传值这种方式。
Java 编程语言使用call by value这种方式。这意味着,方法得到所有参数的值的复本。实际上,方法不能改变任何一个传给它的参数变量的实际内容。
但是java有两种方法参数:基本类型(Primitive types)、类引用(Object reference)
以下是你对java编程语言中方法参数能够或者不能够处理的一些简介:
· 方法不能改变一个基本类型参数的值;A method cannot modify a parameter of primitive type (that is, numbers or Boolean values).
· 方法能够改变类引用参数的属性值;A method can change the state of an object parameter.
· 方法不能改变一个类引用的指向。A method cannot make an object parameter refer to a new object.
5. 构造函数参数(constructor parameter)
6. 异常处理者参数(exceptime handler parameter)
7. 局部变量(local variable)
必须明确地进行初始化。如果再没有初始化之前就试图使用它,编译器会抗议。如果初始化的语句在try块中或if块中,也必须要让它在第一次使用前一定能够得到赋值。也就是说,把初始化语句放在只有if块的条件判断语句中编译器也会抗议,因为执行的时候可能不符合if后面的判断条件,如此一来初始化语句就不会被执行了,这就违反了局部变量使用前必须初始化的规定。但如果在else块中也有初始化语句,就可以通过编译,因为无论如何,总有至少一条初始化语句会被执行,不会发生使用前未被初始化的事情。对于try-catch也是一样,如果只有在try块里才有初始化语句,编译部通过。如果在catch或finally里也有,则可以通过编译。总之,要保证局部变量在使用之前一定被初始化了。所以,一个好的做法是在声明他们的时候就初始化他们,如果不知道要出事化成什么值好,就用上面的默认值吧!
五、数组
六、