第 2章 标识符和数据类型本章主要 内容,
Java的基本语法单位1
Java编码体例2
Java的基本数据类型3
复合数据类型4
类和对象的初步介绍5
Java程序的结构
package语句,可以没有,或可以有多个,但必须放在文件开始的地方
import语句,可以没有,或可以有多个,如果有
import语句的话,必须放在所有类定义之前
public型的类定义,每个文件中最多有一个
类定义,每个文件中包含的类定义的个数没有限制
接口定义,每个文件中包含的接口定义个数没有限制
Java的基本语法单位
空白,注释及语句
空白
换行符及回车键,空格键,水平定位键 ( tab)
都是空白 。 Java程序的元素之间可插入任意数量的空白,编译器将忽略掉多余的空白
程序中除了加入适当的空白外,还应使用 缩进格式,使得同一层语句的起始列位置相同不提倡的程序风格
一种不好的风格
class Point {int x,y;Point(int x1,int y1) {x=x1;
y=y1;
}
Point(
){this(0,0);}
void
moveto(int x1,int y1){
x=x1;y=y1;
}}
提倡的程序风格
class Point {
int x,y; // 点的 x轴,y轴坐标
Point(int x1,int y1) {// 构造方法
x = x1;
y = y1;
}
Point(){ // 构造方法
this( 0,0);
}
void moveto(int x1,int y1){ // 点移动到( x1,y1)
x = x1;
y = y1;
}
}
提倡的程序风格
class Point
{
int x,y; // 点的 x轴,y轴坐标
Point(int x1,int y1) //有参构造器
{
x = x1;
y = y1;
}
Point( ) //无参构造器
{
this( 0,0);
}
void moveto(int x1,int y1) // 点移动到( x1,y1)
{
x = x1;
y = y1;
}
}
注释
程序中适当地加入注释,会增加程序的 可读性
程序中允许加空白的地方就可以写注释。注释不影响程序的执行结果,编译器将忽略注释
Java中的三种注释形式:
// 在一行的注释
/* 一行或多行的注释 */
/** 文档注释 */
语句、分号和块
Java中的语句是 最小的执行单位
Java各语句间以分号,;”分隔。一个语句可写在连续的若干行内
花括号,{”和,}”包含的一系列语句称为 语句块,
简称为 块
语句块可以 嵌套
即语句块中可以含有子语句块。在词法上,块被当作一个语句看待
int x=0;
{
int y=1;
{
int z=2;
System.out.print(“z只能在该内部语句块里使用!,);
}
System.out.print(“x和 y均可在这里使用!,);
}
Java关键字
abstract boolean break byte case
catch char class const continue
do double else extends false
finally cast default final finally
float for future generic goto
if implements import inner instanceof
int interface long native new
null operator outer package private
protected public rest return short
static super switch synchronized this
throw throws transient true try
var void volatile while
标识符
标识符是以字母、下划线( _)或美元符
( $)开头,由字母、数字、下划线( _)
或美元符( $)组成的字符串
标识符区分大小写,长度没有限制标识符例
合法的标识符
非法标识符
2Sun // 以数字 2开头
class // 是 Java的关键字,有特殊含义
#myname // 含有其他符号 #
Identifier username User_name
_sys_var1 $change sizeof
Java编码体制
Java中的一些命名约定,
类 类名应为名词,含有大小写,每个字的首字母大写
接口 接口是一种特殊的类,接口名的命名约定与类名相同
方法 方法名应是动词,含有大小写,首字母小写,
其余各字的首字母大写,尽量不要在方法名中使用下划线
常量 简单类型常量的名字应该全部为大写字母,字与字之间用下划线分隔,对象常量可使用混合大小写
变量 所有的实例变量、类变量和全局变量都使用混合大小写,首字符为小写,后面的字首用大写,作为字间的分隔符。变量名中不要使用下划线
Java的基本数据类型
基本数据类型数据类型基本数据类型复合数据类型类类型布尔类型,boolean
数组接口类型,interface
字符类型,char
数值类型浮点数类型,float,
double
整数类型,byte,
short,int,long
整型
Java属于强类型语言,必须为每一个变量声明一种类型
byte,short,int,long均表示没有小数部分的整数,可正可负,只是取值范围(字节数)不同。
取值范围:- 2(比特数- 1) ~ 2(比特数- 1) - 1
变量和常量( 10,8,16进制)
int length=60; //定义 int型变量,并给出初值 60
int height=060; //表示八进制 60,十进制 48,故不能随便在数字前加 0!!!
int value= 0XBABE; //BABE和前缀 X也可小写
整型常量默认为 int型,若表示 long型,需
long decimal= 123L;
整型
当使用 byte和 short型常量时,不需特殊后缀,
但要注意取值范围
public class Test {
public static void main(String[] args)
{
byte b=128;
System.out.println(“b=“+b);
} }
该程序将不能编译通过!
浮点型
float和 double表示有小数部分的数值,所占字节数分别为 4和 8,有效位数为 6~ 7bit
和 15bit。
浮点型常量默认为 double型,若表示 float
型,需使用后缀 F或 f
float f=12.34; //错误
float g=12.34F; //正确
double d=12.34; //正确
double h=12.34D; //正确字符型
Char用双字节表示一个字符,即 Unicode编码,范围为
0~ 65535。
char a=?a?; //表示小写字母 a
char b=?\u004E?; //表示大写字母 N,\uxxxx中每个 x表示一个 16进制数
Char型常量实际上是一个 16bit无符号整数,也可以使用整数给其赋值,但要注意范围
char a=78; //表示大写字母 N
转义字符
\n (换行) \r (回车) \b (退格)
\t (制表) \” (双引号) \? (单引号)
\\ (反斜杠)
布尔型
用一个字节表示,常量仅 true和 false两种
boolean t=true;
boolean f=false;
boolean型的值不能与其它基本类型进行转换。
类型转换
自动类型转换 (低级 → 高级 )
char
int→long→float→double
byte →short
不同类型数据的转换规则操作数 1类型 操作数 2类型 转换后的类型
byte或 short int int
byte或 short或 int long long
byte或 short或 int或 long float float
byte或 short或 int或 long或
float
double double
char int int
byte a=12;
byte b=13;
byte c=a+b; //右边为 int型,
需强制转换后才能赋值类型转换
当位数多的类型向位数少的类型进行转换时,需要用户明确指明,即进行 强制类型转换
一般地,高级类型(即位数较多的数据类型)转为低级类型(即位数较少的数据类型)时,截断高位内容,因此会导致精度下降或数据溢出
int i = 3;
byte b = (byte) i;
类型转换
隐含强制类型转换
char char a=78;
int byte byte b=123;
short short s=123;
注意:隐含强制转换只适用于常量,不能用于变量
int x=7;
byte y=x; //编译出错,正确应为 y=(byte) x
变量、说明和赋值
程序 2-2 变量的说明和赋值
程序 2-3为每种基本类型定义了一个变量,并为其赋值复合数据类型
早期的程序设计语言把变量看作是孤立的东西
如果我们在一个程序中需处理日期,则往往说明三个独立的整数分别代表日、月、年。如下所示:
int day,month,year;
复合数据类型
这种方法的不足:
如果程序需要处理多个日期,则需要更多的说明。例如要保存两个生日,需如下说明:
因使用了多个变量而变得混乱,容易出错。同时,又占用了过多的命名空间。更重要的是每个值都是独立的变量
int myBirthDay,myBirthMonth,myBirthYear;
int yourBirthday,yourBirthMonth,yourBirthYear;
复合数据类型
有两种办法来解决这个问题:
提供日期类型,并为这个类型定义了相应的函数,通过调用这些函数就可以得到所需要的结果
定义复合数据类型。 复合数据类型为我们提供了更强大的类型定义工具,设计程序时也更加灵活复合数据类型
定义:用户定义的新类型为复合数据类型
在有些语言中,复合数据类型又称作结构类型或记录类型。复合数据类型由程序员在源程序中定义,一旦有了定义,该类型就象其他类型一样使用复合数据类型
对于新定义的复合数据类型,因系统不知道它的具体内容,要由程序员指定其详细的存储结构,这里存储空间的大小不是以字节来衡量,也不是位,而是按已知的其他类型来考虑
Java是面向对象的程序设计语言,它为用户提供的复合数据类型就是我们在前面提到的复合数据类型,即 类,接口 和 数组类和对象的初步介绍
为什么使用面向对象技术
面向过程的设计方式使用的众多变量名、函数名互不约束,令程序员不堪重负
面向过程方法设计的程序把处理的主体与处理的方法分开,因此各种成分错综复杂地放在一起,难以理解,易出错,并且难于调试过程化程序被视为一序列依次执行的指令,
模仿计算机的工作方式为什么使用面向对象
随着开发系统的不断扩大,面向过程的方法越来越不能满足使用者的要求
OOP技术使得程序结构简单,相互协作容易,更重要的是 程序的重用性 大大提高了
OOP模仿现实世界中物体被组合在一起的方式,
即是使分析、设计和实现一个系统的方法尽可能地接近我们认识一个系统的方法
面向对象技术主要包含这样几个概念:对象、抽象数据类型、类、类型层次(子类)、继承性、
多态性为什么使用面向对象
面向对象的方法学包括以下三方面:
面向对象的分析( OOA,Object-Oriented Analysis)
面向对象的设计( OOD,Object-Oriented Design)
面向对象的程序设计 (OOP,Object-Oriented
Program)
什么是 OOP
OOP技术把问题看成是相互作用的事物的集合,
用属性来描述事物,而把对它的操作定义为方法。
在 OOP中,把事物称为对象,把属性称为数据,
这样 对象=数据+方法,或 对象=属性+行为 。
可见,对象是计算机程序中的一个自包含元素,
它包含一组相关的特性,能完成特定的任务
对象是使用被称为类( Class)的模板创建的,
Class是现实生活中对象的抽象数据描述,对象是类的实例什么是 OOP
OOP中采用了三大技术:
封装、继承和多态封装:将数据及操作组装成类继承:一个类可以从另一个类继承属性和方法多态:在类层次结构中,可以让多个方法具有相同的名字
Java OOP能力
Java与 C++ 的 OOP能力比较
C++
多重继承
Java
接口、包、
final、
super
类、公有、私有、
保护成员、静态成员、构造函数、
析构函数、虚函数、虚基类、
this
共有的部分
C++独特的 Java独特的
2.5.2 Java中的类定义
Java中类定义的一般格式为:
修饰符 class 类名 [extends 父类名 ]{
类型 成员变量 1;
类型 成员变量 2;
......
修饰符 类型 成员方法 1(参数列表) {
类型 局部变量 ;
方法体
}
修饰符 类型 成员方法 2(参数列表) {
类型 局部变量 ;
方法体
}
......
}
一辆轿车的类定义
class Car{
int color_number;
int door_number;
int speed;
void brake() {…}
void speedUp() {…}
void slowDown() {…}
}
类定义的几点说明
Java中的类定义与实现是放在一起保存的,整个类必须在一个文件中,因此有时源文件会很大
Java源文件名必须根据文件中的公有类名来定义,
并且要区分大小写
类定义中可以指明父类,也可以不指明。若没有指明从哪个类派生而来,则表明是从缺省的父类
Object派生而来。 Object是 Java中所有类的父类。
Java中除 Object之外的所有类均有一个且只有一个父类。 Object是唯一没有父类的类
class定义的大括号之后没有分隔符,;”
与 OOP有关的关键字
限定访问权限的修饰符
public,private,protected,默认共四种,可修饰类,成员和方法说明:
private只在同一个类中可访问;
默认时为包级访问;
protected和默认基本相同,只是不同包的子类间也可访问;
public为公用访问
p31表 2-6
与 OOP有关的关键字
存储方式修饰符
static,可修饰成员和方法,表明为 类数据 或 类方法,不需创建对象即可使用在例 2-8的类定义中添加:
public static void main(String args[]) {
Count obj1=new Count();
Count obj2=new Count();
Count obj3=new Count();
System.out.println(“obj1的 serialNumber
为:”+ obj1.serialNumber+“,counter为:”+
obj1.counter);

}
与 OOP有关的关键字
与继承有关的关键字继承是指特殊类对象共享更一般类对象的状态和行为,子类可以从父类继承属性和方法。
final:修饰类时,表示该类不能再派生其它子类
abstract:可以修饰成员方法或类,表明是抽象方法和抽象类。抽象方法的方法体为空,抽象类一定要派生子类,并在第一个非抽象类中实现抽象方法例 2-10说明了 abstract的用法与 OOP有关的关键字
this和 super
this代表本类,super代表父类在 Circle类的构造器中
Circle(Point p,int radius) {
super(p); //调用父类的构造器
this.radius=radius;
}
类定义示例
例 2-11 类的说明
public class Date {
int day;
int month;
int year;
}
若程序中含有 Date mybirth;的变量申明,则可用,.”运算符来访问 mybirth的三个部分:
mybirth.day=26;
mybirth.month=11;
mybirth.year=1990;
类定义示例
例 2-12 定义平面中的一个二维点
例 2-13 定义三维点
程序 2-4 定义了 Customer类,包含客户的姓名,地址,电话三项信息,并定义相应的数据访问方法。采用默认构造器创建对象
类的定义实际上相当于一个“模子,,说明一个类类型变量也称为创建了一个对象,这个对象就像拿着模子复制的一个副本。
程序中的对象就是一组变量和相关方法的集合,
其中,变量表明对象的状态,方法表明对象所具有的行为。
1,声明对象引用类名 引用变量名;
Point p;
Car myCar;
没有指向具体对象前,值为 null(空)
创建对象
2,对象实例化引用变量名= new 类名 (参数列表 );

Car myCar;
myCar=new Car( );
调用无参构造器创建 Car的实例,并将为该对象分配的内存空间的首地址赋值给相应类型的引用变量 myCar,以后便可通过 myCar访问该对象实例化的过程实际上是为该对象分配内存,引用变量是对象的句柄。上述语句可合成为
Car myCar=new Car();
创建对象
3,对象使用类是用来创建对象的模板,使用同一个类创建出来的每个对象都具有就算不是完全相同也相似的特性对象引用,成员数据对象引用,成员方法(参数列表) ;
在例 2-12的基础上,可采用例 2-14的方法使用对象
Point p=new Point(1,1);
p.x=p.y=20;
p.moveTo(30,30);

引用变量的赋值引用变量保存的是对象的首地址,因此赋值语句的含义有了重大改变例 2-15
int x=7;
int y=x;
String s=“Hello”;
String t=s;
若之后执行了 x=5,y的值是多少?
若之后执行 s=“world”,又会怎样?
堆栈
Hello
s t
World
引用变量的赋值但是,若执行下面的语句
Point n1=new Point(5);
Point n2=n1;
n1.x=12;
执行之后,n2.x也等于 12!
堆栈
x=5
n1 n2
x=12
自动初始化和 null引用值创建对象时,Java自动初始化所分配的内存空间。
数值变量,0
布尔变量,false
引用变量,null
Java规定,任何变量使用前,必须对其进行初始化。上述自动初始化只用于成员变量,对方法中的局部变量不起作用。因此,必须在使用局部变量前显示地对其进行赋值。
术语概述复合数据类型,将描述整个对象各个不同方面的变量放到一个定义中,创建的数据模型。通常为所说的“类”。
类,是描述对象的基本原型,定义了一类对象所能拥有的数据和能完成的操作。类是程序的基本单元。
对象,类的具体实例成员,组成对象的元素,包括数据或方法。
引用,类类型的变量,用于访问对象,是操作对象的句柄。
作业与实验
复习第 1,2章的内容
实验内容
1.对例 2-8补充 main方法,创建三个 Count
对象,分别输出其对应的各成员变量的值,
说明静态变量 counter在程序中的作用。
2.调试课本程序 2-4。
3.编写习题 2-13。