201711671215《Java程序设计》第5周学习总结
教材学习内容总结
第4章:类与对象
4.1 编程语言的几个发展阶段
4.1.1 面向机器语言。 4.1.2 面向过程语言。
4.1.3 面向对象语言
3个特性:封装性,继承,多态。
4.2 类
类的定义包括两部分:类声明和类体。基本格式为:
class 类名{
类体的内容
}
4.2.1 类声明
类的名字要符合标识符规定(这是语法所要求的)。
类命名遵守下列编程风格:(1)如果类名使用拉丁字母,那么名字的首字母使用大写字母,如Hello、Time等。
(2)类名最好容易识别、见名知意。当类名由几个“单词”复合而成时,每个单词的首字母应大写,如ChinaMade、AmericanVehicle、WaterLake等(驼峰习惯)。
4.2.2 类体
类声明之后的一对大括号“{” “}”以及它们之间的内容称作类体,大括号之间的内容称作类体的内容。
类体的内容由如下所述的两部分构成:
(1)变量的声明:用来存储属性的值(体现对象的属性)。
(2)方法的定义:方法可以对类中声明的变量进行操作,即给出算法(体现对象所具有的行为)。
4.2.3 成员变量
声明变量部分所声明的变量被称为成员变量或域变量。
1、成员变量的类型:成员变量的类型可以是Java中的任何一种数据类型,包括基本类型:整型、浮点型、字符型、逻辑类型;引用类型:数组、对象和接口。
2、成员变量的有效范围:在整个类内都有效,其有效性与它在类体中书写的先后位置无关。(习惯先介绍属性再介绍行为)
3、编程风格:(1)一行只声明一个变量。(2)变量的名字除了符合标识符规定外,名字的首单词的首字母使用小写,如果变量的名字由多个单词组成,从第2个单词开始的其他单词的首字母使用大写(驼峰习惯)。(3)变量名字见名知意。
4.2.4 方法
方法的定义包括两部分:方法头和方法体。一般格式为:
方法头{
方法体的内容
}
1、方法头:由方法的类型、名称和名称之后的一对小括号以及其中的参数列表所构成。(void:该方法不需要返回数据。)
2、方法体:方法声明之后的一对大括号{、}以及它们之间的内容称为方法的方法体。方法体的内容包括局部变量的声明和Java语句,即在方法体内可以对成员变量和方法体中声明的局部变量进行操作。
在方法体中声明的变量和方法的参数被称作局部变量,和类的成员变量不同的是,局部变量只在方法内有效,而且与其声明的位置有关。方法的参数在整个方法内有效,方法内的局部变量从声明它的位置之后开始有效。
3、区分成员变量和局部变量:如果局部变量的名字与成员变量的名字相同,那么成员变量被隐藏,即该成员变量在这个方法内暂时失效。(如果想在该方法中使用被隐藏的成员变量,必须使用关键字this。)
4、局部变量没有默认值:成员变量有默认值,但局部变量没有默认值,因此在使用局部变量之前,必须保证局部变量有具体的值。
4.2.5 需要注意的问题:对成员变量的操作只能放在方法中,方法使用各种语句对成员变量和方法体中声明的局部变量进行操作,声明成员变量时可赋予初值。
4.2.6 类的UML图
UML图属于结构图,常被用于描述一个系统的静态结构。
4.3 构造方法与对象的创建
在面向对象语言中,用类声明的变量被称为对象。
类是创建对象的模板,没有类就没有对象。
4.3.1 构造方法
当程序用类创建对象时需使用它的构造方法。
类中的构造方法的名字必须与它所在的类的名字完全相同,而且没有类型。
允许在一个类中编写若干个构造方法,但必须保证它们的参数不同,参数不同是指:参数的个数不同,或参数个数相同,但参数列表中对应的某个参数的类型不同。
注意:如果类中没有编写构造方法,系统会默认该类只有一个构造方法,该默认的构造方法是无参数的,且方法体中没有语句。
1、默认构造方法与自定义构造方法:如果类里定义了一个或多个构造方法,那么Java不提供默认的构造方法。
2、构造方法没有类型。
4.3.2 创建对象(2个步骤)
1、对象的声明:一般格式为:
类的名字 对象名字;
2、为声明的对象分配变量:使用new运算符和类的构造方法为声明的对象分配变量,即创建对象。
4.3.3 使用对象
1、对象操作自己的变量(体现对象的属性)
对象通过使用点运算符“.”(点运算符也称引用运算符或访问运算符)访问自己的变量,访问格式为:
对象.变量;
2、对象调用类中的方法(体现对象的行为)
对象可以使用点运算符“.”调用创建它的类中的方法,从而产生一定的行为(功能),调用格式为:
对象.方法;
3、体现封装
当对象调用方法时,方法中出现的成员变量就是指分配给该对象的变量。
4.3.4 对象的引用和实体
1、避免使用空对象:不能让一个空对象去调用方法产生行为。
2、重要结论:一个类声明的两个对象如果具有相同的引用,二者就具有完全相同的变量(实体)。
3、垃圾收集:Java有所谓的“垃圾收集”机制,这种机制周期地检测某个实体是否已不再被任何对象所拥有(引用),如果发现这样的实体,就释放实体占有的内存。
和C++不同,Java运行环境有“垃圾收集”机制,因此Java很少出现“内存泄露”,即由于程序忘记释放内存所导致的内存溢出。
注:如果希望Java虚拟机立刻进行“垃圾收集”操作,可以让System类调用gc()方法。
4.4 一个Java应用程序(也称为一个工程)由若干个类所构成,这些类可以在一个源文件中,也可以分布在若干个源文件中。
4.5 参数传值
方法中最重要的部分之一就是方法的参数,参数属于局部变量,当对象调用方法时,参数被分配内存空间,并要求调用者向参数传递值,即方法被调用时,参数变量必须有具体的值。
4.5.1 传值机制
在Java中,方法的所有参数都是“传值”的,也就是说,方法中参数变量的值是调用者指定的值的拷贝。
4.5.2 基本数据类型参数的传值
对于基本数据类型的参数,向该参数传递的值的级别不可以高于该参数的级别。
4.5.3 引用类型参数的传值
当参数是引用类型时,“传值”传递的是变量中存放的“引用”,而不是变量所引用的实体。
4.5.4 可变参数
可变参数是指在声明方法时不给出参数列表中从某项开始直至最后一项参数的名字和个数,但这些参数的类型必须相同。可变参数使用“…”表示若干个参数,这些参数的类型必须相同。例如:
public void f(int …x)
称x是方法f的参数列表中的可变参数的“参数代表”。“参数列表”必须是参数列表中的最后一个。
对于可变参数,Java也提供了增强的for语句,允许按如下方式使用for语句遍历参数代表所代表的参数:
for(声明循环变量:参数代表) {
…
}
上述for语句的作用就是:对于循环变量,依次取参数代表所代表的每一个参数的值。
4.6 对象的组合
4.6.1 组合与复用
如果一个对象a组合了对象b,那么对象a就可以委托对象b调用其方法,即对象a以组合的方式复用对象b的方法。
4.6.2 类的关联关系和依赖关系的UML图
1、关联关系:实线。 2、依赖关系:虚线。
4.7 实例成员与类成员
4.7.1 实例变量和类变量的声明
在声明成员变量时,用关键字static给予修饰的称作类变量,否则称作实例变量(类变量也称为static变量、静态变量),例如:
class Dog {
float x; //实例变量
static int y; //类变量
}
注意:static需放在变量的类型的前面。
4.7.2 实例变量和类变量的区别
1、不同对象的实例变量互不相同。2、所有对象共享类变量。3、通过类名直接访问类变量。
类变量是和该类创建的所有对象相关联的变量,类变量不仅可以通过某个对象访问,也可以直接通过类名访问。
实例变量仅仅是和相对应的对象关联的变量,对象的实例变量可以通过该对象访问,但不能使用类名访问。
4.7.3 实例方法和类方法的定义
方法声明时,方法类型前面不加关键字static修饰的是实例方法,加static关键字修饰的是类方法(静态方法)。例如:
class A {
int a;
float max(float x,float y) { //实例方法
…
}
static float jerry() { //类方法
…
}
static void speak(String s) { //类方法
…
}
}
注意:static需放在方法的类型的前面。
4.7.4 实例方法和类方法的区别
1、对象调用实例方法。2、类名调用类方法。
3、设计类方法的原则:对于static方法,不必创建对象就可以用类名直接调用它(创建对象会导致类中的实例变量被分配内存空间)。如果一个方法不需要操作类中的任何实例变量,就可以满足程序的需要,考虑将这样的方法设计为一个static方法。
4.8 方法重载
Java中存在两种多态:重载和重写,重写是与继承有关的多态。
对象的行为通过类中的方法来实现,那么行为的多态性就是方法的重载。
4.8.1 方法重载的语法规则
方法重载的意思是:一个类中可以有多个方法具有相同的名字,但这些方法的参数必须不同。两个方法的参数不同是指满足下列之一:(1)参数的个数不同。(2)参数个数相同,但参数列表中对应的某个参数的类型不同。
4.8.2 避免重载出现歧义
4.9 this关键字
4.9.1 在构造方法中使用this
当this关键字出现在类的构造方法中时,代表使用该构造方法所创建的对象。
4.9.2 在实例方法中使用this
当this关键字出现在实例方法中时,this就代表正在调用该方法的当前对象。
当实例成员变量在实例方法中出现时,默认格式是:
this.成员变量;
当static成员变量在实例方法中出现时,默认格式是:
类名.成员变量;
对于实例方法调用的默认格式是:
this.方法;
对于类方法调用的默认格式是:
类名.方法;
注:this不能出现在类方法中,这是因为类方法可以通过类名直接调用,这时,可能还没有任何对象诞生。
4.10 包
包名的目的是有效地区分名字相同的类。
4.10.1 包语句
package语句的一般格式为:
package 包名;
4.11 import语句:(1)引入类库中的类。(2)引入自定义包中的类。
4.12 访问权限
访问限制修饰符有private、protected和public,它们都是Java的关键字,用来修饰成员变量或方法。
注:①不能用protected和private修饰类。
②访问限制修饰符按访问权限从高到低的排列顺序是public、protected、友好的、private。
4.13 基本类型的类封装(P95)
4.14 对象数组
即数组的元素是对象,例如:
Student [] stu;
stu=new Student[10];
注意,上述代码仅仅定义了数组stu有10个元素,并且每个元素都是一个Student类型的对象,但这些对象目前都是空对象,因此在使用数组stu中的对象之前,应当创建数组所包含的对象,例如:
stu[0]=new Student();
4.15 JRE扩展与jar文件(P97)
4.16 文档生成器(P98)
4.17 应用举例
4.18 小结
面向对象编程的核心思想之一:将数据和对数据的操作封装在类中,即通过抽象从具体的实例中抽取出共同的性质形成类的概念,再由类创建具体的对象,然后对象调用方法产生行为以达到程序所要实现的目的。
教材学习中的问题和解决过程
暂无。
代码调试中的问题和解决过程
有包语句的要先建包。
感悟
上机多敲代码获益良多。