窗口与网络编程第3章面向对象oommttpptConvertor.docx
- 文档编号:13033120
- 上传时间:2023-06-10
- 格式:DOCX
- 页数:22
- 大小:22.29KB
窗口与网络编程第3章面向对象oommttpptConvertor.docx
《窗口与网络编程第3章面向对象oommttpptConvertor.docx》由会员分享,可在线阅读,更多相关《窗口与网络编程第3章面向对象oommttpptConvertor.docx(22页珍藏版)》请在冰点文库上搜索。
窗口与网络编程第3章面向对象oommttpptConvertor
面向对象程序设计基础
主要内容
Java类和对象
封装
继承
多态
重载
抽象类
接口
2
Java类和对象
1、类的定义
2、对象的创建、初始化和使用
3、构造方法
4、成员变量和成员方法
1、类的定义
Java中的类有两部分组成:
成员变量和成员方法
成员变量:
类的数据部分,可以是基本类型的数据或数组,也可以是另一个类的实例。
成员方法:
用于处理数据,类似于其他语言中的函数,但只能在类中定义。
调用一个类的成员方法,实际上是进行对象之间或用户与对象之间的消息传递。
1、类的定义
类说明语法:
[类修饰符]class类名
[extends父类名]
[implements接口名]{
类型成员变量1;
类型成员变量2;
….
修饰符类型成员方法1(参数列表){
类型局部变量;
方法体
}
修饰符类型成员方法2(参数列表){
类型局部变量;
方法体
}
…..
}
成员方法定义
成员变量定义
5
1、类的定义
类修饰符(Modifier):
public:
允许其他类(没有限制)访问本类,一个
源文件仅可以有一个public类
缺省:
可被当前包中的其他类访问
abstract:
没有实例的抽象概念类,是它的所有子类
的公共属性和公共方法的集合
final:
不能再被扩展,不能有子类的类;易于安全
性的实现,或用于创建固定功能的类
父类继承声明:
extends父类名
实现接口(interface):
implements接口名
1、类的定义
例:
publicabstractclassshape{
……
}
classrectangleextendsshape{
……
}
finalclassroundrectextendsrectangle{……
}
注意:
final可以与abstract一起使用吗?
final和abstract,private和abstract,static和abstract,这些是不能放在一起的修饰符。
因为abstract修饰的方法是必须在其子类中实现(覆盖),才能以多态方式调用,以上修饰符在修饰方法时子类都覆盖不了这个方法。
在程序中定义抽象出的类
新类必须在已有类的基础上构造。
在已有类的基础上构造新类的过程称为派生。
派生出的新类称为已有类的子类。
已有类称为超类(父类)。
子类继承父类的属性和方法。
当没有显式指定父类时,父类隐含为java.lang包中的Object类。
Java类和对象
1、类的定义
2、对象的创建、初始化和使用
3、构造方法
4、成员变量和成员方法
2、对象的创建、初始化和使用
对象(实例instance):
以类为模板创建的
具体实例(实际个体)
创建某个类的具体对象(类似变量声明)
类名欲创建的对象名=new类名(参数表);
例如:
Strings=newString(“Hello!
”);
2、对象的创建、初始化和使用
对象定义
格式:
类名变量名;
如语句“Pointp;”定义了Point类的对象p。
注意现在的对象p还没有实例化,并没有被分配内存,其初值为null。
对象初始化
格式:
变量名=new类名(参数列表);
对象初始化即为实例化,实际上是给对象分配内存。
当一个对象实例不被任何变量引用时,java会自动启动垃圾回收机制。
当对象作为方法的参数时,它传递的是对象的引用。
上面定义对象和实例化对象的两个语句,可用下面的一个语句来完成:
类名变量名=new类名(参数列表);
2、对象的创建、初始化和使用
对象使用
使用对象的数据和方法的格式如下:
对象引用.成员数据;
对象引用.成员方法(参数列表);
ClassPoint{
intx,y;
voidmoveTo(intx1,inty1)
{x=x1;y=y1;}
}
Pointp=newPoint();
//一句话定义对象并实例化
p.x=p.y=20;
//给对象的x,y赋值
System.out.println(“p.x=”+p.x);
System.out.println(“p.y=”+p.y);
//使用成员数据
p.moveTo(30,30);
//使用成员方法
System.out.println(“p.x=”+p.x);
System.out.println(“p.y=”+p.y);
Java类和对象
1、类的定义
2、对象的创建、初始化和使用
3、构造方法
4、成员变量和成员方法
3、构造方法
构造方法是特殊的成员方法,用来初始化对象。
名字和类名完全相同,没有返回值。
创建对象时由new运算符自动调用构造方法。
在构造方法前不能用修饰词void,因为它的返回值类型就是类本身。
3、构造方法
例如:
PublicclassPerson{
intid;
intage;
Person(intn,inti){
id=n;
age=i;
}
}
Java类和对象
1、类的定义
2、对象的创建、初始化和使用
3、构造方法
4、成员变量和成员方法
4、成员变量和成员方法
声明成员变量(member)的语法
[修饰符]数据类型变量名;
引用:
对象名.变量名
修饰符
访问控制符
public:
可被所有其他类引用
private:
仅可被该类自身引用和修改,不能被其他任何类(包括该类的子类)引用,它提供了最高级别的保护。
4、成员变量和成员方法
protected:
该类自身、子类、同一包中的其他类
缺省:
本包中的类
非访问控制符:
static:
类成员变量,对所有的实例一致,指定该变量被同一类的所有对象使用。
引用时前缀可使用类名或对象名。
final:
数值不变常量,指定该变量的值不能改变,定义同时应对其进行初始化。
成员变量的声明
例:
classshape{privateintx;
privateinty;
staticfinalfloatMaxArea=100.0f;
……
}
类成员变量(静态变量)
静态变量——为类的各实例共享的变量。
static静态变量名;
位于类的内存区域中,为该类的各个对象共享。
无此限定符的变量是实例变量。
classex{
inti;
staticintj;
staticfinalintk=10;
---
}
final常量可同时定义为static
方法的声明
定义对类内成员变量(数据)的操作
方法的声明语法:
[修饰符]<返回类型><方法名>(<参数列表>)
[throws例外名]{
方法体;
}
方法是类的动态属性,标志了类所具有的功能和操作。
类的方法定义规则
方法名后的小括号是方法的标志。
形式参数是方法从调用它的环境输入的数据。
返回值是方法在操作完成后返还给调用它的环境的数据。
要指定方法返回值类型。
如没有返回值,类型要写void
方法名相同,但参数不同,是不同的方法。
与类名相同的所有方法都是类的构造方法。
方法体的定义
在方法中定义的变量称为局部变量。
其生命周期:
执行进入方法体时建立,退出方法时撤消。
局部变量使用之前必须初始化。
在方法体中可以访问所有的类属性,可以调用所有类中定义的方法。
方法可以递归调用。
一个类作为整体对程序的其他部分可见,并不能代表类内的所有成员变量和方法也同时对程序的其他部分可见,前者只是后者的必要条件。
成员变量和方法的可见性:
域和方法的访问限定符
域和方法的访问限定符
为了使对象具有良好的封装性,一般将类的实例变量设计成私有。
为了使其它类或对象能够访问私有实例变量,本类必须提供访问私有变量的方法(公共方法)。
按照惯例,读私有变量的方法取名为get…
写私有变量的方法取名为set…
方法的声明(续)
返回类型:
void、return
参数列表:
参数类型可为类类型
throws:
通过本方法中会产生的例外(异常)类型,提醒调用者要对相应的可能例外进行处理。
当执行此方法并发生了例外时,程序会转入调用者编制的例外处理程序段。
参数传递内存解析
小结—类与对象
访问一个类:
创建该类的对象,并使用该类对象的可见属性与方法。
调用该类的可见静态方法,访问该类的可见静态属性。
继承该类。
final
final类不能被继承。
final方法不能被覆盖。
final域不能被修改。
抽象
在软件开发方法中使用的抽象有两类:
过程抽象和数据抽象。
过程抽象将整个系统的功能划分为若干部分,强调功能完成的过程和步骤。
数据抽象把系统中需要处理的数据和这些数据上的操作结合在一起,根据功能、性质、作用等因素抽象成不同的抽象数据类型。
每个抽象数据类型包含了数据,也包含了针对这些数据的授权操作。
面向对象的软件开发采用数据抽象的方法来构建程序的类、对象和方法。
抽象类
抽象方法:
只有方法定义,没有方法体。
抽象类:
含有抽象方法的类。
abstractclassPet{
publicabstractvoidspeak();
}
classDogextendsPet{
publicvoidspeak(){
System.out.println(“Woof”);}
}
classCatextendsPet{
publicvoidspeak(){
System.out.println(“Meow”);}
}
抽象类
publicclassTestPet{
publicstaticvoidmain(Stringargs[])
{
PetmyPet[]=newPet[2];//创建数组
myPet[0]=newDog();
myPet[1]=newCat();
for(inti=0;i<2;i++)
myPet[i].speak();
}
}
主类
如果一个类包含任何抽象方法,包括继承的,则这个类必须被声明为abstract类;如果一个类是抽象的,则不能创建该类的对象。
抽象类强制要求它的所有子类重写自己的抽象方法。
抽象类与最终类
abstract抽象类:
没有具体对象的概念类
较高层次的概括。
抽象类的作用是让其他类来继承它的抽象化的特征。
在程序中不能用抽象类作为模板来创建对象。
一个抽象类的子类如果不是抽象类,则它必须为父类中的所有抽象方法书写方法体。
final最终类:
该类不能有子类。
封装
在面向对象的程序设计中,抽象数据类型是用“类”来代表的。
对象的全部属性数据和对数据的全部操作结合在一起,形成一个统一体,也就是对象;
尽可能地隐藏对象的内部细节,只保留有限的对外接口,对数据的操作都通过这些接口,即用方法来实现。
实现了信息的隐藏及安全性
提高了程序的模块化,且易于维护
继承
继承(inheritance)
体现了对现实世界的抽象模拟
提高了代码的复用性
继承(Inheritance)
类与类之间的联系
动态:
引用
静态:
继承
类创建时,可选择继承已存在的类,则新类将自动拥有原有类的非私有属性和方法。
新类成为子类,原有类则是父类,Java中也称父类为超类。
Java要求每个类都有父类。
Java只支持单继承。
继承
体现了对现实世界的抽象模拟。
提高了代码的复用性。
44
继承允许创建等级层次的类
extends派生或扩展因而子类也称为派生类
若子类与父类不在一个包里,对于父类中定义的缺省访问修饰符限定的成员,子类也不能访问,因为java默认情况下的访问权限是包范围
隐含为java.lang包中的Object类
继承
构造方法的继承
子类或定义自己的构造方法,或使用隐含构造方法。
子类没有定义构造方法时,自动继承父类不含参数的构造方法,并在创建新子类对象时自动执行。
子类有自己的构造方法时,创建新子类对象时也要先执行父类中显示定义的不含参数的构造方法,再执行自己的构造方法。
若此时父类没有定义相应的无参构造方法,将会引发错误。
或者指定要调用的父类构造方法。
子类的构造方法定义中,如要调用父类的含参数的构造方法,需用super关键字,且该调用语句必须是子类构造方法的第一个可执行语句。
继承
classAnimal{
publicintage;
publicStringtype;
publicAnimal(){
System.out.println(“I'manAnimal!
");
}
publicAnimal(intval,Stringt){
this.age=val;
this.type=t;
System.out.println(“I'manAnimal");
}
}
父类
继承
子类
classDogextendsAnimal{
publicDog(intval,Stringt){
//super(3,"dog");
this.age=val;
this.type=t;
System.out.println("I'maDog");
}
publicvoidsound(){
System.out.println(“I'ma”+this.type+”;I’m”+this.age);
}
}
继承
publicclassTestDog{
publicstaticvoidmain(Stringargs[]){
Dogd=newDog(3,“nicedog”);
d.sound();
}
}
主类
I’manAnimal
I’maDog
I’manicedog;I’m3
this与super
this和super是常用来指代子类对象和父类对象的关键字。
Java系统默认,每个类缺省地具有null、this和super三个域,所以在任意类中都可以不加说明而直接使用它们。
this表示的是当前对象本身,更确切地说,this代表了当前对象的一个引用。
利用this可以使用当前对象的域,调用当前对象的方法。
super表示的是当前对象的直接父类对象,是当前对象的直接父类对象的引用。
this例
classLeaf{
privateinti=0;
Leafincrement(){
i++;
returnthis;
}
voidprint(){
System.out.println("i="+i);
}
}
publicclassa{
publicstaticvoidmain(String[]args){
Leafx=newLeaf();
x.increment().increment().increment().print();
}
}
Java中的多态
多态:
同一程序中同名的不同方法共存
多态是面向对象程序设计中的一个特性,其目的是提高程序的抽象度、封闭性和简洁性。
Java提供两种多态机制:
重载和覆盖。
可以通过子类对父类方法的覆盖实现多态。
可以利用重载(overload)在同一个类中定义多个同名的方法。
多态情况下进行方法调用时,如何区分这些同名的不同方法
不同类中的同名方法:
冠以类名以示区别
同类中的同名方法:
用不同的参数列表(参数的个数,类型,顺序的不同)来区别同名的不同方法
重载(OverLoading)
重载:
用同一个名字来表示不同的方法。
这些方法同名的原因是,它们的最终功能和目的都相同,但由于在完成同一功能时,可能遇到不同的具体情况,所以需要定义含不同具体内容的方法。
方法名必须相同(同一类中定义不同的同名方法)。
方法的参数必须不同(同名不同方法是靠不同形式的参数列表来区分,包括形式参数的个数、类型、顺序的不同)。
返回类型可以不同,但不是重载的标志。
Java以方法名和参数列表作为一个方法的唯一标识。
重载
classMethodOverLoading{
publicvoidreceive(inti){
System.out.println(“i=”+i)
}
publicvoidreceive(inti,intj){
System.out.println(“i=”+i+”;andj=”+j);
}
publicvoidreceive(Stringstr1;Stringstr2){
System.out.println(“str1=”+str1”;andstr2=”+str2);
}
}
方法重载
重载
publicclassTest{
publicstaticvoidmain(Stringargs[]){
inti=20,j=30;
Stringstr1=“hello”,str2=“world”;
MethodOverLoadingoverload=newMethodOverLoading();
overload.receive(i);
overload.receive(i,j);
overload.receive(str1,str2);
}
}
主类
重载
构造器重载
构造器是一种没有返回值的特殊方法。
Card
intcardNumber//卡号
intpassword//密码
doublebalance//余额
重载
不同构造方法
重载
调用不同的构造方法
Cardmycard=newD200_Card();
Cardmycard=newD200_Card(20102109);
Cardmycard=newD200_Card(20102109,1234);
Cardmycard=newD200_Card(20102109,1234,50.0);
构造方法之间的调用
在一个构造方法中,当使用this并给它一个参数列表时,this显式调用参数匹配的另一个构造方法。
D200_Card(longcn){
cardNumber=cn;}
D200_Card(longcn,intpw){
this(cn);
password=pw;}
重载
classEmployee{
privateStringname;
privateintage;
privatefloatsalary;
publicEmployee(Stringn,inta,floats){
name=n;
age=a;
salary=s;
System.out.println(salary);
}
publicEmployee(Stringn,inta){
this(n,a,300);
System.out.println(salary);
}
}
58
重载
publicclassTest{
publicstaticvoidmain(Stringargs[]){
Stringn=newString("zhou");
inta=23;
floats=5000.0F;
Employeeem=newEmployee(n,a,s);
Employeeem2=newEmployee(n,a);
}
}
主类
覆盖
子类的某些特征可能与从父类继承而来的特征有所不同。
为了体现子类的这种个性,Java允许子类对父类的同名方法重新进行定义,即子类可以定义与父类方法同名但其内容不同的方法。
值得注意的是:
在覆盖的同名方法中,子类方法不能比父类方法的访问权限更严格。
在子类中,若要使用父类中被隐藏的方法,可以使用super关键字。
平面二维点类Point定义:
classPoint{
intx,y;
Point(intx1,inty1)
{x=x1;y=y1;}
Point(){this(0,0);}
}
空间三维点类Point3D:
classPoint3DextendsPoint{
intz;//新增成员变量
publicPoint3D(intx,inty,intz)
{super(x,y);
this.z=z;}//新的构造方法
publicPoint3D()
{this(0,0,0)}
}//新的构造方法
重载VS.覆盖
重载:
以统一的方式处理不同类型数据,实现同名方法完成不同功能的操作。
一个类中的同名方法。
覆盖:
对同一个方法的重写,要求在继承树的父类和子类中分别定义。
方法名:
重载和覆盖都要求方法名是一致的。
不同的是,覆盖还要求返回值、参数类型、参数个数和参数顺序也必须保持一致;而重载恰好相反,它是通过不同的参数列别来识别方法。
重载:
静态多态性;
覆盖:
动态多态性。
63
接口(interface)
Java只允许单继承
接口:
只有抽象方法和常量的抽象类
接口定义的仅仅是实现某一特定功能的一组方法的对外接口和规范,而并没有真正地实现这个功能。
接口的功能实现是在“继承”了这个接口的各个类中完成的,由这些类来具体定义接口中所有抽象方法的方法体。
通常把对接口的“继承”称为“实现”。
接口中只能定义staticfinal属性。
63
static静态类方法、类变量
final定义常量
64
接口
接口是一种特殊的类,是作为一个整体声明的抽象方法和常量
方法:
抽象、无定义的(不必写abstract)
常量:
隐含为final和static的
接口定义语法
publicinterface接口名[extends父接口名列表]
{//常量域声明
publicstaticfinal域类型域名=常量值;
//抽象方法声明
publicabstract返回值类型方法名(参数列表);
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 窗口 网络 编程 面向 对象 oommttpptConvertor