之所以引入面向对象,是因为面向过程有以下明显的缺点:
- 数据抽象简单、信息完全暴露、算法复杂、无法很好地描述客观世界等缺点。
- 如果软件项目庞大,程序的调试和维护将变得异常困难。
面向对象编程的设计思想:将数据(变量及属性)以及对这些数据的操作(方法),封装在一个单独的数据结构中(类)。一个面向对象程序的执行,就是靠对象间传递消息来完成的(方法的执行)。
面向对象的三大特点:封装、继承、多态。
封装:把对象的属性和对这些属性的操作封装在一个单独的数据结构中,并尽可能隐蔽对象内部细节。-->数据抽象封装及信息隐蔽。
继承:是一种由已有的类创建新类的机制。利用继承可在基类的基础上,创建出子类。Java中的类是单继承的。
多态:是由封装和继承引发的面向对象的另一特征:主要体现在方法重载和重写上。多态性使得我们的同一个方法,可以有多种形式。另外父类中定义的属性及方法被子类继承后,可以具有不同的数据类型或表现行为。
类声明:
1 class Circle { 2 point center; 3 4 float radius; 5 6 double getArea(){ 7 8 return radius*radius*3.1415926; 10 } 12 }
类声明的格式如下:
[修饰符] [abstract|final]class 类名[extends 基类名][implements 接口名列表]
{
[成员变量说明]
[成员方法说明]
}
abstract(抽象):修饰的类不能被实例化,它包含有未实现的方法。
final(最终):修饰的类不能被继承,即不能有子类。
abstract和final不能同时作为同一个类的修饰符。
类名:最好能见名知意。符合标识符的规定,不能是关键字。不一定要求第一个字母大写。
类体:
{
[public|protected|private] [static] [final] [transient] [volatile]
type variableName; //成员变量
[public|protected|private] [static] [final|abstract] [native] [synchronized] returnType methodName([paramList]) [throws异常列表]{statements} //成员方法
}
类的成员变量定义在类内部,可以直接通过成员变量名来访问。
类外,类变量(static变量)访问:类名.类变量名
实例变量:对象名.实例变量名。
实例化对象:用new关键字。此时编译器完成的三件事情:
- 为对象分配内存空间;
- 初始化对象中的实例变量的值,初始值可以是缺省值,或者变量按指定的值初始化;
- 调用对象的构造方法。
一个类的构造方法可以有多个,它们具有相同的方法名。编译器根据参数的类型来决定调用哪个构造方法。这就是构造方法的多态。
对象的清除:
Java运行时系统通过垃圾收集器周期性地释放无用对象所使用的内存,完成对象的清除。当不存在对一个对象的引用时,该对象成为一个无用对象。Java的垃圾收集器自动扫描对象的动态内存区,对被引用的对象加标记,然后把没有引用的对象作为垃圾收集起来并释放。垃圾收集器作为一个线程运行,当系统的内存用尽或程序中调用System.gc()要求进行垃圾收集时,垃圾收集线程与系统同步运行,否则垃圾收集器在系统空闲时异步地执行。在对象作为垃圾被收集器释放前,Java运行时系统会自动调用对象的方法finalize(),使它清除自己所使用的资源。
在类的定义中,除了必须定义创建类实例的方法外,还可以在定义中提供用于对象清除的方法finalize(),它的格式如下:
protected void finalize() throws Throwable{ //撤销对象 }
finalize()方法是类java.long.Object中最基本的方法。
前面已经讲过,Java提供自动内存垃圾收集和处理程序。然而,在某些情况下,当一个类被破坏后,需要亲自执行一些垃圾收集器不能处理的特殊清理工作。
方法重载:一个类中具有相同的方法名,不同的参数列表(参数类型
不同、参数个数不同);注:仅返回值不同,不能称为是方法重载。
实例方法和类方法:
实例方法可以对当前对象的实例变量进行操作,也可以对类变量进行操作,但类方法不能访问实例变量。实例方法必须由实例对象来调用,而类方法除了可由实例对象调用外,还可以由类名直接调用。另外,在类方法中不能使用this或super。
关于类方法的使用,有如下一些限制:
(1) 在类方法(static方法)中不能引用对象变量及对象方法(non-static variable / Method);
(2) 在类方法中不能使用super、this关键字。
如果违反这些限制,你的程序就会导致编译错误。
与类方法相比,实例方法几乎没有什么限制:
(1) 实例方法可以引用对象变量(这是显然的),也可以引用类变量。
(2) 实例方法中可以使用super、this关键字。
(3) 实例方法中可以调用类方法。
1 package com.annie.test; 2 3 class Member { 4 static int classVar; 5 int instanceVar; 6 static void setClassVar(int i){ 7 classVar = i; 8 // instanceVar = i; not allow 9 } 10 static int getClassVar(){ 11 // setInstanceVar(1); not allow 12 return classVar; 13 } 14 void setInstanceVar(int i){ 15 classVar = i; 16 instanceVar = i; 17 } 18 19 int getInstanceVar(){ 20 setClassVar(1); 21 return classVar + instanceVar; 22 } 23 } 24 public class classMethodTest{ 25 public static void main(String args[]){ 26 Member m1 = new Member(); 27 Member m2 = new Member(); 28 m1.setClassVar(1); 29 m2.setInstanceVar(2); 30 System.out.println("m1.classVar="+m1.getClassVar( )+ " m2.classVar="+m2.getClassVar( )); 31 m1.setInstanceVar(11); 32 m2.setInstanceVar(22); 33 System.out.println("m1.InstanceVar="+m1.getInstanceVar( )+ " m2.InstanceVar="+m2.getInstanceVar( )); 34 } 35 }
包package:由于Java编译器为每个类生成一个字节码文件,且文件名与类名相同,因此同名的类有可能发生冲突。为了解决这一问题,Java提供包来管理类名空间。包实际上是提供了一种命名机制和可见性限制机制。
Java系统必须支持至少一个无名包(缺省包)。
Java中的常用核心包:java.lang.*; java.io.*; java.util.*; java.sql.*
引入包: import 包名;