第四章
主要内容
类
-
Java
语言是面向对象语言, -
它的源程序是由若干个类组成,
-
源文件是扩展名为
.java
的文本文件。 -
类是
Java
语言中最重要的数据类型
, -
类声明的变量被称作对象,即类是用来创建对象的模板。
-
类的实现包括两部分:
类声明
和类体
。-
基本格式为:
class 类名 { 类体的内容 }
-
其中:
class
是关键字,用来定义类。class 类名
是类的声明部分,- 类名必须是合法的
Java
标识符。 - 两个大括号以及之间的内容是类体。
-
写类的目的是为了描述一类事物共有的属性和功能。
-
-
类声明 :
class 类名
- 以下是两个类声明的例子。
class People { … } class 植物 { … }
class People
和class 植物
称作类声明;People
和动物
分别是类名。
- 以下是两个类声明的例子。
-
给类命名时,遵守下列编程风格(这不是语法要求,但应当遵守):
- 如果类名使用拉丁字母,那么名字的首字母使用大写字母。
- 类名最好容易识别、见名知意。
- 当类名由几个
单词
复合而成时,每个单词的首字母使用大写。
-
类声明之后的一对大括号
{
,}
以及它们之间的内容称作类体, -
大括号之间的内容称作类体的内容。
-
类体的内容由两部分构:
- 一部分是
变量的声明
,用来刻画属性; - 另一部分是
方法的定义
,用来刻画行为功能。- 类中的方法也可分为
- 实例方法
- 类方法(static)
- 类中的方法也可分为
class Lader { float above; //梯形的上底(变量声明) float bottom; //梯形的下底(变量声明) float height; //梯形的高(变量声明) float area; //梯形的面积(变量声明) float computerArea() { //计算面积(方法) area = (above+bottom)*height/2.0f; return area; } void setHeight(float h) { //修改高(方法) height = h; } }
- 一部分是
对象
-
面向对象
- 本质:以类的方式组织代码,以对象的组织封装数据
- 抽象
- 三大特性
- 封装:属性私有,get/set
- 提高程序的安全性,保护数据
- 隐藏代码的实现细节
- 统一接口
- 系统可维护增加了
- 继承:继承父类的东西
- 多态:同一个事物有多种形态
- 封装:属性私有,get/set
-
用类声明的变量叫做对象
-
创建一个对象包括对象的声明和为对象分配变量两个步骤。
- 对象的声明
- 一般格式为:
类的名字 对象名字; XiyoujiRenwu zhubajie;
- 一般格式为:
- 为声明的对象分配变量
-
使用
new
运算符和类的构造方法为声明的对象分配变量,并返回一个引用值给对象名称。即创建对象。 -
如果类中没有构造方法,系统会调用默认的构造方法,默认的构造方法是无参数的,且方法体中没有语句。
例如: zhubajie = new XiyoujiRenwu();
-
当用类创建一个对象时,类中的成员变量被分配内存空间,这些内存空间称作该对象的实体或对象的变量,而对象中存放着引用值。
-
- 对象的声明
方法
-
java方法是语句的集合,他们在一起执行一个功能
-
解决一类问题的步骤的有序组合
-
包含于类或对象中
-
在程序中被创建,在其他地方被引用
-
用来完成待定功能的代码片段
-
方法的定义包括两部分 :
方法声明
和方法体
- 一般格式为:
方法声明部分 { 方法体的内容 } int speak(){ //无参数的方法头 return 23; } int add(int x,int y,int z) //有参数的方法头 { return x+y+z; }
- 一般格式为:
-
一个方法的所有部分
-
方法声明部分(方法头)
- 方法头由方法的类型、名称和名称之后的一对小括号以及其中的参数列表所构成。
- 修饰符
- 方法类型前面不加关键字
static
的是实例方法、 - 加关键字
static
的是类方法。
- 方法类型前面不加关键字
- (可选)告诉编译器如何调用该方法,定义了该方法的访问类型
- 返回值类型
- 方法名
- 参数类型
- 形式参数
- 实参
修饰符 返回值类型 方法名(参数类型 参数名){ 方法体 return 返回值; } int speak(){ //无参数的方法头 return 23; } int add(int x,int y,int z) //有参数的方法头 { return x+y+z; }
- 注意:
- 方法返回的数据类型可以是
Java
中的任何数据类型之一, - 当一个方法不需要返回数据时,返回类型必须是
void
。
-
方法体
- 方法声明之后的一对大括号
{
,}
以及之间的内容称为方法的方法体. - 方法体的内容包括
- 局部变量的声明
Java
语句。
int getSum(int n) { //参数变量n是局部变量 int sum=0; // 声明局部变量sum for(int i=1;i<=n;i++) { // for循环语句 sum=sum+i; } return sum; // return 语句 }
- 方法声明之后的一对大括号
-
-
方法调用
- 调用方法:
对象名。方法名(实参列表)
- 调用方法:
-
重载方法
- 方法重载的意思是:
- 一个类中可以有多个方法具有相同的名字,但这些方法的参数必须不同,即或者是参数的个数不同,或者是参数的类型不同。
- 方法的返回类型和参数的名字不参与比较
- 方法重载是一种多态的体现。
- 方法重载的规则
- 方法名称必须相同
- 参数列表必须不同(个数、类型、参数排列顺序不同等
- 方法的返回类型可以相同也可以不相同
- 仅仅返回类型不同不足以成为方法的重载
-
方法分类
- 构造方法
- 重载方法
-
构造方法:
-
构造方法是一种特殊方法,
-
它的名字必须与它所在的类的名字完全相同,而且没有类型。
-
允许一个类中编写若干个构造方法,但必须保证他们的参数不同,即参数的个数不同,或者是参数的类型不同。
-
他的作用是在创建对象时使用,主要是用来初始化各个成员变量,以便给类所创建的对象一个合理的初始状态。
-
需要注意的是如果类中没有编写构造方法,系统会默认该类只有一个构造方法,该默认的构造方法是无参数的,且方法体中没有语句。
-
如果类里定义了一个或多个构造方法,那么
Java
不提供默认的构造方法 。 -
需要特别注意的是,构造方法没有类型 。
-
-
定义类需要注意的地方:
-
对成员变量的操作只能放在方法中,
-
方法可以对成员变量和该方法体中声明的局部变量进行操作。
-
在声明成员变量时可以同时赋予初值,但是不可以在类体中有单独的赋值语句,但局部变量必须赋初值。
-
实例方法既能对类变量操作也能对实例变量操作,
-
而类方法只能对类变量进行操作。
-
一个类中的方法可以互相调用,实例方法可以调用该类中的其他方法,类中的类方法只能调用该类的类方法。
-
-
类是面向对象语言中最重要的一种数据类型,那么就可以用它来声明变量。
-
在面向对象语言中,用类声明的变量被称作对象。
-
和基本数据类型不同,在用类声明对象后,还必须要创建对象,即为声明的对象分配变量(确定对象所具有的属性),
-
当使用一个类创建一个对象时,也称给出了这个类的一个实例。
-
通俗的讲,类是创建对象的“模板”,没有类就没有对象。
-
构造方法和对象的创建密切相关 。
-
类与程序的基本结构
- 一个Java应用程序(也称为一个工程)是由若干个类所构成,这些类可以在一个源文件中,也可以分布在若干个源文件中
-
参数传值
-
方法中最重要的部分之一就是方法的参数,
-
参数属于局部变量,
-
当对象调用方法时,参数被分配内存空间,并要求调用者向参数传递值,即方法被调用时,参数变量必须有具体的值。
-
传值机制
- 在Java中,方法的所有参数都是“传值”的,也就是说,方法中参数变量的值是调用者指定的值的拷贝。
- 对于基本数据类型的参数,向该参数“传值”,传递的是值的拷贝.
- 例如,如果向方法的int型参数x传递一个int值,那么参数x得到的值是传递的值的拷贝。
- 对于参数是引用类型时,“传值”传递的是变量的引用而不是变量所引用的实体。Java的引用型数据包括对象、数组和接口。
-
基本数据类型参数的传值
- 对于基本数据类型的参数,传递的是值的拷贝。同时向该参数传递的值的级别不可以高于该参数的级别 。
-
引用类型参数的传值
- 当参数是引用类型时,“传值”传递的是变量中存放的“引用”,而不是变量所引用的实体。
-
-
对象的组合
-
一个类可以把对象作为自己的成员变量,
-
如果用这样的类创建对象,那么该对象中就会有其它对象,也就是说该对象将其他对象作为自己的组成部分,或者说该对象是由几个对象组合而成。
-
如果一个对象a组合了对象b,那么对象a就可以委托对象b调用其方法,即对象a以组合的方式复用对象b的方法。
-
通过组合对象来复用方法有以下特点。
-
通过组合对象来复用方法也称“黑盒”复用,因为当前对象只能委托所包含的对象调用其方法,这样一来,当前对象对所包含的对象的方法的细节(算法的细节)是一无所知的。
-
当前对象随时可以更换所包含的对象,即对象与所包含的对象属于弱耦合关系。
-
注 :在学习对象的组合时,一定要记住:
- 一个类声明的两个对象如果具有相同的引用,二者就具有完全相同的变量
-
-
-
实例成员与类成员
-
实例变量和类变量的声明
- 在声明成员变量时,用关键字static给予修饰的称作类变量,否则称作实例变量(类变量也称为static变量,静态变量)。
-
实例变量和类变量的区别
- 不同对象的实例变量互不相同
- 所有对象共享类变量
- 通过类名直接访问类变量
-
实例方法和类方法的定义
- 类中的方法也可分为实例方法和类方法。
- 方法声明时,方法类型前面不加关键字static修饰的是实例方法、加static关键字修饰的是类方法(静态方法)。
-
实例方法和类方法的区别
- 对象调用实例方法
- 当对象调用实例方法时,该方法中出现的实例变量就是分配给该对象的实例变量;该方法中出现的类变量也是分配给该对象的变量,只不过这个变量和所有的其他对象共享而已。
- 类名调用类方法
- 从而类方法不仅可以被类创建的任何对象调用执行,也可以直接通过类名调用。和实例方法不同的是,类方法不可以操作实例变量,这是因为在类创建对象之前,实例成员变量还没有分配内存。
- 对象调用实例方法
-
-
this
关键字this
是Java
的一个关键字,表示某个对象。this
可以出现在实例方法和构造方法中,但不可以出现在类方法中。this
关键字出现在类的构造方法中时,代表使用该构造方法所创建的对象.- 当
this
关键字出现实例方法中时,this
就代表正在调用该方法的当前对象。 - 实例方法必须只能通过对象来调用,不能用类名来调用。
- 实例方法可以操作类的成员变量,
- 当实例成员变量在实例方法中出现时,默认的格式是:
this.成员变量;
- 当static成员变量在实例方法中出现时,默认的格式是:
类名.成员变量;
- 当实例成员变量在实例方法中出现时,默认的格式是:
-
包
-
包的本质就是文件夹
-
包是Java语言中有效地管理类的一个机制。
-
包名的目的是有效的区分名字相同的类。
-
不同Java源文件中两个类名字相同时,它们可以通过隶属不同的包来相互区分。
-
包命规范
-
包语句
- 通过关键字
package
声明包语句。 package
语句作为Java
源文件的第一条语句,为该源文件中声明的类指定包名。package
语句的一般格式为:package 包名;
- 通过关键字
-
有包名的类的存储目录
- 程序如果使用了包语句,例如:
package tom.jiafei;
- 那么存储文件的目录结构中必须包含有
…\tom\jiafei
并且要将源文件编译得到的类的字节码文件保存在目录c:\1000\tom\jiafei
中(源文件可以任意存放)。
- 程序如果使用了包语句,例如:
-
运行有包名的主类
- 如果主类的包名是
tom.jiafei
,那么主类的字节码一定存放在…\tom\jiefei
目录中,运行时必须到tom\jiefei
的上一层(即tom的父目录)目录中去运行主类。 - 假设
tom\jiefei
的上一层目录是1000
,那么,必须如下格式来运行:C:\1000\java tom.jiafei.主类名
- 如果主类的包名是
-
-
import
语句-
一个类可能需要另一个类声明的对象作为自己的成员或方法中的局部变量,如果这两个类在同一个包中,当然没有问题。
-
如果一个类想要使用的那个类和它不在一个包中,要使用
import
语句完成使命。 -
如果用户需要类库中的类就可以使用
import
语句。import java.until.Date; //表示引入java.util包中的Date类 . import java.util.*;//表示引入java.util包中所有的类
-
用户程序也可以使用
import
语句引入非类库中有包名的类,如:
import tom.jiafei.*;
-
在用户程序所在目录下建立和包相对应的子目录结构,比如用户程序所在目录是
C:\ch4
,想使用import
语句引入tom.jiafei
包中的类,那么根据包名建立如下的目录结构:
C:\ch4\tom\jiafei
-
-
对象数组
- 如果程序需要某个类的若干个对象,
- 比如Student类的10个对象,
- 显然如下声明10个Student对象是不可取的:
Student stu1,stu2, stu3,stu4,stu5,stu6,stu7,stu8, stu9,stu10;
- 正确的做法是使用对象数组,即数组的元素是对象,例如:
Student [] stu; stu = new Student[10];
- 需要注意的是,上述代码仅仅定义了数组stu有10个元素,并且每个元素都是一个Student类型的对象,但这些对象目前都是空对象,因此在使用数组stu中的对象之前,应当创建数组所包含的对象。
例如: stu[0] = new Student();
- 显然如下声明10个Student对象是不可取的:
- 比如Student类的10个对象,
- 如果程序需要某个类的若干个对象,
重点和难点
Java类的语法规则、类变量和实例变量 、import 语句
对象的创建过程,对象引用与实体的关系、访问权限的理解
总结
- 类是组成Java源文件的基本元素
- 类体可以有两种重要的成员:成员变量和方法。
- 成员变量分为实例变量和类变量。类变量被该类的所有对象共享;不同对象的实例变量互不相同。
- 除构造方法外,其它方法分为实例方法和类方法。
- 实例方法即可以操作实例变量也可以操作类变量,当对象调用实例方法时,方法中的成员变量就是指分配给该对象的成员变量,其中的实例变量和其它对象的不相同,即占有不同的内存空间;类变量和其它对象的相同,即占有相的内存空间。
- 类方法只能操作类变量,当对象调用类方法时,方法中的成员变量一定都是类变量,也就是说该对象和所有的对象共享类变量。
- 对象访问自己的变量以及调用方法受访问权限的限制。