Java语法基础
基本语法元素
注 释
注释是程序员用来标记、说明程序的。编译器会忽略注释中的内容,注释中的内容不会对程序的运行产生任何影响。Java语言允许三种风格的注释:
//
单行注释
多用于对属性,变量以及算法重要转折时的提示
/*
多行
注释 */
多用于对类、方法及算法的详细说明,一般在对类的注释中要有以下内容:
1.
类的简要说明
2.
创建者及修改者
3.
创建日期或者最后修改日期
/** JAVA文档
*注释
*/
产生Java文档,使用javadoc命令.
分号
在Java编程语言中,语句是一行由分号(;)终止的代码。
例如:
totals = a + b + c + d + e + f;
语句块(block)
语句块(block)也叫做复合语句。一个语句块(block)是以上括号和下括号{}为边界的语句集合;语句块也被用来组合属于某个类的语句。例如:
public class Date {
private int day = 3;
private int month;
private int year;
public void pri() {
}
public static void main(String[] a) {
}
}
语句块可被嵌套。我们以前见到的main方法就是一个语句块,它是一个独立单元。
下面的语句是合法的:
// a block statement
{
x = y + 1;
y = x + 1;
}
// an example of a block statement nested within another block
// statement
while ( i < large ) {
a = a + i;
if ( a == max ) {
b = b + a;
// nested block is here
a = 0;
}
i++;
}
还有一种静态语句块,这个我们将在学习static关键字时介绍.
空白
空白:是空格、tabs和新行(换行符)的统称。
在源代码元素之间允许插入任意数量的空白。空白可以改善源代码的视觉效果,增强源代码的可读性。例如:
{
int x;
x = 23 * 54;
}
{
int
x;
x
=
23
+
54;
}
标识符定义
标识符是语言元素的名称,是我们在程序中表示变量、类或方法等等的符号。
n
标识符由字母、下划线(_)、美元符号($)或数字组成,但不能以数字开头。另外可以使用中文做标识符,但实际开发中不推荐这样做。
n
标识符是大小写不同的敏感。
n
标识符未规定最大长度,但实际工作中不会对标识符命名过长,10个字符以内合适,标识符的命名尽可能的有意义 。
下列标识符是有效的:
idendsafdstifier
ugfdsgName
Udsaf_dsfe
_sys_varldaf
$changdsafe
Java技术源程序采用双字节的"统一字符编码" (Unicode,使用16bit编码)标准,而不是单字节的 ASCII(使用8bit编码)文本。因而,一个字母有着更广泛的定义,而不仅仅是a到z和A到Z。
标识符不能是关键字,但是它可包含一个关键字作为它的名字的一部分。例如,thisone是一个有效标识符,但this却不是,因为this是一个Java关键字。
Java关键字
下面列出了在Java编程语言中使用的关键字。
abstract
do
implements
private
throw
boolean
double
import
protected
throws
break
else
instanceof
public
transient
byte
extends
int
return
true
case
false
interface
short
try
catch
final
long
static
void
char
finally
native
super
volatile
class
float
new
switch
while
continue
for
null
synchronized
default
if
package
this
关键字对Java技术编译器有特殊的含义,它们可标识数据类型名或程序构造(construct)名。
以下是有关关键字的重要注意事项:
true、false和null为小写,而不是象在C++语言中那样为大写。
无sizeof运算符;所有类型的长度和表示是固定的,不依赖执行。
goto和const不是Java编程语言中使用的关键字。
基本Java数据类型
Java编程语言定义了八种原始数据类型:
类型
位数(bit)
默认值
逻辑型
boolean
1bit
false/true
文本型
char
16bit(2byte)
'\u0000'0(Unicode编码)
整数型
byte
8bit(1byte)
0
short,
16bit(2byte)
0
int,
32bit(4byte)
0
long
64bit(8byte)
0
浮点型
double,
64bit(8byte)
0.0
float
32bit(4byte)
0.0
注意:整数类型默认的是int,浮点型默认的是double
逻辑型--boolean
逻辑值有两种状态,即人们经常使用的 “true”和“false”。这样的值是用boolean类型来表示的。boolean有两个文字值,即true和false。
以下是一个有关boolean类型变量的声明和初始化:
boolean truth = true; //声明变量值为真
注意:在整数类型和boolean类型之间无转换计算。有些语言(特别值得强调的是C和C++)允许将数字值转换成逻辑值, 这在Java编程语言中是不允许的;boolean类型只允许使用boolean值。
字符型--char
使用char类型可表示单个字符。一个char代表一个16-bit无符号的(不分正负的)Unicode字符。一个char文字必须包含在单引号内(‘’’’)。
‘a’
‘\t’
一个制表符
‘\u????’
一个特殊的Unicode字符。????应严格按照四个16进制数字进行替换。例如: ’\u03A6’表示希腊字母“Φ”
char类型变量的声明和初始化如下所示:
char ch = `’A'’; // 声明并初始化一个char型变量
char ch1,ch2 ; // 声明两个char型变量
char是int兼容的类型,比如可以如下声明:
int a = ‘a’; // a = 97
char c = 65; // c = ‘A’
字符串类--String
String不是原始类型,而是一个类(class),它被用来表示字符序列。字符本身符合Unicode标准。与C和C++不同,String不能用 \0作为结束。
String的文字应用双引号封闭,如下所示:
“The
quick brown fox jumped over the lazy dog.”
String类型变量的声明和初始化如下所示:
// 声明两个String型变量并初始化他们
String greeting = "Good Morning !! \n" ;
String err_msg = "Record Not Found !" ;
String str1,str2 ; // 声明两个字符串变量
整数型--byte, short, int, long
在Java编程语言中有四种整数类型,它们分别使用关键字byte, short, int和long中的任意一个进行声明。整数类型的文字可使用十进制、八进制和16进制表示,如下所示:
十进制值是2
首位的0表示这是一个八进制的数值
0xBAAC
首位的0x表示这是一个16进制的数值
注意──所有Java编程语言中的整数类型都是带符号的数字。
整数类型文字数字被默认为int类型。
整数类型数文字后面紧跟着一个字母“L”,可以强制它为long型。
例如:
2L
十进制值是2,是一个long
077L
首位的0表示这是一个八进制的数值
0xBAACL
前缀0x表示这是一个16进制的数值
四种整数类型的长度和范围前面已经列出,这些长度和范围是按Java编程语言规范定义的,是不依赖于平台。
浮点数--float和double
如果一个数字文字包括小数点或指数部分,则该数字文字默认为double型浮点数。
例如:
3.14
3.02E23
如果一个数字文字后带有字母F或f,则该数字文字为float型浮点数。
例如:
2.718F
如果一个数字文字后带有字母D或d,则该数字文字为double型浮点数。
例如:
123.4E-306D
浮点变量可用关键字float或double来声明。
Java技术规范的浮点数的格式是由电力电子工程师学会(IEEE)754定义的,是独立于平台的。
变量声明和赋值
变量用于存储信息。一个变量代表一个特殊类型的存储位置,它指向内存的某个单元,而且指明这块内存有多大。变量的值可以是基本类型,也可以是对象类型。
下列程序显示了如何多种类型的 变量,的如何进行声明及赋值的。
public class TestAssign {
public static void main(String args[]) {
int a, b; // declare int variables
float f = 5.89f; // declare and assign float
double d = 2.78d; // declare and assign double
boolean b = true;// declare and assign boolean
char c; // declare character variable
String str; // declare String
String str1 = "good"; // declare and assign String variable
c = 'A'; // assign value to char variable
str = "hello ,hello"; // assign value to String variable
a = 8;
b = 800; // assign values to int variables
}
}
引用(Reference)类型
从大的范围来讲,Java中的数据类型就分为两种:基本数据 类型和引用类型,前面已经对基本数据 类型(也称为主数据类型)进行了讲解,下面我们再来理解引用类型。
创建一个新类型
为克服Java中数据类型的不完整,Java编程语言使用类来创建新类型。例如可以用下面的类表示人:
class Person {
private double height = 1.75;
private double weight = 65;
private String name;
public Person(String aName) {
name = aName;
}
public Person() {
}
}
关键字class是用来声明类的。
Person是指定我们给表示人的这个 类指定的名称。
height一个变量可被声明,是为归属于类型Person的一个属性。, 本类Person中包含有3个属性。
而从而体重,身高部分将被隐含声明。例如:
Person zhangsan, lisi; 声明Person类有两个引用,引用名称为:zhangsan、lisi。
zhangsan = new Person();//类这两个对象为引用类型,zhangsan,lisi 分别指向了各自的对象Persion构造出实际的内存空间,zhangsan这个引用,指向这个内存空间。
lisi = new Person();//同上。因此这两个变量zhangsan、lisi都是引用类型的,并不实际存储这些数据
创建并初始化一个对象
当任何原始基本数据 类型(如boolean, byte, short, char, int, long, float或和 double类型) 的变量被声明时,内存作为上述操作的一部分,存储器空间也同时被分配。空间同时被分配,此分配属栈;
使用非原始基本数据类型(如String或class)的变量的声明,不为对象同时分配存储器内存空间。事实上,使用class类型声明的变量不是数据本身,而是数据的引用(reference)。引用可以理解为C语言的指针(Pointer),但是不能象C语言那样计算指针。
在你使用引用变量之前,必须为它分配实际存储空间。这个工作是通过使用关键字new来实现的。如下所示:
Person pangzi;
pangzi= new Person();
第一个语句仅为引用分配了空间,而第二个语句则通过调用对象的构造函数Person()为对象生成了一个实例。这两个操作被完成后,Person对象的内容则可通过pangzi进行访问。
还可以用一条语句创建并初始化一个对象:
Person pangzi = new Person(“danan”);
使用非基本数据类型(String)变量的声明,分两种情况:
使用String str = “班集”,指向的是内存中的特殊区域,叫字符串池;
而 String str = new String(),则和class变量声明的规则一致。
存储器分配和布局
在一个方法体中,做如下声明:
Person liuxiang;
liuxiang= new Person();
语句Person liuxiang;
仅为一个引用分配存储器,存储空间里的值没有确定。
liuxiang
在语句liuxiang= new Person() 中关键字new意味着为对象分配存储器内存空间,并初始化。:
注意:由于使用了缺省构造函数,而缺省构造函数中并未对name属性进行赋值操作,所以name属性是没有初始化的。
引用类型的赋值
在Java编程语言中,一个被声明为类的变量,叫做引用类型变量,这是因为它正在引用一个非原始基本数据类型,这对赋值具有重要的意义。请看下列代码片段:
int x = 7;
int y = x;
String s = “Hello”;
String t = s;
四个变量被创建:两个原始基本数据类型 int 和两个引用类型String。x的值是7,而这个值被复制到y。x 和 y是两个独立的变量且其中任何一个的进一步的变化都不对另外一个构成影响。
至于变量 s 和 t,只有一个String 对象存在, 它包含了文本”Hello” ,s 和 t均引用这个单一的对象。
将变量t 重新定义, t= "World";则新的对象World被创建,而 t 引用这个对象。
Java
值基本数据 传递与引用传递
Java中的参数传递,都称为是传值。但传的这个值,到底是什么,这个就是我们需要研究的。传递的是一个基本数据,还是一个引用,这就要仔细区别。
基本数据类型,值是在栈中,引用数据类型,值是在堆中。
方法只能改变引用类型的值,而不能改变引用类型的地址和基本类型的值。也就是说方法只能改变堆内存中的值,而不能改变栈内存中的值。实例变量都是保存在堆内存里的。不管是引用类型还是基本类型。所有的引用类型的值都是保存在堆内存里的。
特别注意:对基本数据类型是pass by value,而对引用类型则是pass by ref.
例如:
public class TestReference {
int i = 5;
int j = 6;
A a = new A();
public void changeIJ(int m, int n)
{// 试图改变基本类型的参数的值
int z = 0;
z = m;
m = n;
n = z;
}
public void changeAB(A a1, A a2){ // 试图改变引用类型的参数的地址
A a = null;
a = a1;
a1 = a2;
a2 = a;
}
public void test(int c){ // 试图改变基本类型的参数的值
c = c + 6;
}
public void testA(A a)
{// 试图改变引用类型参数的值
a.i = 100;
}
public static void main(String[] args) {
TestReference t = new TestReference(); // 构造本类的一个对象
int z = 5;
int y = 6;
A aa = new A(); // 定义A类的一个对象aa
t.testA(aa); // 改变对象aa的值
System.out.println(aa.i); // 输出aa的值(属性值)
A bb = new A(); // 再定义A类的一个对象bb
t.changeIJ(z, y); // 试图改变两个基本类型的值
t.changeAB(aa, bb);// 试图改变两个引用类型的地址
System.out.println(z);
System.out.println(y);
System.out.println(aa.i);
System.out.println(bb.i);
}
}
class A {
int i = 5;
};
输出结果如下:
100
5
6
100
5
可见,方法只能改变引用类型的值,而不能改变引用类型的地址和基本类型的值。