您的位置:首页 > 编程语言 > Java开发

Java学习笔记(三、面向对象编程基础)

2008-10-21 16:15 531 查看
3.1 面向对象的基本概念
程序设计语言从开始的面向机器、到面向过程、到现在的面向对象,经历了3个阶段。使用面向机器的语言编写程序的编程模式是:程序=数据+指令;
用面向过程的编程语言的编程模式是:程序=数据结构+算法;
用面向对象的编程语言的编程模式是:程序=对象+消息。程序设计者考虑的是对象的描述、对象间的关系、类的管理、什么时候和什么地方调用对象的哪个方法。对于编程者来说,最大的优点是面向对象编程能有效支持重用。
1、抽象,可以有效的控制程序的复杂性。
2、对象
3、消息,在程序系统中,对象之间的交互通过相互发送消息实现。
4、类,声明对象共有属性和行为的机制。是对一组对象的描述,概述了同类对象的共有性质:数据和方法。
5、继承,就是在已有类的基础上,扩充属性,或扩充与改写某些方法,生成新的类。继承定义的类成为子类,被继承的类成为超类(父类),子类自动含有父类具有的属性和方法。继承具有传递性。
6、多态性,指类型适应性多态,这来自继承。类型适应性多态要求能自动按照对象的实际类型正确调用它的方法。这种类型适应性的多态性需要采用动态联编技术实现。
联编是将发送给对象的消息与含执行该消息方法的对象连接起来。当联编在编译和连接阶段实现时,称作静态联编;当联编推迟到运行时实现时,称作动态联编。动态联编是面向对象语言必须具有的一种能力,是实现上述多态性的技术基础。
3.2 Java的类和对象
3.2.1 类
类是一种类型,封装对象的属性和方法,是同一类对象的模板。
1、类的声明
格式如下

class ClassName

{

ClassBody //类体中给出类的成员变量定义和方法定义。

}

类的成员变量用于存储对象的属性,方法描述对象的行为。类体中不能有独立的执行代码,所有的执行代码只能出现在方法中。
2、成员变量
格式如下
[修饰字] 类型 变量名;
其中,修饰字可以是空的,用于对成员变量限制其访问权限,类型可以是任何数据类型。Java中成员变量的名字可以与类的方法的名字相同。
成员变量对内定义的方法都有效。类的方法也可以定义变量,这种变量成为局部变量,只在它的方法中有效。例如:

class A{

int x;//a是成员变量,在方法f和g中都有效

int f(){

int a=1;//a是局部变量,只在定义它的方法中有效

x=a;//合法,x在类的所有方法中都有效

}

int g(){

int y;

y=a+x;//引用a非法,f中的a在g中已经失效,而g又没有重新定义a。

//如果g中也定义a,则与f中的a不同

}

}

3、方法
方法给出对象的行为,格式如下:
返回值类型 方法名 (类型 参数名,...,类型 参数名)
{
方法体
}
如果方法无返回值,就用void关键字。方法可以没有参数,多个就用逗号隔开。
如果方法中的参数名或局部变量名与类的成员变量名相同,则成员变量在这个方法内部暂时被隐藏,或者说被屏蔽掉了,消失了。如果还是十分想引用这个成员变量,可以使用this.加上成员变量来表示。
在Java程序中,类的方法可以重载。就是说在一个类中定义多个有相同名字的方法,但是这些方法或者参数个数不同或者按顺序参数的类型不同,编译器将据此来判断调用哪个方法。
4、构造方法
这是一个特殊的方法,它的名字和类名完全相同,并且没有返回值,也不用写void。构造方法的作用是创建类的对象,并给对象初始化。构造方法是公共方法,但是程序不能显式地调用构造方。程序运行时,当有对象要创建时,有系统自动调用构造方法。
3.2.2 对象
类被声明后,就可用类创建对象了,被创建的对象成为类的实例。程序使用对象需要依次经历4个步骤:声明对象,创建对象,使用对象,撤销对象
1、声明对象,由于类是一种引用类型,声明对象只是命名一个变量,这个变量能引用类的对象。由于此时对象还没有被创建,所以暂时也不会为它分配内存。
2、创建对象,就是为对象分配内存,也称作类的实例化。一般形式为:new 构造方法();
3、对象的内存模型
Java语言将类型分成基本类型和引用类型。比如整形、浮点型等式基本类型,程序引用这种类型的变量,采用直接访问形式。数组类型和类类型是引用类型。程序访问引用类型的变量采用间接访问方式。
4、使用对象
程序通过操作符“.”对某对象的成员变量进行访问和方法调用。
3.2.3 实例变量和类变量
在定义成员变量时,用关键字static修饰的是类变量,未使用static修饰的是实例变量。
类变量是类的所有对象共享的成员变量,一个类变量在类中只有一个,它属于整个类,而不单独属于类的某个对象。引用类变量途径有两条,通过类、通过对象。
不同对象的实例变量将被分配不同的内存空间。改变类的某一个对象的实例变量值不会影响其他对象的实例变量,这恰好和类变量相反。类变量的内存只有一处,让类的所有对象共享。一旦类的任一对象或类本身改变了类变量,类的其他对象都能发现这个改变。
3.2.4 实例方法和类方法
如同实例变量和类变量一样。
类中的实例方法可以互相调用,并可以调用哪个类方法。类方法间也可以相互调用,但不能直接调用实例方法,除非类方法引入局部对象,然后通过局部对象调用实例方法。另外,类方法能直接引用类变量,不能引用实例变量。实例方法可以引用实例变量,也可以引用类变量。
3.2.5 访问权限
在类的成员中引入访问权限控制,保护类的成员不在非期望的情况下 被引用。Java语言 提供了4种访问权限:
public:设置没有限制的访问权限,其他类的方法都能访问,等于没有任何限制。
private:设置最强的访问权限,其他类的方法都不能访问,等于闭关锁国,呵呵。
protected:只限子类或者同一包中的类的方法能访问。
<default>:无修饰,友好的,只允许同一包中的类的方法访问。
3.2.6 继承
在java语言中继承是通过扩展原有的类,声明新类来实现的。扩展声明的新类成为子类,原有的类成为超类(父类)。继承机制规定,子类可以拥有超类的所有属性和方法,也可以扩展定义自己特有的属性,增加新方法和重新定义超类的方法。
java语言不支持多继承,限定一个类只能有一个超类。在子类声明中加入extends子句来指定超类。格式如下:
class subclassname extends superclassname
{
classbody
}
类声明时,如果缺省extends子句,未指定超类,则该类的超类是系统声明的类java.lang.Object。
子类对父类的继承性,java语言做以下规定:
子类自然地继承其父类中不是private的成员变量作为自己的成员变量,并且自然地继承父类中不是private的方法作为自己的方法。
1、多态性
面向对象语言规定,子类对象也是超类对象,凡超类对象可以应用的地方,子类对象也适用。

class Shape{

float area(){

return 0.0f;

}

}

class Circle extends Shape{

float R;

Circle(float r){

R=r;

}

float area(){

return 3.1415926f*R*R;

}

}

class Rectangle extends Shape{

float W,H;

Rectangle(folat w,float h){

W=w;H=h;

}

float area(){

return W*H;

}

}

public class Example{

public static void main(String args[]){

Circle c;

Rectangle r;

c=new Circle(1.0f);

r=new Rectangle(3.0f,4.0f);

System.out.println(returnArea(c));

System.out.println(returnArea(r));

}

//这里要求参数类型是Shape,但是Shape或者Shape的子类的对象都可以,运行时进行动态联编,

//这是面向对象语言的多态性。

static float returnArea(Shape s){

return s.area();

}

}
有人也将重载方法作为多态性之一。重载能由调用时提供的参数个数和参数的类型顺序,在编译时就能确定被调用的方法,这种多态性不需要动态联编技术。
2、多重继承
继承声明的新类,又可以被其他类再继承,从而构成多重继承。
3、多重继承中构造方法的调用顺序
构造方法的调用顺序与类的继承顺序一致,从最高层的超类开始,按继承顺序调用各类的构造方法。如果子类的构造方法要调用超类的构造方法,给从超类继承的成员变量初始化,可以用super,并且该代码须是构造方法中的第一句。
3.2.7 java面向对象的其他机制
1、final类、final方法和fianl变量
fianl的意义是最终的,用于修饰类、方法和变量,其意思是“不能改变”。禁止改变时可能考虑到“设计”和“效率”两方面。
在类声明之前用fianl修饰,声明的类是fianl类,是不允许被再继承的类,即它不能有子类。例如:
final class C{ }
用final修饰方法,则该方法不能被子类的方法覆盖。等价于给这个方法上了个“锁”,防止任何子类改变它的本来含义;或是为了提高执行效率,编译器可以将这个方法的所有调用都能用“嵌入代码”实现。
例如 final int f(){ }
用final修饰变量,声明该变量的值不能被改变。相当于一个常量。主要用于两个方面:或是一个编译期的常数,它永远不会改变;或在初始化后,不希望它再改变。
例如 final int FINALVAR=100;
2、abstract类和abstract方法
abstract类成为抽象类。抽象类只是声明一种模板,拥有没有具体实现的方法的类。所以抽象类不能有实例。但可以由子类来实现所有的方法。
abstract方法成为抽象方法。抽象方法只能出现在抽象类中,没有具体的实现的代码。如果一个类是抽象类的子类,则要么它仍是抽象类,要么它必须实现超类中所有的抽象方法。
抽象类可以没有抽象方法,但有抽象方法的类一定是抽象类。
3、关键字super
子类隐藏了超类的成员变量或者覆盖了超类方法后,利用关键字super,子类方法可以引用超类的成员变量和被覆盖的方法。
使用super有三种情况:使用super调用超类的构造方法;调用超类被子类覆盖的方法;访问超类被子类隐藏的成员变量。
4、关键字this
用来指对象自己。作用有多种,例如,将对象自己作为参数,调用别的方法;当方法的局部变量隐藏成员变量时,使用this引用成员变量;在构造方法中调用另一构造方法。
5、类之间的is-a和has-a关系
两个类之间可以是is-a也可以是has-a的关系,前者指两者是继承关系,后者指两者是包含关系。通常除了必须是is-a关系外,大都是has-a关系,这样比较灵活。
6、内部类
java语言允许在类声明内部嵌套类声明。嵌套的类可以是静态的或者是非静态的。静态类不能直接引用其包含类的成员,必须实例化,所以不经常使用。非静态的嵌套类,应为需要进行事件处理,所以非常流行。
例如

class A{

B obj;

A(){

obj=new B();

obj.print();

}

class B{

public void print(){

System.out.println("内部类b");

}

}

}

3.3接口
java程序中的类只能继承一个类,这种继承称为单继承。不允许继承多个类,但允许实现多个接口。接口有与类相似的基本形式,有常量定义和方法定义,但没有方法的实现。可以将接口想象为一个纯的抽象类。接口给出某种特定功能的一组方法的规范,而并未真正地实现每个方法。方法的实现要在实现这个接口的类中完成。形象地说,接口对实现接口的类提出这样的要求:“实现我的所有类,都应该包含像我现在这种样子,并给出方法的全部实现。”
因为类可以实现多个接口,这样可以变相的实现多继承,实现有控制的多重继承。
1、接口的定义
[public] interface 接口名 [extends 超接口表]{
接口体
}
用public修饰的接口是公共接口,可被所有的类和接口使用;而没有public修饰的接口只能被同一个包中的其他类和接口使用。
2、接口体
接口体中的内容是一系列常量定义和方法定义。接口的所有变量默认是final static属性;所有的方法默认是public abstract属性。
一个类通过使用关键字implements声明自己使用一个或多个接口。如果一个类实现某个接口,则这个类必须实现该接口的所有方法。在实现接口的方法时,方法的名字、返回值、参数个数及类型必须与接口中定义的方法完全一致,并一定要使用public修饰。
3.4基本类
java语言为一些基本类型设有对应的基本类。

基本类型对应的基本类型基本类型对应的基本类
booleanBooleanintInteger
charCharacterlongLong
byteBytefloatFloat
shortShotdoubleDouble
3.5 java小应用程序基础
即java Applet,是嵌入在web页上供浏览器运行的程序,可以放在服务器上供客户端下载使用。主要功能是显示图形、动画、播放声音、响应用户事件等。每个小应用程序都得继承java.applet.Applet类。
为了系统的安全,对小应用程序有一定的限制:不能调用本地的应用程序和运行时的动态连接数据库;不能访问本地文件;除原小应用程序所在位置外,不能再做网络连接yuwww建立联系,不能获得任何有关系统设置的信息。
1、小应用程序的建立和运行
一个小应用程序从建立到运行需要经历4个步骤:
(1)用java语言编写小应用程序的源程序。必须有一个类继承java.applet.Applet类,这个类是小应用程序的主类,用public修饰。
(2)把小应用程序的源程序编译成字节码.class文件。
(3)将小应用程序的字节码文件嵌入在web页中,设计一个指定小应用程序的html文件。例如

<html>

<head>

</head>

<body>

<applet>

[code base=applet的路径]

<codecode=applet的字节码文件名

width=applet在web页中的宽度

height=applet在web页中的高度>

[<param name=参数名 value=参数值>]

</applet>

</body>

</html>
(4)在支持java的浏览器上运行。
2、Applet类的基本方法
(1)init()方法
初始化、由浏览器载入内存时调用,该方法只运行一次。用途是创建所需要的对象、设置初始状态、装在图像、设置参数等。
(2)start()方法
初始化后,调用start()方法,启动小应用程序主线程,或当用户从小应用程序所在的web页面转到其他页面,然后又返回时,start方法将再次被调用。
(3)stop()方法
当浏览器离开小应用程序所咋的页面转到其他页面时,调用stop方法,挂起小应用程序。
(4)destroy()方法
关闭浏览器,系统调用destroy方法,结束小应用程序的生命,关闭线程释放对象资源。
(5)paint(Graphics g)方法
用于在屏幕窗口上显示信息。
(6)repaint()方法
该方法先清楚paint方法以前所画的内容,然后再调用paint方法。
(7)update()方法
调用repaint方法时,系统会自动调用update方法。清除paint方法以前所画的内容,然后再调用paint方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: