内容摘要:面对对象的最初理解、类的封装、类的作用域、成员访问控制、成员方法、构造函数、垃圾回收处理、static的使用、类的组合。
第三章 类与对象
一、面型对象的最初理解
1、面向对象编程的三个特性
1)封装
2)继承
3)多态
二、类的封装
将抽象得到的数据(属性)和行为功能(方法)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合。形成类。其中数据和方法都是类的成员。
1、类的定义语法如下
[类的修饰符] class 类名 [extends 父类名]
{ …//类体}
(1)类的修饰符:定义了类间的访问特性
(2)extends:表示所声明的类继承父类。
若没有extends声明部分。表示所声明的类是从java的根类Objects进行继承(默认情况)。
(3)类体:声明类的成员,其中包括成员变量、成员方法和构造函数。
2、类的构成:变量、方法、构造函数
(1)成员变量(域)
一个类的数据书香有它的成员变量(域)定义。在类中声明一个域的形式为:
[成员变量修饰符] 类名 成员变量名;
成员变量修饰符包括:public,private,protected,package(默认),static,final等.
(2)方法
方法一般是对类中的数据成员进行操作。
如果类中的数据成员是private类型,则往往定义一个public的方法来设置数据成员的值或读取数据成员的值。
(3)构造函数或构造方法
构造函数名和类名是一样的。
构造函数一般用于初始化某个类的对象。
3、类的作用域
(1)创建包
如果有包的声明,一定作为java源代码的第一条语句。
使用pacakage声明包,以分号结束。
eg: pacakage mypackage;
(2)包命名的规范
包名由小写字母组成,不能以圆点开头或结尾(java中包的分隔符为.)
eg:pacakage mypackage;
包名之前最好加上唯一的前缀,通常使用组织倒置的网络域名。如:域名javagroup.net
package net.javagroup.mypackage;
包名后续部分依不同机构内部的规范不同而不同
package net.javagroup.research.powerproject;
(3)导入包
使用不在同一包中的类,需要在java程序中使用import关键字导入该类。
eg:
import java.util.*; //导入java.util包中所有类(系统包,*代表包中的所有类)
import cn.nefu.classandobject.ICEC; //导入指定包中指定类(自定义包)
(4)常用包
java提供大约130多个包,
eg:
java.lang 包含所有的基本语言类
java.io 包含所有的输入输出类
java.net 包含所有实现语言功能的类
java.util 包含有用的数据类型类
(5)关于类的作用域
package(包作用域):一个具有包作用域的类只是在封装它的包中是可见的。
如果一个类的声明的前面没有public关键字,则此类默认为包作用域。
public(公共作用域):一个具有公共作用域的类在封装它的包外面是可见的。
三、注释
单行注释://这里是单行注释
多行注释:/这里是多行注释,
可以多行/
javadoc注释:使用/*开始,使用/结束,用来注释类、属性、方法。
可以从源代码中抽取类、属性、方法等的注释,形成一个和配套的API帮助文档。
四、成员访问控制说明
成员访问控制是用来控制当前类中的成员是否可以在其它类中被访问。
常见的成员访问控制字符。
说明:public的成员组成了类的公共对外接口。
eg:(time.toUniversalString()也是不可以的因为两个java文件不在一个包中,protected控制字符只能在一个包中或者子类中使用)
五、成员方法的使用
(1)方法的声明与局部变量
方法声明的格式:
[修饰符] 返回类型 方法名 ([形式参数表])
{
……//方法体
}
返回类型 :一个方法必须声明其返回类型,如果无返回值,则必须声明其返回类型为void。
*若要在该方法中访问被屏蔽的实例变量,可在其名称前加上关键字this和点运算符“.”
形式为:this.变量名。
(2)方法的参数传递
java的参数传递方式是通过值来传递的,也成为“值传递”。
(3)方法重载(overloading)
java支持方法重载,方法的重载定义为在一个类中定义多个同名的方法,方法返回的类型完全相同,不同的是重载的方法参数必须有所区别:
*参数的类型不同
*参数的顺序不同,指的是一个方法有多个不同类型参数的情况,改变参数的顺序,也是区分方法。
*参数的个数不同
六、构造函数
*构造方法用于为类的新建的对象分配内存空间并对成员变量进行初始化(可以在定义变量的时候进行定义初始化)。
*定义初始化先于构造函数执行。
*定义构造函数时,注意:
(1)构造方法必须也其类名相同,不必写方法的返回类型。
(2)构造方法没有返回值,但可以有参数,并且可以重载。
构造方法只能在创建对象时用new命令调用。
七、this的使用
*this定义为被调用的方法对当前对象的引用。
*this引用仅能出现在类中的方法中。
*通过this不仅可以引用成员变量,也可以通过this引用方法包括构造函数。
八、垃圾回收机制
(1)java内存使用
栈内存:用于存放函数中定义的一些基本类型的变量和对象的引用变量。
堆内存:用于存放由new创建的对象和数组。引用变量在程序运行到其作用域外后被释放,此时堆中的数组和对象在没有引用变量指向它时,进而变成垃圾。
为了使对象不再被引用进而被垃圾回收,可以通过设置指向某一对象的引用为null来实现。
例如:Time1 time=new Time1();
time=null;
(2)垃圾回收的两种方法
垃圾回收器:当一个对象变成垃圾之后,垃圾回收器会在其后的某一个时刻启动,启动时间不受程序员控制。可以在程序中通过调用System.gc()方法来显示地运行垃圾回收程序。
撤销方法finalize:在一个对象得到垃圾回收之前(无论是显示回收还是自动回收),垃圾收集器给对象一个机会来调用finalize方法,这个过程称为对象的撤销方法。finalize方法使Object类的一个方法。
九、static关键字的使用
*java程序中,声明一个成员变量是,可以指定变量是属于:
一个类的各个对象分别拥有(称为实例变量)。
属于一个类的所有对象共享(称为类变量)。类变量是要以关键字static声明,这种类变量也称为静态变量,相应的static修饰的成员方法也成为静态方法,他们统称为类的静态成员。
例如:下述的student类中,name是实例变量,而count是类变量。
public class Student{
String name;
static int count;//被所有对象共享
}
(1)类变量与实例变量
类变量是与类相关联的数据变量,类变量是和该类所创建的所有对象都相关联的变量。
改变其中一个对象的这个类变量就同时改变了其他对象的这个类变量。
因此,类变量的访问不仅可以通过某个对象访问也可以直接通过类名来进行访问。
类的静态成员的使用格式一般为:
对象.静态变量名;
类名.静态变量名;
对象.静态方法名();
类名.静态方法名();
实例变量仅仅是和相应的对象关联的变量,不同对象的实例变量互不相同,分配不同的内存空间,改变其中一个对象的实例变量不会影响其他变量的这个实例变量。
类变量只在这个类的第一对象要创建的时候初始化,这个类的所有对象的静态成员变量是同一个,静态成员的初始化发生在类的成员变量之前。
(2)类方法与实例方法
实例方法可以调用该类型中的实例方法或类方法;类方法只能调用该类的类方法,不能调用实例方法。
无论是实例变量或者是类变量,实例方法中均可以操作;而类方法只能操作类变量不能操作实例变量,也就是说类方法中不能操作实力变量的语句,同时类方法中不可以使用this关键字。
eg:
二者之所以有如上区别的原因:
*实例方法不许通过对象来调用。
*类方法可以通过类名调用,此时可能还没有任何对象的诞生。
(3)static代码块
static代码块指的是static{}包裹的代码块,静态代码块中的变量是局部变量,当所在类被加载时执行,且仅执行一次,无论该类实例化多少次。
静态代码块可用于初始化类,构造函数用于初始化对象,一个类中可以有多个静态代码块。
即使时包含主函数描述的类,依然先执行静态代码块初始化类,然后执行主函数。
eg:
(4)构造代码块
构造代码块指的是用{}包裹的代码块。构造代码块是给所有对象进行统一的初始化,构造代码块中的定义是不同对象共性的初始化内容。
(5)执行顺序
对于一个类而言,按照如下顺序执行:
执行静态代码块,执行构造代码块,执行构造函数
对于静态变量,静态初始化块,变量,初始化块,构造器,它们的初始化顺序依次是(静态变量,静态初始化块,变量,构造代码块,构造函数)。
eg:
(6)使用类的静态方法或静态变量时,注意:
*不能将任何方法体内的局部变量声明为静态。
*静态方法不能以任何方式引用this和super关键字。
*静态方法中只能直接调用同类中其他的静态成员(包括方法和变量),而不能直接访问类中的非静态成员。
*静态方法中必须使用静态变量。
*main()方法是静态的,因此在main()方法中不能直接范文该类中的非静态成员,必须创建该类的一个实例对象后,才能通过这个对象去访问类的非静态成员。
十、枚举类型
枚举(enum)类型,是一种特殊的数据类型,定义了一组预定义的枚举常量列表。
枚举通过预定义的枚举常量,可以限制变量的使用范围。
eg:
枚举类型中的值均代表常量,因此字母全部大写。
十一、类的组合
一个类中的成员可以是其他类的引用,这叫类的组合。组合式类之间的“has a”的关系。
eg: 本例中包含三个类:Date,Employee,Employeetest.
其中Employee类中包含了四个成员变量:firsstName,lastName,birthDate,hireDate.其中birthDate,hireDate都是随Date对象的引用。