1. 首页
  2. 文档大全

第4章Java语言的面向对象基础

上传者:20****2 2022-06-08 14:41:18上传 PPT文件 1.06MB
第4章Java语言的面向对象基础_第1页 第4章Java语言的面向对象基础_第2页 第4章Java语言的面向对象基础_第3页

《第4章Java语言的面向对象基础》由会员分享,可在线阅读,更多相关《第4章Java语言的面向对象基础(63页珍藏版)》请在文档大全上搜索。

1、第第4章章 Java面向语言对象基面向语言对象基础础兰州理工大学计算机与通信学院兰州理工大学计算机与通信学院本本章章主要内容主要内容vJavaJava的类与对象的类与对象vJavaJava的的继承与子类继承与子类vJavaJava的抽象方法的抽象方法vJavaJava的抽象类的抽象类vJavaJava的内部类的内部类vJavaJava的接口的接口vJavaJava的包的包vJavaJava的修饰符的修饰符4.1 Java的类与对象的类与对象 类是用来创建对象的模板,它包含被创建对象类是用来创建对象的模板,它包含被创建对象的属性和方法的定义。因此,要学习的属性和方法的定义。因此,要学习JavaJ

2、ava编程就必须编程就必须学会怎样去编写类,即怎样用学会怎样去编写类,即怎样用JavaJava的语法去描述一类的语法去描述一类事物共有的属性和行为。对象的属性通过变量来描事物共有的属性和行为。对象的属性通过变量来描述,而对象的行为通过方法来实现。方法可以操作属述,而对象的行为通过方法来实现。方法可以操作属性形成一定的算法来实现一个具体的功能。类把属性性形成一定的算法来实现一个具体的功能。类把属性和方法封装成一个整体。和方法封装成一个整体。4.1.1 Java语言中类的声明语言中类的声明在Java语言中,类是基本的构成要素,所有的对象都是由类创建的。一个Java类主要包括以下两部分:类的声明类的

3、主体在类声明中,需要定义类的名称、对该类的访问权限、该类与其他类的关系等。类声明的格式如下:修饰符 class extends 父类名 implements 接口列表 /类的主体成员变量的定义;成员方法的定义;4.1.1 Java语言中类的声明语言中类的声明修饰符 用于指定类的访问权限,可选值一般为public、abstract和final。 用于指定类的名称,类名必须是合法的Java标识符。extends 父类名用于指定要继承的父类。implements 接口列表 用于指定该类实现的所有接口。类声明部分大括号中的内容为类体。类体主要由以下两部分构成:(1)成员变量的声明;(2)成员方法的声明

4、。Java语言中,提供了四种(private、default、protected和public)不同的访问控制修饰符,对类的成员施以一定的访问权限限制,实现对类中成员在一定范围内的信息隐藏。访问级别修饰符同类同包子类不同包公开publicYesYesYesYes保护protectedYesYesYesNo默认无修饰符YesYesNoNo私有privateYesNoNoN Java 语言还提供了其他一些修饰符,主要有语言还提供了其他一些修饰符,主要有abstract、final、synchronized和和static等。等。 abstract:可以修饰一个类或者方法。:可以修饰一个类或者方法。

5、 final:可以修饰非抽象类,非抽象方法和变:可以修饰非抽象类,非抽象方法和变量。量。 Synchronized:同步修饰符。可以用来修饰块同步修饰符。可以用来修饰块语句和成员方法。语句和成员方法。 static:用来修饰类的成员变量,成员方法和块用来修饰类的成员变量,成员方法和块语句。语句。4.1.1 Java语言中类的声明语言中类的声明例4-1,以下定义一个Person类,public class Personint age;String name;char sex;public void speek()System.out.println(Hello everyone!); publi

6、c void walk() System.out.println(This is the character of person!); 4.1.2 成员变量和局部变量成员变量和局部变量Java中所有的变量都必须封装在类体中,它没有全局变量,也就是不能在类的外面声明任何变量。在方法的外面定义的变量称为类成员变量,而在方法体中声明的变量和方法的参数则称为局部变量。声明成员变量Java用成员变量来表示类的状态和属性,声明成员变量的基本语法格式如下:修饰符 static final =变量初始值;4.1.2 成员变量和局部变量成员变量和局部变量例4-2,以下程序在类Person中定义了5个成员变量,p

7、ublic class Personprivate int age;/声明私有变量ageprivate String name;/声明私有变量nameprivate char sex;/声明私有变量sexpublic final int EYE=2;/声明公有的final变量EYEpublic static int counter=0;/声明公有的static型变量counterpublic void speek()System.out.println(Hello everyone!);public void walk()System.out.println(Hello everyone!);

8、4.1.2 成员变量和局部变量成员变量和局部变量声明局部变量声明局部变量的基本语法格式同声明成员变量类似,所不同的是不能使用权限修饰符和static关键字对局部变量进行修饰,但可以使用final关键字。其基本语法格式如下: final =初始化值;4.1.2 成员变量和局部变量成员变量和局部变量例4-3 局部变量的声明和使用public class MyMathpublic int result;public void sum(int a,int b)int x;x=a+b;result=x;System.out.println(x=+x);4.1.2 成员变量和局部变量成员变量和局部变量变量

9、的作用域是指该变量在程序代码中的作用区域,在该区域外不能直接访问变量。有效范围决定了变量的生命周期,变量的生命周期是指从声明一个变量并分配内存空间、使用变量,然后释放该变量并清除所占用内存空间的一个过程。进行变量声明的位置,决定了变量的有效范围,根据有效范围的不同,可将变量分为以下两种。成员变量:在类中声明,整个类中有效。局部变量:方法的参数和在方法内或方法内的复合代码块( “”与“”之间的代码)中声明的变量。在复合代码块声明的变量,只在当前复合代码块中有效;在复合代码块外声明的变量从变量的声明开始到整个方法结束内都有效。4.1.2 成员变量和局部变量成员变量和局部变量例4-4 变量的作用域p

10、ublic class MyMathpublic int result;/成员变量,在整个类中有效public void sum1(int a,int b)/a,b为局部变量,在sum1整个方法内有效int c;/为局部变量,在整个方法内有效c=a+b;result=c;int y=10;/为局部变量,在块内有效if(cy)System.out.println(c=+c);System.out.println(y=+y)4.1.2 成员变量和局部变量成员变量和局部变量例4-4 变量的作用域(续) System.out.println(c=+c);System.out.println(y=+y)

11、;/错误行!y为块局部变量,块外调用失效public void sum2(int a,int b,int c)/a,b,c为局部变量,在sum2整个方法内有效result=a+b+c;4.1.3 成员方法的声明成员方法的声明Java中类的行为由类的成员方法来实现。类的成员方法由方法声明和方法体两部分组成。其一般格式如下: 修饰符修饰符 ( ( 参数列表参数列表) ) 方法体 4.1.3 成员方法的声明成员方法的声明例4-5 在Java类中声明成员方法 public class MyMathprivate int result;private static int counter;public

12、void MyMath()counter+;public void sum1(int a,int b) result=a+b; 4.1.3 成员方法的声明成员方法的声明例4-5 在Java类中声明成员方法(续)protected void sum2(int a,int b,int c)result=a+b+c;public int getResult()return result;public static int getCounter()return counter;private void tempMothd(int tmp,String st) 4.1.3 成员方法的声明成员方法的声明例

13、4-6 在方法外的数据运算操作和在方法内定义方法public class MyMathprivate int result; static int counter;counter+;Public void tempMothd(int tmp,String st)int x=10;public int innerMothd() 4.1.4 方法的重载方法的重载Java语言允许在同一个类中定义多个同名的方法,把这种现象称为方法的重载(overload),重载的方法必须具有不同的参数类型或者不同的参数个数。 P109 方法的重载4.1.4 方法的重载方法的重载JavaJava语言中关于方法重载的几点

14、说明:语言中关于方法重载的几点说明: 一个方法可以被多次重载。 一个类中可以有多个重载的方法。 重载的方法,其参数列表必须不同。包括参数个数,参数的类型和顺序的不同。 在方法重载时,方法返回值的类型不能作为区分方法重载的标志。 在执行重载方法时,将根据调用参数的个数和类型区分具体执行的是哪个方法。 重载的方法之间并不一定必须有联系,但是为了提高程序的可读性,一般只重载功能相似的方法。4.1.5构造方法构造方法构造方法是一种特殊的方法,它的名字必须与它所在类的名字完全相同,并且没有返回值,也不需要使用关键字void进行标识。其基本语法格式为: 修饰符修饰符 ( ( 参数列表参数列表) ) 方法体

15、 4.1.5构造方法构造方法例4-8 构造方法的声明 public class MyMathpublic MyMath()/声明类MyMath的构造方法System.out.println(Hello,welcome!);private int result;public void sum(int a,int b,int c)result=a+b+c;System.out.println(a+b+c=+result);4.1.5构造方法构造方法构造方法用于创建对象,初始化对象空间,为对象中的所有成员变量进行初始化,构造方法在创建对象时立即被调用。构造方法的说明: (1)构造方法可以有参数列表,

16、参数由new运算符创建对象时提供。 (2)如果程序员不提供构造方法,Java会提供一个无参的构造方法。 (3)如果程序员定义了构造方法,Java不再提供默认的构造方法。 (4)构造方法可以有多个,即构造方法的重载。 (5)重载的构造方法可以通过this(参数列表 )来调用已有的构造方法,其他方法和类对象都不能调用构造方法。4.1.6 对象对象在Java语言程序设计中,可以把任何事物都看做对象,例如一个人、一个动物,或者没有生命体的轮船、汽车、飞机,甚至概念性的抽象,例如一门课程。在实际对象程序设计中,对象可以看作是由一些数据和对这些数据操作的一组方法构成。用变量表示对象的属性,用方法表示对象的

17、行为。一个对象在Java语言中的生命周期包括3个阶段,即 声明和创建对象声明和创建对象 使用对象使用对象 销毁对象销毁对象4.1.6 对象对象1.声明和创建对象 类是对对象的抽象,对象是对类的具体实现,当使用一个类创建了一个对象时,就说给出了这个类的一个实例,只有通过对象才可以访问变量、调用方法(static变量、static方法除外)。Java定义任何变量都需要指定变量类型,因此,在创建对象之前,一定要先声明该对象。声明对象的一般格式如下:类名 对象名;4.1.6 对象对象在声明对象时,只是在内存中为对象建立了一个引用,并置初值为null,表示不指向任何内存空间。声明对象以后,需要为对象分配

18、内存,这个过程也称为实例化对象。在Java中使用关键字new来实例化对象,一般语法格式如下:对象名=new 构造方法名(参数列表);以上声明和创建对象的两个过程,也可以简化为以下一个过程: 类名 对象名=new 构造方法名(参数列表);Person p1,p2;P1=new Person();P2=new Person(“zhang san”,22,f);或者:或者:Person p1=new Person();Person P2=new Person(“zhang san”,22,f);4.1.6 对象对象2.2.对象的使用对象的使用创建对象后,就可以访问对象的成员变量,并改变成员变量的值了

19、,而且还可以调用对象的成员方法。通过使用点号运算符“.”实现对成员变量的访问和成员方法的调用。语法格式为:对象.成员变量; 对象.成员方法( );3.1.6 对象对象3.3.对象的销毁对象的销毁在许多程序设计语言中,需要手动释放对象所占用的内存,但是,在Java中则不需要手动完成这项工作。Java提供的垃圾回收机制可以自动判断对象是否还在使用,并能够自动销毁不再使用的对象,收回对象所占用的资源。Java提供了一个名为finalize()的方法,用于在对象被垃圾回收机制销毁之前执行一些资源回收工作,由垃圾回收系统调用,可以重写该方法。但是垃圾回收系统的运行是不可预测的。finalize()方法没

20、有任何参数和返回值,每个类有且只有一个finalize()方法。4.1.74.1.7关键词关键词 thisthis的用法的用法 每个方法内都有一个隐含的指针,指向“调用该方法的当前对象”,称为this指针。This指针只能在方法内部使用。通俗地说就是,这个this指针是每一个方法内置的,当对象调用某一个方法时,它的这个this指针就指向这个对象了。 this指针的用法: 1.代替对象,访问对象的数据; 2.作为返回值使用,当需要返回一个对象时,就可以在return语句里使用this。 3.调用构造函数4.2 4.2 继承与子类继承与子类 继承是面向对象程序设计的基础,通过继承可以在已有类的基础

21、上创建新的类,新类不但可以拥有原有类的属性和方法,同时也可以定义自身特有的属性和方法。通过继承从而实现了代码的复用,提高程序的可维护性,加快软件工程的开发周期。 通常把已有类称为父类,而新创建的类称为子类。在Java语言中,可以通过使用关键字extends来指明其继承关系,如果一个类没有明确的父类,则其父类默认父类为Object类。通过已有类创建新类时,新类可以拥有父类所有非私有的属性和方法,把这个特性称为类的继承性。4.2.1 4.2.1 子类的创建子类的创建语法格式为: 修饰符修饰符 class class 子类名子类名 extends extends 父类名父类名 /变量声明;/方法声明

22、; 例例4-11 4-11 类的扩展类的扩展4.2.1 4.2.1 子类的创建子类的创建Java语言中子类继承父类时必须遵循以下原则: 子类不能继承被声明为private的成员变量和成员方法。 没有多重继承机制,一个子类只能有一个直接父类。 如果子类声明了一个与父类的成员变量同名的成员变量,则子类不能继承父类的成员变量,此时称子类的成员变量隐藏了父类的成员变量。 如果子类声明了一个与父类的成员方法相同的成员方法,则子类不能继承父类的成员方法,此时称子类的成员方法重写了父类的成员方法。 类的方法和属性可以被继承,但是类的构造器不能被继承。4.2.2 4.2.2 方法的重写和变量隐藏方法的重写和变

23、量隐藏Java语言允许在子类中定义与父类相同的成员变量和相同的成员方法。子类可以继承父类的非私有成员变量和成员方法(不是以private关键字修饰的)。变量的隐藏就是指在子类中声明的成员变量与父类的成员变量同名,父类的成员变量将在子类中被隐藏。方法的重写(Overwrite)就是指在子类中声明的成员方法与父类的成员方法同名,并且参数个数、类型和成员方法的返回类型完全相同,称子类的成员方法重写了父类的成员方法。在子类中要访问父类中被子类隐藏的成员变量和重写了的方法时,可以使用super关键字来实现调用。基本格式为:super.super.成员变量名;成员变量名;super.super.成员方法名

24、成员方法名(参数列表参数列表);另外,子类可以调用父类的构造方法。但是必须在子类的构造方法中使用super关键字来调用。其语法格式如下: super(super(参数列表参数列表););例4-12 super关键字的使用Java语言中变量隐藏和方法重写的几点说明: 隐藏了的变量和重写了的方法只能通过super访问。 一个方法在子类中只能重写一次。 父类的静态方法不能被子类重写为非静态方法。 重写的方法必须有相同的方法名和参数列表和返回类型。 子类中重写的方法不能使用比父类中被重写方法更严格的访问权限。比如public修饰的方法,在重写不可以申明为默认型(default)或者protected和

25、private型。4.3 4.3 抽象方法抽象方法抽象方法就是指只有方法的声明,没有方法的实现,或者说是没有方法体的特殊方法。在程序设计时,有时只需声明对象的功能,不指出其实现细节时,就可以使用抽象方法,其修饰符必须要有abstract关键词。基本格式为: 修饰符修饰符 abstract abstract 方法名方法名( (参数列表参数列表););4.3 4.3 抽象方法抽象方法注意:抽象方法不能使用private、final或static关键字进行修饰。以下代码声明了一个抽象方法:public abstract void speekLanguage( String st);注意:抽象方法和空

26、方法是两个不同的概念。以下代码声明了一个空方法:public void speekLanguage(String st)4.4 4.4 抽象类抽象类抽象类是它的所有子类的公共属性的集合,是包含一个或多个抽象方法的类。使用抽象类的一大优点就是可以充分利用这些公共属性来提高开发和维护程序的效率。抽象类定义的基本格式: 修饰符修饰符 abstract class abstract class 类名类名 成员变量声明抽象方法的声明非抽象方法的声明 4.4 4.4 抽象类抽象类对于抽象类的几点说明如下: 凡是用abstract 修饰符修饰的类被称为抽象类。 抽象类中可以有零个或多个抽象方法,也可以包含非

27、抽象的方法。 抽象类可以没有抽象方法,但是,有抽象方法的类必须是抽象类。 抽象类可以派生子类,子类中必须实现抽象类中定义的所有抽象方法,否则其子类也为抽象类。 抽象类不能创建对象,创建对象的工作由抽象类派生的子类来实现。 abstract不能与final并列修饰同一个类。4.5 4.5 内部类内部类内部类(Inner Class)是指在其它类内部嵌套定义的类,也就是说在一个类的内部又定义了一个类。相对而言,包含内部类的类称为外部类。内部类和一般类相同,同样可以具有成员变量和成员方法。外部类使用内部类的成员变量和成员方法时,必须创建内部类的对象,通过内部类的对象调用。内部类的成员变量一般不声明为

28、静态(static)类型的,除非这个内部类也被声明为静态(static)的。内部类的分类内部类的分类根据内部类的特性,可以把内部类分为以下4种形式:成员内部类成员内部类局部内部类局部内部类静态内部类静态内部类匿名内部类匿名内部类1.成员内部类成员内部类 成员内部类就是在类的内部,成员方法和块之外定义的内部类,属于类的全局成员。 内部类可以访问外部类的私有成员,类似于成员变量,它可以使用访问修饰符。 在外部类之外使用内部类时,必须先构造一个外部类对象,然后通过外部类对象的应用“.new”构造内部类对象。 2.匿名内部类匿名内部类 匿名内部类,就是没有类名的内部类,是一个特殊局部内部类,这个类一般

29、是用来继承一个类或者实现一个接口的,而且我们只会创建这个内部类的一个对象。构造方法: new className() 匿名内部类常用来创建接口的实现,或者创建某个类的子类,并重写父类的方法。4.6 Java4.6 Java的接口的接口4.6.1什么是接口什么是接口 Java中的接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能)。 接口的本质不是用以替换多重继承,而是更有效的组织不同类之间的共享机制和对象间的相互通信。接口以协议的形式建立了类之间的松散关系。体现了行为规范和行为实现的

30、分离实现松散耦合。使用接口强化了面向对象中程序设计中“自给自足”和“松散耦合”的设计原则。4.6.2 4.6.2 接口的声明接口的声明Java语言使用关键字interface来定义一个接口。接口定义与类的定义类似,也是分为接口的声明的接口体,其中接口体由常量定义和方法定义两部分组成。语法格式如下: 修饰符修饰符 interface interface 接口名接口名 extends extends 父接口名列表父接口名列表 public static final 常量; public abstract 方法; 3.6.2 3.6.2 接口的声明接口的声明public interface Anim

31、alAbleint legs=4;void eatFood(); 4.6.3 4.6.3 接口的实现接口的实现接口声明中的方法全部是抽象的,这些方法由使用接口的类去实现。接口不能直接创建对象,要使用接口中的方法,必须通过相关的类来实现接口中的方法。在前讲过,类的完全定义格式如下:修饰符 class extends 父类名 implements 接口列表 /类的主体成员变量的定义;成员方法的定义;4 4.6.3 .6.3 接口接口继承继承在Java程序中,接口可以看成是一种特殊的类,接口可以实现多重继承。像类一样,使用关键字extends生成子接口。与类不同的是,类只能有一个父类,而接口是可以有

32、多个父类,即接口可以实现多重继承。4.7 4.7 抽象类与接口的区别抽象类与接口的区别 抽象类和接口是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,赋予了Java强大的面向对象能力。其实,两者之间还是有很大的区别的,对于它们的选择甚至反映出对于问题领域本质的理解、对于设计意图的理解是否正确、合理。4.8 Java4.8 Java语言的包语言的包 包(package)是Java语言程序设计的重要特色之一,是若干相关的类、接口和(子)包的集合,这为管理大量的类和接口提供了方便,也保证了这些类和接口的使用安全。Java语言要求文件名和类名相同,所以如果将多个类放在一起时,

33、很可能出现文件名冲突的情况,Java提供了一种解决该问题的方法,那就是使用包将类进行分组,提高访问速度。4.8.1 4.8.1 包的概念包的概念 包(package)是Java提供的一种区别类的命名空间的机制,是类的组织方式,是一组相关类、接口和(子)包的集合,它提供了访问权限和命名的管理机制。Java语言中包的使用有以下几个原因:(1)将功能相近的类放在同一个包中,可以方便查找与使用。(2)命名的方便,不同包中可以存在同名类,包在一定程度上可以避免命名冲突。(3)安全性,在Java中类的访问权限可以以包为单位。4.8.2 4.8.2 创建包创建包Java语言不但提供了大量的系统包(后面介绍)

34、,同时也允许程序员创建自己的包。创建包可以通过在类或接口的源文件中使用package语句实现。4.8.3 4.8.3 声明包声明包用package语句在定义类/接口中的语法格式如下: package pkgname;/声明包pkg类或者是接口的声明;package语句用来声明一个包,指明该源文件生成的类或者是接口属于包pkg。包的名称必须为合法的Java标识符。包的每个单词用小写。当包中还有子包时,可以使用“pkg1.pkg2.pkgn”进行指定,其中,pkg1为最外层的包,而pkgn则为最内层的包。4 4. .8 8. .4 4 包的生成包的生成包的存在是以目录(UNIX或者Linux中叫做

35、路径)的形式存放的,所以包名对应的是目录或者路径。在例4.24中,声明了一个people包,所以必须有一个目录来存放类Person。创建目录有两种方式。第一,手工建立目录people,然后编译类Person,将编译后的class文件放在people目录下。第二,使用javac -d . Person.java自动生成目录,同时自动将生成的class文件放在包people中。4.9 4.9 包中类的使用包中类的使用 类可以访问其所在包中的类,还可以使用其他包中的所有public修饰的类。访问其他包中类可以有以下两种方法。(1) 使用长名引用包中的类使用长名引用包中的类比较简单,只需要在每个类名前

36、面加上完整的包名即可。例如,创建Test类(保存在people包中)的对象并实例化该对象的代码如下: people.Person p=new people.Person();(2) 使用import语句引入包中的类由于采用使用长名引用包中的类的方法比较繁琐,所以Java提供了import语句来引入包中的类。import语句的基本语法格式如下:import pkg1.pkg2.类名 * ;当存在多个包名时,各个包名之间使用“.”分隔,同时包名与类名之间也使用“.”分隔。可以使用*引入包下所有的类。4.10 Java4.10 Java的系统包的系统包Java语言目前的JDK提供将近4000个基础类

37、和接口,这些类和接口按照其各自的功能和类别放在不同的包里。开发人员要使用这些包,必须通过import语句引入才能使用,不过有一个特例,java.lang包下的类不需要导入就可以直接使用,这是因为Java系统在编译时会自动的引入。课堂练习题课堂练习题1.定义一个类A,类中有一个private的整型变量data、设置变量data的方法setData()及获取变量data的方法getData()。编写应用程序测试类A,实现数据的访问和修改。2.定义一个类A,类中有一个private的整型变量data;一个private的字符串对象str。类中有一个含参数的构造函数并定义了两个方法,方法头的定义和其功

38、能如下:(1)public A(int d,String s):用来初始化data和str。(2)public void add(int k, String s):该方法把data和str的值分别加上k和s(3)public String toString():该方法把data和str的值转变为字符串返回,便于显示。编写类(Test)测试类A,创建类A对象并使用类A中的两个方法。 3.编写两个类:A和B,类A创建的对象可以计算两个正整数的最大公约数;类B创建的对象可以计算两个数的最小公倍数。要求:类B的一个成员变量是类A的对象。4.定义接口myItfc,接口中只有一个名为area的方法,该方法有一个double类型参数,返回类型也为double。编写一个应用程序,并实现接口myItfc,接口中area方法的实现是返回参数的立方值;在应用程序中调用该方法并输出其结果。


文档来源:https://www.renrendoc.com/paper/212559596.html

文档标签:

下载地址