java多态难点讲解
《Java程序设计》教学大纲

《Java程序设计》教学大纲1 课程的基本描述课程名称Java语言程序设计Java Program Language课程性质专业基础课适用专业计算机科学与技术、软件工程、网络工程等参考教材Java 程序设计教程(慕课版)(第 2 版).张仁伟.人民邮电出版社。
总学时60学时考核方式期末上机考试(开卷考试)+课程作业,其中期末考试占50%,课程作业占50%本课程讲解Java语言的基本词法、语法、常用基础类和面向对象技术,除此以外,还要讲授程序设计要求、技能、方法和技巧,讲授分析问题和解决问题的方法,讲授算法的基本概念与应用。
Java语言基本内容包括基本数据类型、语句、类与对象、子类与继承、接口与实现、内部类与异常类、常用实用类、输入输出流、Java多线程机制、Java网络编程、泛型与集合框架、组件及事件处理、JDBC数据库操作。
2 教学定位通过本课程的学习,使学生获得JA V A语言程序设计的基本概念、方法和技巧,掌握JA V A 语言的语法,运用JA V A语言编写并调试通过能解决一定规模实际问题的程序,使学生受到程序设计基本功的严格训练,培养学生良好的程序设计风格和严密的逻辑思维能力,提高分析问题解决问题以及实际动手能力,为后续课程的学习以及为今后设计开发各种软件打下良好的基础。
2.1 课程教学目标1.能运用Java语言的基本词法、语法和常用类库等面向对象知识分析计算机复杂工程问题;2.能运用Java面向对象原理,借助相应资源,分析影响问题求解因素,并获得结论;3.能运用Java语言完成计算机系统或软件模块的设计。
2.2 课程的主要特点Java语言程序设计是一门专业基础课程。
课程内容包括语言的基本语法(词法和语法)、面向对象技术和常用基础类。
学生首先要切实掌握语言的基本语法,只有掌握了基本语法才有可能灵活运用语言,是具备程序设计能力的基础;Java语言本身是面向对象的语言,学生应很好地掌握面向对象技术,以便于理解面向对象的设计方法,并能用面向对象技术分析、设计软件系统;通过语言的学习,能够理解算法的概念,并能使用基本的、常用的算法解决信息处理问题;在学习语言的过程中,培养学生的编程能力,以利于学生终身学习。
【Java】面向对象的四个基本特征:唯一性、分类性、继承性和多态性

【Java】⾯向对象的四个基本特征:唯⼀性、分类性、继承性
和多态性
1.唯⼀性
唯⼀性是指每个对象都是唯⼀的,具有唯⼀标识符。
在对象的整个⽣命周期中,标识符是⼀成不变的,系统可通过该标识符,在内存中找到相应对象。
2.分类性
分类性是指将具有⼀致属性和⾏为的对象抽象成类,只保留与应⽤有关的性质,其他内容忽略。
任何类的划分都是主观的,但必须与具体应⽤有关。
3.继承性
继承性是指⼦类⾃动继承⽗类的属性和⽅法,并且可以在⽗类的基础上加⼊若⼲新内容。
例如,“⼈”这个类抽象了这个群体的基本特征,⽽“学⽣”和“⽼师”除了具备“⼈”所定义的基础特性外,各⾃⼜具有各⾃的新特性。
继承性是⾯向对象程序设计语⾔不同于其他语⾔的最重要特点。
通过类的继承,可使公共的特性能够共享,提⾼代码的可重⽤性、减少冗余,同时简化了对象、类的创建⼯作,规范了类的等级结构。
4.多态性
多态性是指不同对象,在收到同⼀消息后,可产⽣不同结果,具有不同表现⾏为。
多态性允许每个对象以⾃⾝的⽅法去响应共同消息,以此增强软件的灵活性和可重⽤性。
jva课程设计

jva课程设计一、课程目标知识目标:1. 理解Java语言的基本概念,掌握变量、数据类型、运算符等基础语法知识;2. 学会使用Java控制结构,包括顺序结构、选择结构和循环结构;3. 掌握数组的使用,理解数组的优势和局限性;4. 了解面向对象编程的基本概念,如类、对象、方法等。
技能目标:1. 能够运用所学知识编写简单的Java程序,解决实际问题;2. 学会使用调试工具,如断点调试,提高程序调试能力;3. 培养良好的编程习惯,如规范的代码编写、注释使用等;4. 能够运用面向对象思想,设计简单的类和对象。
情感态度价值观目标:1. 培养学生对编程的兴趣,激发学生的学习热情;2. 培养学生团队合作意识,学会与他人共同解决问题;3. 培养学生勇于尝试、克服困难的品质,增强自信心;4. 培养学生的创新意识,鼓励学生提出不同的解决方案。
课程性质:本课程为Java编程入门课程,以实践操作为主,注重培养学生的编程能力和逻辑思维。
学生特点:学生具备一定的计算机操作能力,对编程有一定兴趣,但可能缺乏编程经验和逻辑思维能力。
教学要求:结合学生特点,课程设计需注重理论与实践相结合,以实例为主线,引导学生主动参与,培养其编程兴趣和实际操作能力。
通过本课程的学习,使学生能够掌握基本的Java编程知识,具备进一步深入学习的能力。
二、教学内容1. Java语言概述:介绍Java语言的发展历史、特点和应用领域,引导学生认识Java编程的重要性。
2. 基础语法知识:讲解变量、数据类型、常量、运算符等基本概念,使学生掌握Java编程的基本要素。
3. 控制结构:- 顺序结构:介绍顺序执行的概念,举例说明;- 选择结构:讲解if语句、switch语句的使用,并通过实例演示;- 循环结构:介绍for循环、while循环和do-while循环的用法,举例说明。
4. 数组:讲解数组的定义、初始化、使用方法,以及数组的相关操作,如遍历、排序等。
5. 面向对象编程基础:- 类与对象:介绍类的定义、属性、方法,以及对象的创建和使用;- 封装与继承:讲解封装的意义、继承的概念,并通过实例演示;- 多态:介绍多态的概念和实现方法。
重载和多态的区别

重载和多态的区别多态性也是面向对象方法的一个重要特性.多态性是指在在程序中出现的"重名"现象,即在一个程序中相同的名字可以表示不同的实现.在JAVA中,多态性主要表现在如下两个方面:1方法重载.通常指在同一个类中,相同的方法名对应着不同的方法实现,但是方法的参数不同.2成员覆盖.通常指在不同类父类和子类中,允许有相同的变量名,但是数据类型不同;也允许有相同的方法名,但是对应的方法实现不同.在重载的情况下,同一类中具有相同的名字的方法.如何选择它的方法体呢?不能使用类名来区分,通常采用不同的方法形参表,区分重载要求形参在类型,个数和顺序的不同,在定义重载方法时,应在方法的形参的类型,个数和顺序有所不同,以便在选择时能够区别开来.在覆盖的情况下,同名的方法存在于不同的类中,在调用方法只要指明其方法所归属的类名就可以了.例如class Shape {void draw {}void erase {}}class Circle extends Shape {void draw {System.out.println"Circle.draw";}void erase {System.out.println"Circle.erase"; }}class Square extends Shape {void draw {System.out.println"Square.draw";}void erase {System.out.println"Square.erase";}}class Triangle extends Shape {void draw {System.out.println"Triangle.draw";}void erase {System.out.println"Triangle.erase";}}public class Test {public static Shape randShape {switchintMath.random * 3 {default:case 0: return new Circle;case 1: return new Square;case 2: return new Triangle;} }public static void mainString[] args {Shape[] s = new Shape[9];forint i = 0; i < s.length; i++ s[i] = randShape;forint i = 0; i < s.length; i++ s[i].draw;}}输出结果Triangle.drawCircle.drawTriangle.drawTriangle.drawTriangle.drawSquare.drawSquare.drawTriangle.drawCircle.drawTriangle.eraseCircle.eraseTriangle.eraseTriangle.eraseTriangle.eraseSquare.eraseSquare.eraseTriangle.eraseCircle.erasePress any key to continue...又一次执行Triangle.drawTriangle.drawCircle.drawCircle.drawCircle.drawTriangle.drawTriangle.drawSquare.drawCircle.drawTriangle.eraseTriangle.eraseCircle.eraseCircle.eraseCircle.eraseTriangle.eraseTriangle.eraseSquare.eraseCircle.erasePress any key to continue...两次执行结果不同的原因是其中的Math.random这个类导致的,math.random得到的数是0-1之间的随机数.写到这里,我突然想到了方法重载,那么它和多态,覆盖有什么区别呢?到GOOGLE是搜素了一下,不少.不过,最重要的一点区别是:通过方法重载进而实现对象的多态性.方法重载是指功能相同的多个方法使用同一个方法名.同名的多个方法的参数要有所不同,即在参数类型,参数个数和参数顺序上要有所区别,以便作为选择某个方法的根据.通常只有功能相同的方法进行重载才有意义.例如:计算两个数之和的重载方法定义如下:int addint i,int j{retrun i+j;}float addfloat i,float j{retrun i+j;}double adddouble i,double j{retrun i+j;}重载方法的选择通常是在编译时进行.系统根据不同的参数类型,个数或顺序,寻找最佳匹配方法.方法类型不参与匹配.下面是搜到的一些例子.public class Base{int a,b;public Baseint x,int y{a = x;b = y;}public int add{return a + b;}public void addint x,int y{int z;z = x + y;}}上面这段代码就是重载~~~他有三个特征1:方法名必须一样“add“。
Java项目式教学课程教案

Java项目式教学课程教案一、课程定位本课程是我院计算机专业软件开发方向的一门必修课,在课程体系中起核心位置。
本课程是用目前最流行编程语言之一Java语言描述,Java具有简单性、面向对象性、平台无关性、安全性和健壮性等诸多特点,广泛用于网络编程和嵌入实现。
本课程是一门理论和实践相结合的课程,通过程序设计实例的分析和上机实践,使学生掌握Java程序设计语言,理解面向对象的程序设计的思路和方法,、具备软件开发的基础能力,为今后从事软件开发和应用打下基础。
二、课程总目标本课程教学总目标是通过学生学习Java 语言基础和大量程序编制实践,让学生具体达到以下几点基本要求:(一)知识目标1.掌握面向对象编程的基本思路和知识,能在具体实际中运用面向对象思想考虑问题;2.利用布局管理开发图形用户界面(GUI),并使用Java语言的事件委托机制开发GUI应用程序;3.掌握Java的多线程机制;4.初步掌握JDBC-API的基本知识,并能够开发有一定规模的数据库管理系统;5.初步掌握Java网络编程技术,能利用Sockets机制进行网络通信软件的开发;6.理解并掌握Applet的原理,能够开发简单的Applet程序;7.掌握Java的异常处理机制,能开发容错性良好的程序;(二)技能目标1.具备运用Java程序设计语言编码的能力。
2.具备运用面向对象方法分析和设计的基本能力。
3.具备运用Eclipse等常用编程工具的能力。
4.具备运用Java开发简单GUI程序的能力。
5.具备运用Java进行网络程序开发的基本能力。
(三)素质目标1.培养学生运用面向对象思想架构和管理程序系统的能力,树立科学的分析和设计理念。
2.培养学生严密的逻辑思维能力、严谨的学风、创新意识和创新精神,强化团队合作的意识。
3.具备程序员的基本职业素质,也为后期项目设计课程做好准备,并基本达到国家二级Java考试水平。
三、重点、难点章节及内容将本课程将整个教学内容分为四大模块:基础篇、面向对象、图形化设计、网络编程,共30个任务实施任务驱动式教学。
《JAVA程序设计》课程标准

《JAVA程序设计》课程标准
一、课程基本信息
二、课程的性质、目的和任务
1.课程性质
《Java程序设计》是我院电子信息工程技术专业(物联网方向)学生必修的限选课程。
本课程的前导课程为《C语言程序设计》和《SQL数据库》,可以为进一步学习《Android 系统》奠定良好的基础,并且能够帮助学生进一步理解面向对象程序设计的思想和精髓。
2.目的和任务
a)理解《Java程序设计》高级编程的思想、概念和原理;
b)掌握继承、多态、GUI、文件操作、多线程编程机制;
c)能够把所学的原理应用到具体的实践中去,如能利用Java语言编写程序解决一些具体的问题,培养学生发现、分析和解决问题的能力等;
三、课程教学的基本要求
四、课程的教学重点和难点、学时分配
教学重点:继承、多态、封装教学难点:多态、封装课程学时分配一览表
五、相关课程的衔接
开设此门课程之前,学生应完成《C语言程序设计》、《SQL数据库技术应用》课程的学习,其后续课程是《.NET高级应用》等。
六、实验教学
七、其它
学生成绩包括平时成绩和期末考试成绩,其中,平时成绩占30%,期末考核占70%。
成绩考核方法分为过程考核和理论考核两种。
平时成绩为过程考核,包括出勤表现5%、课堂提问5%、实践操作10%、实践报告10%,实训成绩由主讲教师和实训教师根据学生在实训过程中的表现进行现场评价,力求科学全面地评价学生的综合素质。
主要考核学生的实践动手能力、团队协作精神、服从意识等。
继承、多态,重载、重写的区别与总结
继承、多态,重载、重写的区别与总结李氏原则:(1)父类的引用指向子类对象。
-多态(2)接口的引用指向实现类的实例。
-接口Polo咯,什么是多态?它的实现机制是什么呢?重载和重写的区别在那里?这就是这一次我们要回顾的四个十分重要的概念:继承、多态、重载和重写继承(inheritance)简单的说,继承就是在一个现有类型的基础上,通过增加新的方法或者重定义已有方法(下面会讲到,这种方式叫重写)的方式,产生一个新的类型。
继承是面向对象的三个基本特征--封装、继承、多态的其中之一,我们在使用JAVA 时编写的每一个类都是在继承,因为在JAVA语言中,ng.Object类是所有类最根本的基类(或者叫父类、超类),如果我们新定义的一个类没有明确地指定继承自哪个基类,那么JAVA就会默认为它是继承自Object类的。
我们可以把JAVA中的类分为以下三种:类:使用class定义且不含有抽象方法的类。
抽象类:使用abstract class定义的类,它可以含有,也可以不含有抽象方法。
接口:使用interface定义的类。
在这三种类型之间存在下面的继承规律:类可以继承(extends)类,可以继承(extends)抽象类,可以继承(implements)接口。
抽象类可以继承(extends)类,可以继承(extends)抽象类,可以继承(implements)接口。
接口只能继承(extends)接口。
请注意上面三条规律中每种继承情况下使用的不同的关键字extends和implements,它们是不可以随意替换的。
大家知道,一个普通类继承一个接口后,必须实现这个接口中定义的所有方法,否则就只能被定义为抽象类。
我在这里之所以没有对implements关键字使用“实现”这种说法是因为从概念上来说它也是表示一种继承关系,而且对于抽象类implements接口的情况下,它并不是一定要实现这个接口定义的任何方法,因此使用继承的说法更为合理一些。
java常见面试业务场景题汇总
java常见面试业务场景题汇总面试是求职者必须经历的一环,而Java面试则是众多面试中比较重要的一种。
本文将汇总一些Java常见面试业务场景题,帮助求职者更好地准备面试。
1.请描述Java中的多态(polymorphism)是什么,以及在实际开发中如何使用它?答案:Java中的多态是指通过编写可以适应多种情况的代码,来实现相同的功能。
在实际开发中,我们可以使用多态来提高代码的可复用性和灵活性。
2.请解释Java中的抽象类(abstract class)和抽象方法(abstract method)?答案:抽象类是一种特殊的类,其中包含了一些抽象方法。
抽象方法是一种方法,但没有具体的实现,只有方法的签名,需要由子类来实现。
抽象类可以帮助我们定义一些通用的概念和方法,同时也可以方便地定义一些抽象的方法,让子类自动实现这些方法。
3.请解释Java中的单例模式(singleton pattern)?答案:单例模式是一种常用的设计模式,用于确保一个类只有一个实例,并提供一个全局访问点。
在Java中,我们可以使用单例模式来确保一个数据库连接池只有一个实例,或者只有一个日志文件实例等等。
4.请描述Java中的反射(reflection)是什么,以及在实际开发中如何使用它?答案:反射是指在运行时动态地获取类的信息,并操作类的属性和方法的机制。
在实际开发中,我们可以使用反射来获取类的信息,包括类的构造方法、成员变量、成员方法等等。
同时,反射也可以用于创建对象、调用方法、设置属性等等。
5.请描述Java中的集合框架(Java Collection Framework)?答案:Java中的集合框架是一个强大的框架,用于操作一组对象。
在Java中,我们可以使用集合框架来实现对数据的增删改查操作,包括数组、列表、集合等等。
以上是Java常见面试业务场景题的汇总,希望能帮助求职者更好地准备面试。
Java题库——Chapter11继承和多态
Java题库——Chapter11继承和多态1)Analyze the following code:public class Test {public static void main(String[ ] args) {B b = new B();b.m(5);System.out.println("i is " + b.i);}}class A {int i;public void m(int i) {this.i = i;}}class B extends A {public void m(String s) {}}A)The program has a compilation error, because m is overridden with a different signature in B.B)The method m is not overridden in B. B inherits the method m from A and defines an overloaded method m in B.C)The program has a runtime error on b.i, because i is not accessible from b.D)The program has a compilation error, because b.m(5) cannot be invoked since the method m(int) is hidden in B. B中没有重写⽅法m。
B继承了A中的⽅法m,并在B中定义了⼀个重载的⽅法m。
2)Analyze the following code.// Program 1public class Test {public static void main(String[ ] args) {Object a1 = new A();Object a2 = new A();System.out.println(((A)a1).equals((A)a2));}}class A {int x;public boolean equals(A a) {return this.x == a.x;}}// Program 2public class Test {public static void main(String[ ] args) {A a1 = new A();A a2 = new A();System.out.println(a1.equals(a2));}}class A {int x;public boolean equals(A a) {return this.x == a.x;}}A)Program 1 displays true and Program 2 displays trueB)Program 1 displays false and Program 2 displays trueC)Program 1 displays false and Program 2 displays falseD)Program 1 displays true and Program 2 displays false3)Invoking ________ removes all elements in an ArrayList x. 3) _______A)x.clear() B)x.delete() C)x.remove() D)x.empty() E)x.clean()4)Analyze the following code:Cylinder cy = new Cylinder(1, 1);Circle c = cy; 4) _______A)The code has a runtime error. B)The code has a compile error. C)The code is fine.5)Which of the following statements are true? (Choose all that apply.) 5) _______A)Overloading a method is to provide more than one method with the same name but with different signatures to distinguish them.B)A private method cannot be overridden. If a method defined in a subclass is private in its superclass, the two methods are completely unrelated.C)It is a compilation error if two methods differ only in return type in the same class.D)A static method cannot be overridden. If a static method defined in the superclass is redefined in a subclass, the method defined in the superclass is hidden.E)To override a method, the method must be defined in the subclass using the same signature and compatible return type as in its superclass.1、重载⼀个⽅法是提供多个具有相同名称但具有不同签名的⽅法来区分它们。
JavaEEDay8_面向对象继承2多态
1:ASM项目改动View.java如果输入1 开信用账号如果输入2 开储蓄账号2.某公司的雇员分为以下若干类:Employee:这是所有员工总的父类,属性:员工的姓名,员工的生日月份。
方法:getSalary(int month) 根据参数月份来确定工资,如果该月员工过生日,则公司会额外奖励100元。
SalariedEmployee:Employee的子类,拿固定工资的员工。
属性:月薪HourlyEmployee:Employee的子类,按小时拿工资的员工,每月工作超出160小时的部分按照1.5倍工资发放。
属性:每小时的工资、每月工作的小时数 200 SalesEmployee:Employee的子类,销售人员,工资由月销售额和提成率决定。
属性:月销售额、提成率BasePlusSalesEmployee:SalesEmployee的子类,有固定底薪的销售人员,工资由底薪加上销售提成部分。
属性:底薪。
写一个程序,把若干各种类型的员工放在一个Employee数组里,写一个函数,打印出某月每个员工的工资数额。
注意:要求把每个类都做成完全封装,不允许非私有化属性。
问题1:B extends A 创建B类对象的时候会先创建A类对象问题2:构造方法知道其编写格式,但就是不会应用构造方法是给对象赋初始值的,构造方法是可以重载(方法名相同,参数表不同)的public void add(int a,int b) //Apublic void add(int b,int a) //Bpublic void add(int a,int b,int c) //Cpublic void add(char c,char b);//DA和C构成重载A和D C和D也是重载举例:需求1:创建一个account对象,要求使用构造方法给该对象的id赋初始值需求2:创建一个account对象,要求使用构造方法给该对象完成全部初始值的赋值工作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1 多态概念/*多态:同一个对象(事物),在不同时刻体现出来的不同状态。
举例:猫是猫,猫是动物。
水(液体,固体,气态)。
多态的前提:A:要有继承关系。
B:要有方法重写。
其实没有也是可以的,但是如果没有这个就没有意义。
动物 d = new 猫();d.show();动物 d = new 狗();d.show();C:要有父类引用指向子类对象。
父 f = new 子();用代码体现一下多态。
多态中的成员访问特点:A:成员变量编译看左边,运行看左边。
B:构造方法创建子类对象的时候,访问父类的构造方法,对父类的数据进行初始化。
C:成员方法编译看左边,运行看右边。
D:静态方法编译看左边,运行看左边。
(静态和类相关,算不上重写,所以,访问还是左边的)由于成员方法存在方法重写,所以它运行看右边。
*/class Fu {public int num = 100;public void show() {System.out.println("show Fu");}public static void function() {System.out.println("function Fu");}}class Zi extends Fu {public int num = 1000;public int num2 = 200;public void show() {System.out.println("show Zi");}public void method() {System.out.println("method zi");}public static void function() {System.out.println("function Zi");}}class DuoTaiDemo {public static void main(String[] args) {//要有父类引用指向子类对象。
//父 f = new 子();Fu f = new Zi();System.out.println(f.num);//找不到符号//System.out.println(f.num2);f.show();//找不到符号//f.method();f.function();}}2 多态好处/*多态的好处:A:提高了代码的维护性(继承保证)B:提高了代码的扩展性(由多态保证)猫狗案例代码*/class Animal {public void eat(){System.out.println("eat");}public void sleep(){System.out.println("sleep");}}class Dog extends Animal {public void eat(){System.out.println("狗吃肉");}public void sleep(){System.out.println("狗站着睡觉");}}class Cat extends Animal {public void eat() {System.out.println("猫吃鱼");}public void sleep() {System.out.println("猫趴着睡觉");}}class Pig extends Animal {public void eat() {System.out.println("猪吃白菜");}public void sleep() {System.out.println("猪侧着睡");}}//针对动物操作的工具类class AnimalTool {private AnimalTool(){}/*//调用猫的功能public static void useCat(Cat c) {c.eat();c.sleep();}//调用狗的功能public static void useDog(Dog d) {d.eat();d.sleep();}//调用猪的功能public static void usePig(Pig p) {p.eat();p.sleep();}*/public static void useAnimal(Animal a) {a.eat();a.sleep();}}class DuoTaiDemo2 {public static void main(String[] args) {//我喜欢猫,就养了一只Cat c = new Cat();c.eat();c.sleep();//我很喜欢猫,所以,又养了一只Cat c2 = new Cat();c2.eat();c2.sleep();//我特别喜欢猫,又养了一只Cat c3 = new Cat();c3.eat();c3.sleep();//...System.out.println("--------------");//问题来了,我养了很多只猫,每次创建对象是可以接受的//但是呢?调用方法,你不觉得很相似吗?仅仅是对象名不一样。
//我们准备用方法改进//调用方式改进版本//useCat(c);//useCat(c2);//useCat(c3);//eCat(c);//eCat(c2);//eCat(c3);eAnimal(c);eAnimal(c2);eAnimal(c3);System.out.println("--------------");//我喜欢狗Dog d = new Dog();Dog d2 = new Dog();Dog d3 = new Dog();//eDog(d);//eDog(d2);//eDog(d3);eAnimal(d);eAnimal(d2);eAnimal(d3);System.out.println("--------------");//我喜欢宠物猪//定义一个猪类,它要继承自动物,提供两个方法,并且还得在工具类中添加该类方法调用Pig p = new Pig();Pig p2 = new Pig();Pig p3 = new Pig();//ePig(p);//ePig(p2);//ePig(p3);eAnimal(p);eAnimal(p2);eAnimal(p3);System.out.println("--------------");//我喜欢宠物狼,老虎,豹子...//定义对应的类,继承自动物,提供对应的方法重写,并在工具类添加方法调用//前面几个必须写,我是没有意见的//但是,工具类每次都改,麻烦不//我就想,你能不能不改了//太简单:把所有的动物都写上。
问题是名字是什么呢?到底哪些需要被加入呢?//改用另一种解决方案。
}/*//调用猫的功能public static void useCat(Cat c) {c.eat();c.sleep();}//调用狗的功能public static void useDog(Dog d) {d.eat();d.sleep();}*/}3 多态坏处/*多态的弊端:不能使用子类的特有功能。
*/class Fu {public void show() {System.out.println("show fu");}}class Zi extends Fu {public void show() {System.out.println("show zi");}public void method() {System.out.println("method zi");}}class DuoTaiDemo3 {public static void main(String[] args) {//测试Fu f = new Zi();f.show();f.method();}}/*多态的弊端:不能使用子类的特有功能。
我就想使用子类的特有功能?行不行?行。
怎么用呢?A:创建子类对象调用方法即可。
(可以,但是很多时候不合理。
而且,太占内存了)B:把父类的引用强制转换为子类的引用。
(向下转型)对象间的转型问题:向上转型:Fu f = new Zi();向下转型:Zi z = (Zi)f; //要求该f必须是能够转换为Zi的。
*/class Fu {public void show() {System.out.println("show fu");}}class Zi extends Fu {public void show() {System.out.println("show zi");}public void method() {System.out.println("method zi");}}class DuoTaiDemo4 {public static void main(String[] args) {//测试Fu f = new Zi();f.show();//f.method();//创建子类对象//Zi z = new Zi();//z.show();//z.method();//你能够把子的对象赋值给父亲,那么我能不能把父的引用赋值给子的引用呢?//如果可以,但是如下Zi z = (Zi)f;z.show();z.method();}}5 类型转换异常/*ClassCastException:类型转换异常一般在多态的向下转型中容易出现*/class Animal {public void eat(){}}class Dog extends Animal {public void eat() {}public void lookDoor() {}}class Cat extends Animal {public void eat() {}public void playGame() {}}class DuoTaiDemo5 {public static void main(String[] args) {//内存中的是狗Animal a = new Dog();Dog d = (Dog)a;//内存中是猫a = new Cat();Cat c = (Cat)a;//内存中是猫Dog dd = (Dog)a; //ClassCastException }}6 多态猫狗案例/*多态练习:猫狗案例*/class Animal {public void eat(){System.out.println("吃饭");}}class Dog extends Animal {public void eat() {System.out.println("狗吃肉");}public void lookDoor() {System.out.println("狗看门");}}class Cat extends Animal {public void eat() {System.out.println("猫吃鱼");}public void playGame() {System.out.println("猫捉迷藏");}}class DuoTaiTest {public static void main(String[] args) {//定义为狗Animal a = new Dog();a.eat();System.out.println("--------------");//还原成狗Dog d = (Dog)a;d.eat();d.lookDoor();System.out.println("--------------");//变成猫a = new Cat();a.eat();System.out.println("--------------");//还原成猫Cat c = (Cat)a;c.eat();c.playGame();System.out.println("--------------");//演示错误的内容//Dog dd = new Animal();//Dog ddd = new Cat();//ClassCastException//Dog dd = (Dog)a;}}7 多态饮食案例/*不同地方饮食文化不同的案例*/class Person {public void eat() {System.out.println("吃饭");}}class SouthPerson extends Person {public void eat() {System.out.println("炒菜,吃米饭");}public void jingShang() {System.out.println("经商");}}class NorthPerson extends Person {public void eat() {System.out.println("炖菜,吃馒头");}public void yanJiu() {System.out.println("研究");}}class DuoTaiTest2 {public static void main(String[] args) {//测试//南方人Person p = new SouthPerson();p.eat();System.out.println("-------------");SouthPerson sp = (SouthPerson)p;sp.eat();sp.jingShang();System.out.println("-------------");//北方人p = new NorthPerson();p.eat();System.out.println("-------------");NorthPerson np = (NorthPerson)p;np.eat();np.yanJiu();}}8 多态测试/*看程序写结果:先判断有没有问题,如果没有,写出结果*/class Fu {public void show() {System.out.println("fu show");}}class Zi extends Fu {public void show() {System.out.println("zi show");}public void method() {System.out.println("zi method");}}class DuoTaiTest3 {public static void main(String[] args) {Fu f = new Zi();//找不到符号//f.method();f.show();}}9 多态成员访问特点/*看程序写结果:先判断有没有问题,如果没有,写出结果多态的成员访问特点:方法:编译看左边,运行看右边。