L04 深入类与对象.docx

上传人:b****3 文档编号:10669069 上传时间:2023-05-27 格式:DOCX 页数:20 大小:169.17KB
下载 相关 举报
L04 深入类与对象.docx_第1页
第1页 / 共20页
L04 深入类与对象.docx_第2页
第2页 / 共20页
L04 深入类与对象.docx_第3页
第3页 / 共20页
L04 深入类与对象.docx_第4页
第4页 / 共20页
L04 深入类与对象.docx_第5页
第5页 / 共20页
L04 深入类与对象.docx_第6页
第6页 / 共20页
L04 深入类与对象.docx_第7页
第7页 / 共20页
L04 深入类与对象.docx_第8页
第8页 / 共20页
L04 深入类与对象.docx_第9页
第9页 / 共20页
L04 深入类与对象.docx_第10页
第10页 / 共20页
L04 深入类与对象.docx_第11页
第11页 / 共20页
L04 深入类与对象.docx_第12页
第12页 / 共20页
L04 深入类与对象.docx_第13页
第13页 / 共20页
L04 深入类与对象.docx_第14页
第14页 / 共20页
L04 深入类与对象.docx_第15页
第15页 / 共20页
L04 深入类与对象.docx_第16页
第16页 / 共20页
L04 深入类与对象.docx_第17页
第17页 / 共20页
L04 深入类与对象.docx_第18页
第18页 / 共20页
L04 深入类与对象.docx_第19页
第19页 / 共20页
L04 深入类与对象.docx_第20页
第20页 / 共20页
亲,该文档总共20页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

L04 深入类与对象.docx

《L04 深入类与对象.docx》由会员分享,可在线阅读,更多相关《L04 深入类与对象.docx(20页珍藏版)》请在冰点文库上搜索。

L04 深入类与对象.docx

L04深入类与对象

L4《深入类与对象》上机手册

1.内容回顾(3-5分钟)

回顾本讲内容?

不要照搬ppt中的课程目标,应该体现自己的水平

Java访问修饰符的作用范围?

如何实现类的封装,类的封装有什么作用?

实现封装的关键是什么?

什么叫内部类,有几种类型的内部类?

普通内部类有什么特点,如何调用,是否能访问外部类的成员变量与方法

static有什么作用?

常量,类变量,实例变量与局部变量有什么区别

static的内部类如何定义?

有和特点?

如何使用?

子类继承父类的时候有何特点?

2.上机目标

列出本讲通过上机应该掌握的内容,达到什么要求,不要照搬ppt中的大纲

掌握Java中类的访问控制

掌握java中内部类的作用?

如何定义内部类,如何使用

掌握静态内部类有什么特殊点

掌握java中如何实现继承,子类继承父类的时候有什么注意点

掌握java中多态的实现之—重写

3.上机任务

列出本讲的所有上机题目,包括指导练习、课堂练习、课外练习

定义TestClass类属性java中的访问控制(15分钟)

实现类的继承(30分钟)

创建Polygon类,定义方法,并实现方法重载(30分钟)

创建StaticPerson类来体验static的作用(30分钟)

创建一个电话卡的类(PhoneCard)?

创建一个包含内部类的类,在另一个独立的类中,创建此内部类的实例。

该内部类可以是普通内部类,也可是静态内部类

证明内部类有权限访问外部类的private成员变量或方法。

但反过来外部类是否有权限访问内部类的成员变量和方法

4.指导练习

带领学员完成的练习,如安装配置、知识点练习、重点难点

4.1.定义TestClass类属性java中的访问控制

说明解答步骤,每步的含义及解析

1.知识点

Java类中的访问限制分为private,默认的,protected和public的。

可以使用这四个访问修饰符来修饰类中的成员变量和成员方法。

但不管如何一个类中的实例方法总是可以操作该类中的成员变量,类方法总是可以操作该类中的类变量,与访问限制符号有关。

2.代码实现

3.程序解析

a.在上面的程序中我们定义了一个TestClass类,在该类中我们定义了两个私有的成员变量i,j,一个私有的构造方法TestClass()与一个公有的构造方法TestClass(inta,intb).一个私有的方法求和getSum()。

b.在该类的内部写了一个主方法main来测试。

在该方法中我们可以调用私有的构造方法来创建一个对象,然后通过对象.变量的方式来赙值,也可以直接通过对象.方法名来调用方法。

通过运行我们发现程序可以正常运行没有任何问题。

私有的也可以调用?

为什么大家想想。

想不明白的看看上面红色标注的内容。

c.我们再创建另一个类TestOne.java;在该类的main方法中我们也创建TestClass类的对象,代码如下

4.思考

仔细分析并运行以上代码并回答以下问题:

1)为何调用newTestClass()创建对象会报错?

而调用newTestClass(1,4)正确。

2)但为何通过testb调用成员变量i,j,getSum()又报错?

3)如何改正TestClass.java中的代码后,才能让TestOne的代码运行正常

4.2.实现类的继承

1.先创建一个基类或父类Employee,该了代表了所有的雇员类,当然我们也知道在公司中不管是普通员工还是部门经理其实对公司来说都是雇员

2.不同员工与部门经理之间的待遇还是有些不一样的,如何体现这些不同点了?

我们有没必要在专门创建另外两个类CommonEmployee与ManagerEmployee来分别代表普通员工与主管,并将上面Employee类中的成员变量与成员方法再重新写一次?

No,No,No,No,如果你是这样想的,那么就太愚蠢了,难道忘了在面向对象编程中还有一个继承吗,我们以继承另一个类中已经有的方法和成员变量,这样在自己写的类中就可以省掉很到重复的代码了。

3.创建一个普通员工类

4.创建主管类;ManagerEmployee

在上面的代码中我们通过extends关键字让CommonEmployee来继承了Employee类中的成员变量与成员方法;同理我们还可以创建主管类;ManagerEmployee

通过以上代码,我们根据雇员类Employee创建了两个子类CommonEmployee与ManagerEmployee;因为继承的关系,CommonEmployee与ManagerEmployee同时具有了Employee类的属性与方法,且还写了自己的新方法;比如主管还添加了根据工作年限自动添加工资的方法;当然这个方法在父类中是没有的,是属于子类ManagerEmployee独有的

5.写一个测试类与测试方法

publicclassTestEmployee{

publicstaticvoidmain(Stringargs[]){

ManagerEmployeeMgrEmp1;

CommonEmployeeComEmp1;

CommonEmployeeComEmp2;

MgrEmp1=newManagerEmployee("张予",newDate(92,6,5));

MgrEmp1.m_EmpGender='m';

MgrEmp1.m_StartWorkDate=newDate(90,4,8);

MgrEmp1.setEmpSalary(4500);

ComEmp1=newCommonEmployee();

ComEmp1.m_EmpName=newString("老李");

ComEmp1.m_EmpGender='m';

ComEmp1.m_StartWorkDate=newDate(89,9,8);

ComEmp1.setEmpSalary(2500);

ComEmp2=newCommonEmployee("王力");

ComEmp2.m_EmpGender='f';

ComEmp2.m_StartWorkDate=newDate(98,3,18);

ComEmp2.setEmpSalary(600);

ComEmp2.setEmpBonus(200);

System.out.println("直接访问父类最低工资:

"+Employee.m_MinSalary);

System.out.println("调用继承自父类的方法访问父类的工资"+MgrEmp1.getMinSalary());

System.out.println("直接访问子类--主管的最低工资:

"+MgrEmp1.m_MinSalary);

System.out.println("调用子类方法访问子类工资:

"+MgrEmp1.getManMinSalary());

System.out.println("直接访问子类最低工资:

"+ManagerEmployee.m_MinSalary);

System.out.println("主管信息:

"+MgrEmp1.toString());

System.out.println("雇员1信息:

"+ComEmp1.toString());

System.out.println("雇员2信息:

"+ComEmp2.toString());

}

}

6.分析与总结

a.我们首先定义了一个雇员类Employee,该类中定义的成员变量代表了雇员的一般共同属性。

一个类因构造方法的重载而存在着若干该构造方法。

一个类的若干个构造方法之间可以相互调用。

当一个构造方法需要调用另一个构造方法时,应使用关键字this,同时这个调用语句应该时整个构造方法的第一个可执行语句。

在我们定义的这个类中,有三个重载的构造方法:

三个构造方法的参数个数互不相同。

在第二个构造方法中,this()表示调用该类的无参构造方法,也就是调用第一个构造方法,第三个构造方法中调用了该类中含有一个参数的构造方法,也就是调用了第二个构造方法。

一个类的若干个构造方法之间可以相互调用。

当一个构造方法需要调用另一个构造方法时,应使用关键字this,同时这个调用语句应该是整个构造方法的第一个可执行语句。

通过使用this来调用同类的其他构造方法,这样做的优点是可以最大限度地提高对已有工作的利用程度,提高程序的抽象、封装程度,以及减少程序维护的工作量。

构造方法之后定义了表示类的行为的成员方法。

b.类CommonEmployee是Employee的一个子类,它除了继承了父类的所有非私有信息外还定义了自己的私有成员变量m_EmpBonus,获取和修改这个私有变量的方法,以及它自己的构造方法。

该类的两个重载的构造方法都分别使用关键字super调用了父类的构造方法。

c.类ManagerEmployee是Employee的另一个子类,它有自己的成员变量m_WorkAsManager和m_MinSalary,在其父类中有一个和变量m_MinSalary同名的变量。

该类实现了构造方法的重载,以满足多层次的对象初始化需要。

该类还重写了父类的方法toString()和getMinSalary(),并定义了自己的方法workDays(),addSalYearly()。

d.在公共类TestClass中定义分别定义了两个一般雇员类对象ComEmp1和ConEmp2,定义了一个主管类对象MgrEmp1,并对各对象成员变量进行相应的初始化操作。

对两个一般雇员类对象创建时分别调用了不同的构造方法,

ComEmp1=newCommonEmployee();

ComEmp2=newCommonEmployee("王力");

对主管类对象MgrEmp1创建时调用了该类带有参数的构造方法,

MgrEmp1=newManagerEmployee("张予",newDate(92,6,5));

因为MinSalary在父类Employee中定义为类变量,可以用类名直接调用,如:

Employee.m_MinSalary,在Employee的子类ManagerEmployee中有一个同名的类变量,因此对于子类也可以有:

ManagerEmployee.m_MinSalary。

读者可以从输出结果中看到两者有何不同,还可以看到子类调用由父类继承而来的方法与调用自己的方法所得到的结果有什么不同。

类ComEmp的对象和类ManagerEmployee的对象分别调用各自的toString()方法返回要输出的信息

4.3.创建Polygon类,定义方法,并实现方法重载

1.知识点

在该类中我们定义了一个同名的方法getArea,方法的返回类型都一样float,但方法的参数类型不一样。

我们可以根据所求的多边形来决定调用什么方法,根据参数类型与参数个数不同在运行的时候具体决定调用什么方法。

这就是方法的重载。

但切记我们不能根据方法的返回类型来区分不同的方法。

2.创建Polygon类,并创建三个方法getArea,分别实现求三角形,圆,梯形的面积

/**

*多边形面积的求法,我们在一个类中给出求多种多边形的方法,可以根据不同需求来调用不同的方法*

*

*@authoradmin

*/

publicclassPolygon{

publicPolygon(){

}

/**

*求三角型面积

*

*@paramdown_line

*底

*@paramhigh

*高

*@return

*/

publicfloatgetArea(floatdown_line,floathigh){

returndown_line*high/2;

}

/**

*求圆的面积

*

*@paramradii

*半径

*@return

*/

publicfloatgetArea(floatradii){

return3.14f*radii*radii;

}

/**

*得到梯形的面积

*@paramup_line

*@paramdown_line

*@paramhigh

*@return

*/

publicfloatgetArea(floatup_line,floatdown_line,

floathigh){

return(up_line+down_line)*high/2.0f;

}

}

3.测试类

4.思考:

能否通过方法返回值类型来决定调用那个方法?

实现方法的重载?

5.课堂练习

在上机课由学员自己完成的练习,一般需要给出思路、步骤、重点代码

5.1.创建StaticPerson类来体验static的作用

1.创建一个普通的内部类Person,并在该类中定义一个static的成员变量用来统计创建该类对象的数量

2.创建一个外部类StaticPerson,在外部类中申明内部类的对象

3.分析说明:

a.申明了一个Person类(类型),并且申明了三个成员函数

//统计申明了多少个Person对象

staticintcount;

Stringname;

intage;

其中name,age都是普通的成员函数,count申明为静态的,他的主要目的就是测试通过该类申明了多少个对象。

b.在Person类中创建了两个构造函数,一个带参数的,一个不带参数的,且在这两个构造方法中我们都用了this.count=this.count+1;这个执行语句。

目的就是不管用户用那个构造函数创建该类型的一个对象的时候,我们都做统计,计算出共创建了多少个对象,并将该值还是放到我们的staticintcount中。

正因为count是静态的,为类所有,不是某个具体对象的私有成员变量,所以才能帮我们统计出通过该类创建的对象的个数。

4.运行测试

5.知识点总结

用static关键字声明的成员变量和成员方法、代码块都是在类加载的时候就给起分配内存空间了。

a.使没有创建该类的对象,我们也可以使用类名。

成员变量名,类名。

成员方法名的形式进行调用。

b.Static关键字定义的成员变量不属于任何一个对象,但可以被任何类进行调用。

他相当于一个类的全局变量。

6.课外练习

由学员课后完成,如花时间较长的题目,面试题,项目中的功能,扩展性内容

6.1.创建一个电话卡的类(PhoneCard)?

帐号:

cardNumber;初始金额:

initMoney使用时间:

time

记费方式:

minMoney

创建两个电话卡的子类——IP卡和201卡

他们记费方式不同(每分钟费用分别为0.3和0.45);

给定一个时间time=5,和初始金额30,分别计算出剩余金额。

6.2.创建一个包含内部类的类,在另一个独立的类中,创建此内部类的实例。

该内部类可以是普通内部类,也可是静态内部类

6.3.证明内部类有权限访问外部类的private成员变量或方法。

但反过来外部类是否有权限访问内部类的成员变量和方法

7.常见问题

根据教学或自己备课过程中常碰到的问题及其解决方法

7.1.如何创建内部类对象

将内部类声明为非private的就可以通过外部类创建一个内部类的对象引用,并可通过该引用调用内部类自己定义的方法。

声明调用方法:

OuterClass outer = new OuterClass();

OuterClass.InnerClass inner = outer.new InnerClass ();

public class StaticInnerDemo {

    String name = "Tom";

      void PrintName(){

            System.out.println(" Outer name :

 "+name);

     }

    public static class Inner{

           int age = 10;    

           void PrintAge(){

              System.out.println(" inner age :

 "+age);

          }

     }

    public static void main(String[ ] args)     

            Inner inner = new Inner();

           inner.PrintAge();

    }

}

1、Inner为静态内部类。

2、Inner不能访问names属性和PrintName()方法。

3、在外部类中可以直接创建该类的对象。

特点:

可访问外部类的成员变量。

只能访问所在方法中的final类型的局部变量,因为用final定义的局部变量相当于一个常量,它的生命周期超出方法运行的生命周期。

该类型的内部类调用方法:

直接通过外部类来调用内部类所在的方法。

OuterClass.innerOfOuterMethod( );

方法和作用域中的内部类调用方式

publicclassInOut{

Stringstr=newString("Between");

publicvoidamethod(finalintiArgs){

fianlinta=12;

classBicycle{

publicvoidsayHello(){

System.out.println(str);

System.out.println(a);

System.out.println(iArgs);

}

}

Bicyclebicycle=newBicycle();

bicycle.sayHello();

}

}

特点:

可访问外部类的成员变量。

只能访问所在方法中的final类型的局部变量,因为用final定义的局部变量相当于一个常量,它的生命周期超出方法运行的生命周期。

该类型的内部类调用方法:

直接通过外部类来调用内部类所在的方法。

OuterClass.innerOfOuterMethod();

7.2.内部类可以引用他包含类的成员吗?

有没有什么限制?

一个普通内部类可以访问他的外部类的所有的成员,没有任何限制;

反之外部类不能直接访问内部类的成员;内部类变量的其作用范围只在内部类内部

8.相关知识

提供与本讲内容的某些知识点相关的参考资料或扩展内容与技术

8.1.StaticNestedClass和InnerClass的不同

内部类对象保存了一个对外部类对象的引用,内部类与外部类共享封装类的成员,即内部类和封装类都可以使用封装类的成员变量及成员方法,使用内部类有以下好处:

1)用它可对那些逻辑上相互联系的类进行分组

2)并可控制一个类在另一个类里的“可见性”。

静态内部类(StaticNestedClass),也称静态嵌套类,相当于外部类的一个静态成员,没有外部实例时能够访问它,跟静态方法一样,没有外部类的实例时就可以访问,所以静态内部类不能访问外部类的实例变量,即不能共享外部类的实例变量。

准确地说静态内部类不是内部类,而只是两个类之间的隐含关系

8.2.AnonymousInnerClass(匿名内部类)是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?

AnonymousInnerClass(匿名内部类)不能extends其他类,但它可以是其他类的子类,如下的匿名类对象就是A的子类:

publicclassInnerClass{

voidtest(){

Aaa=newA(){//此为匿名内部类,是A的子类

voidf(){

System.out.println("匿名内部类继承了抽象类A");

}

};

aa.f();

}

publicstaticvoidmain(String[]args){

newInnerClass().test();

}

}

//在此A不一定要是抽象的

abstractclassA{

abstractvoidf();

}

匿名内部类可以实现接口,如将上面代码中的A的申明改成接口就行了

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 中医中药

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2