您好,欢迎访问三七文档
第3章类和接口3.1类3.2接口3.3常用数据结构及类习题3.1类3.1.1类的定义和声明Java编程语言是面向对象的,处理的最小的完整单元为对象。而现实生活中具有共同特性的对象的抽象就称之为类。类由类声明和类体构成,类体又由变量和方法构成。下面给出一个例子来看一下类的构成。【例3.1】自定义一个apple类,在主类SetApple中创建实例并调用方法,输出结果如图3.1所示。源程序代码如下://程序文件名为SetApple.javapublicclassSetApple{publicstaticvoidmain(String[]args){applea=newapple();//创建apple类a.appleweight=0.5;//实例变量赋值System.out.println(苹果的重量为1两);System.out.println(a.bite());//调用实例方法a.appleweight=5;System.out.println(苹果的重量为5两);System.out.println(a.bite());}}//自定义类classapple{//属性longapplecolor;//对应苹果的颜色doubleappleweight;//苹果的重量booleaneatup;//是否吃完//类方法publicbooleanbite(){if(appleweight1){System.out.println(苹果已经吃完了!哈哈);eatup=true;}else{System.out.println(苹果吃不下了!:();eatup=false;}returneatup;}}图3.1自定义类的应用1.类声明的基本格式访问说明符class类名extends超类名implements接口名其中:(1)访问说明符为public或者缺省。public用来声明该类为公有类,可以被别的对象访问。声明为公有的类存储的文件名为类名。(2)类名:用户自定义的标识符,用来标志这个类的引用。(3)超类名:是指已经存在的类,可以是用户已经定义的,也可以是系统类。(4)接口名:即后面讲到的接口。例如:publicclassHelloAppletextendsApplet访问说明符为public,类名HelloApplet,扩展类为JDK包自带的java.applet.Applet类。由于public的存在,所以文件名必须存为HelloApplet.java,同类名保持一致。2.类体类体包括成员变量和方法。(1)成员变量:指类的一些属性定义,标志类的静态特征,它的基本格式如下:访问说明符数据类型变量名其中:●访问说明符有public、private和protected三种:public:省略时默认为公有类型,可以由外部对象进行访问。private:私有类型,只允许在类内部的方法中使用,若从外部访问,必须通过构造函数间接进行。Protected:受保护类型,子类访问受到限制。●数据类型包括基本类型以及用户自定义的扩展类型。(2)方法:是类的操作定义,标志类的动态特征,它的基本格式如下:●访问说明符数据类型方法名(数据类型1变量名1,数据类型2变量名2)其中:●访问说明符为public、private和protected,其使用方法与成员变量访问说明符的使用方法一致。●数据类型:包括基本数据类型和用户自定义的扩展类型。●数据类型为参数。3.创建类的实例使用关键字new进行创建,例如:HelloApplethp=newHelloApplet();例3.1中,自定义类apple,访问标识符缺省,定义三个属性:longapplecolor;//对应苹果的颜色doubleappleweight;//苹果的重量booleaneatup;//是否吃完一个方法为:publicbooleanbite()//类方法{...}公有类SetApplet中引用自定义类,首先创建类的实例:applea=newapple();其次赋初值:a.appleweight=0.5;//实例变量赋值最后调用它的方法:System.out.println(a.bite());//调用实例方法3.1.2类的单继承性Java编程语言中允许用extends关键字从一个类扩展出一个新类,新类继承超类的成员变量和方法,并可以覆盖方法。【例3.2】测试类的单继承性,程序输出结果如图3.2所示。源程序代码如下://程序文件名TestExtend.javapublicclassTestExtendextendsEmployee{publicstaticvoidmain(String[]args){System.out.println(覆盖的方法调用:+getSalary(王一,500));System.out.println(继承的方法调用:+getSalary2(王一,500));System.out.println(覆盖的方法调用:+getSalary(王飞,10000));System.out.println(“继承的方法调用:”+getSalary2(“王飞,10000));}publicstaticStringgetSalary(Stringname,intsalary){Stringstr;if(salary5000)str=名字:+name+Salary:+salary;elsestr=名字:+name+Salary:低于5000;returnstr;}};classEmployee{publicStringname;//名字publicintsalary;//薪水publicstaticStringgetSalary(Stringname,intsalary){Stringstr;str=名字:+name+Salary:+salary;returnstr;}publicstaticStringgetSalary2(Stringname,intsalary){Stringstr;str=名字:+name+Salary:+salary;returnstr;}};程序中定义了父类Employee类,它有两个方法getSalary和getSalary2,方法体的实现都是一致的,都为输出名字和薪水的值。在TextExtend主类中覆盖了getSalary方法,方法体重新定义为薪水低于5000时并不输出薪水的值而是输出“低于5000”,用于和继承的getSalary2方法进行比较。由图3.2可以看出覆盖的方法按主程序中重定义的方法调用,而继承的方法直接调用父类中的方法。图3.2测试单继承性程序的输出结果3.1.3特殊变量类中有两个特殊变量super和this。1.super类声明中用关键字extends扩展了其超类之后,super用在扩展类中引用其超类中的成员变量。【例3.3】使用super变量,输出结果如图3.3所示。源程序代码如下://程序文件名为UseSuper.javapublicclassUseSuper{publicstaticvoidmain(String[]args){Managerm=newManager();m.name=王飞;m.salary=10000;m.department=业务部;System.out.println(m.getSalary());}}classEmployee{publicStringname;//名字publicintsalary;//薪水//方法publicStringgetSalary(){Stringstr;str=名字:+name+\nSalary:+salary;returnstr;}}classManagerextendsEmployee{publicStringdepartment;//部门//方法publicStringgetSalary(){//使用super变量调用超类的方法returnsuper.getSalary()+\nDepartment:+department;}}图3.3测试super变量的输出2.thisthis变量指向当前对象或实例。str=名字:+name+\nSalary:+salary;上例中的语句可以换成下面的语句。str=名字:+this.name+\nSalary:+this.salary;这两者是等同的,因为在Java编程语言中,系统自动将this关键字与当前对象的变量相关联。但有一种情况例外,就是当在某些完全分离的类中调用一个方法并将当前对象的一个引用作为参数传递时。例如:Dayd=newDay(this);3.1.4构造函数类中的构造函数用来初始化一个类。构造函数为公有类型,无返回值,用来从类实例中访问类时初始化此类的私有变量。【例3.4】基于例3.3将公有变量改成私有变量之后,增加两个构造函数,访问通过外部调用构造函数实现初始化赋值,得到如图3.3所示的结果。//程序文件名为UseConstruct.javapublicclassUseConstruct{publicstaticvoidmain(String[]args){Managerm=newManager(王飞,10000,业务部);//初始化赋值System.out.println(m.getSalary());}}classEmployee{privateStringname;//名字privateintsalary;//薪水//构造函数publicEmployee(String_name,int_salary){name=_name;salary=_salary;}publicStringgetSalary(){Stringstr;str=名字:+name+\nSalary:+salary;returnstr;}}classManagerextendsEmployee{privateStringdepartment;//构造函数publicManager(String_name,int_salary,String_department){super(_name,_salary);department=_department;}publicStringgetSalary(){returnsuper.getSalary()+\nDepartment:+department;}}3.1.5包计算机操作系统使用文件夹或者目录来存放相关或者同类的文档,在Java编程语言中,提供了一个包的概念来组织相关的类。包在物理上就是一个文件夹,逻辑上代表一个分类概念。包就是指一组类。例如一个名叫Company的包,可以包含一组类,如Employee(雇员)、Manager(管理者)和Department(部门)等。声明包的基本格式如下:Package包名;其中:Package为关键字,包名为标识符。使用包时的注意事项如下:(1)Package语句要作为程序非注释语句的第一行语句。(2)包内的类名惟一。(3)引用包中的类时,使用import语句。import语句的基本格式为import包名.类名,其中import为关键字,包名和类名之间用圆点(.)隔开。【例3.5】编写程序测试包,先建立一个Company文件夹,然后建立名为Manager.java的类文件。源程序代码如下://程序文件名为Manager.javapackageCompany;//声明包名CompanyclassEmployee{publicStringname;//名字publicintsalary;//薪水publicStringgetSalary(){Stringstr;str=名字:+name+\nSalary:+salary;returnstr;}}publicclassManagerextendsEmployee{publicStringdepartment;//部门publicStringgetSalary(){returnsuper.getSalar
本文标题:第3章类和接口
链接地址:https://www.777doc.com/doc-2155950 .html