类::包括类声明和类体
类声明:
[public][abstract|final] class className[extends superclassName]
[implements interfaceNameList](实现接口)
{......}(类体)
类体定义:
class className
{ [punlic|protected|private][static]
[final][transient][volatile]type
variableName; //成员变量
[punlic|protected|private][static]
[final|abstract][native][synchronized]
returnType methodName([paramList])
[throws exceptionList]
{statements} //成员方法
}
成员变量:
static:静态变量;相对于实例变量。
final:常量。
transient:暂时性变量,用于对象存档。
volatile:贡献变量,用于并发线程的共享。
成员方法:
static:类方法,可通过类名直接调用。
abstract:抽象方法,没有方法体。
final:方法不能被重写。
native:集成其他语言的代码。
synchronized:控制多个并发线程的访问。
成员方法(方法体)
①方法体包括局部变量的生命以及所有合法的Java指令。
②局部变量的作用域在该方法内部。
③若局部变量与类的成员变量同名,则类的成员变量被隐藏。
方法重载:
①方法重载指多个方法享有相同的方法名;
②区别在于:参数不同,或个数不同;
③参数类型的区分度要够,例如不能是同一简单类型;
④返回类型不能用来区分重载的方法。
构造方法:
①重载经常用于构造方法;
②构造方法具有和类名相同的名称,而且不返回任何数据类型;
③构造方法只能由new运算符调用;
④利用构造方法进行初始化
对象:
类实例化可生成对象;
对象通过消息传递来进行交互;
消息传递即激活指定的某个对象的方法以改变其状态或让它产生一定的行为;表现为调用该对象的某个方法。
对象的生命周期:生成,使用,清除。
对象的生成:
包括声明、实例化和初始化
格式:type objectName=new typr([paramlist]);
①声明:声明并不为对象分配内存空间,而只是分配一个引用空间。
②实例化:运算符new为对象分配内存空间,它调用对象的构造方法,返回引用;一个类的不同对象分别占据不同的内存空间。
③生成:执行构造方法,进行初始化;根据参数不同调用相应的构造方法。
对象的引用指向一个中间的数据结构,它存储有关数据类型的信息以及当前对象所在的堆的地址,而对于对象所在的实际的内存地址是不可操作的,这就保证了安全性。
对象的使用:
通过运算符"."可以实现对变量的访问和方法的调用。
调用对象的变量:
格式:objectReference.variable
objectReference是一个已生成的对象,也可以是能生成对象的表达式。
调用对象的方法:
格式:objectReference.methodName([paramlist]);
对象的清除:
当不存在对一个对象的引用时,改对象成为一个无用对象。
面向对象特性:封装性,继承性,多态性。
继承性:
通过继承实现代码复用;
根类:java.lang.Object;
父类包括直接或间接被继承的类;
Java不支持多重继承;
子类不能继承父类中访问权限为private的成员变量和方法;
子类可以重写父类的方法,及命名与父类同名的组成变量。
方法的重写:
子类中重写的方法和父类中被重写的方法要具有相同的名字,相同的参数表和相同的返回类型。
super关键字:
super用来引用当前对象的父类:
①访问父类被隐藏的成员变量super.variable;
②调用父类中被重写的方法super.Method([paramlist]);
③调用父类的构造函数super([paramlist])。
多态性:
静态多态性(编译时多态)
由方法重载实现。
动态多态性(运行时多态)
由方法重写实现。
方法重写应遵循的原则:
①改写后的方法不能比被重写的方法有更严格的访问权限;
②改写后的方法不能比重写的方法产生更多的例外。
对象状态的确定(instanceof)
Manager和Contractor都是Employee的子类;
final关键字
①final修饰变量,则成为常量。
修饰成员变量时,定义时同时给出初始值,而修饰局部变量时不做要求。
②final修饰方法,则该方法不能被子类重写。
③final修饰类,则类不能被继承。
实例成员和类成员:
static type classVar,
static returnType classMethod({paramlist])}
实例变量和类变量:
每个对象的实例变量都分配内存;
通过对象来访问实例变量;
所有实例对象共享同一个类变量;
类变量可通过类名直接访问,无需先生成一个实例对象;
也可以通过实例对象访问类变量。
实例方法和类方法:
类方法不能访问实例变量,只能访问类变量;
类方法可以由类名直接调用;
类方法中不能使用this或super
类java.lang.Object
该类定义了一些所有对象最基本的状态和行;
equals():比较两个对象(引用)是否相同;
getClass():返回对象运行时所对应的类的表示,从而可得到相应的信息;
toString():把对象转换成字符串;
finalize():
notify(),notfyAll(),wait()
抽象类:
用abstract来修饰类或方法;
抽象类必须被继承,抽象方法必须被重写;
抽象方法只需声明,无需实现;抽象类不能被实例化
抽象类不一定要包含抽象方法;
若类中包含了抽象方法,则该类必须被定义为抽象类。
接口:
接口是抽象类,只包含常量和方法的定义,而没有变量和方法的实现。
用处:
①通过接口实现不相关类的相同行为,而无需考虑这些类之间的关系;
②通过接口指明多个类需要实现的方法
③通过接口了解对象的交互界面,而无需了解对象所对应的类。
接口定义:
包括接口声明和接口体;
接口体包括常量定义和方法定义;
常量定义:type NAME=value;该常量被实现该接口的多个类共享;缺省的具有public,final,static的属性;
方法体定义:(缺省的具有public和abstract属性)returnType methodName([paramlist])
接口的实现:
在类的声明中用implements子句来表示一个类实现了某个接口;
一个类可以实现多个接口,在implements子句中用逗号分开;
必须实现接口中定义的所有方法;
接口类型的使用:
作为一种引用类型来使用。
任何实现该接口的类的实例都可以存储在该接口类型变量
中。
通过这些变量可以访问类所实现的接口中的方法。
Inner Class内部类:在一个类的内部嵌套定义类
(1)是其他类的成员
(2)在一个语句块的内部定义
(3)在表达式内部匿名定义
Inner Class一般用来生成事件适配器,用于事件处理。
优点:节省编译后产生的字节码文件的大小。
缺点:使程序结构不清楚。
anonymous class匿名类:在一个表达式内部包含一个完整的类
定义。