java多态用法

合集下载

第七章 面向对象的Java实现-继承和多态

第七章 面向对象的Java实现-继承和多态

Java教员
.NET教员
10
为什么需要继承 4-4
public class JavaTeacher2 extends Teacher { public JavaTeacher2(String myName, String mySchool) { super(myName, mySchool); 子类自动继承父类的属 } 性和方法,子类中不再 public void giveLesson(){ 存在重复代码 System.out.println("启动 Eclipse"); super.giveLesson(); } } public class DotNetTeacher2 extends Teacher { public DotNetTeacher2(String myName, String mySchool) { super(myName, mySchool); } public void giveLesson(){ System.out.println("启动 Visual Studio .NET"); super.giveLesson(); } } 使用继承,可以有效实现代码复用
4
本章目标
掌握继承 掌握super关键字 掌握多态
5
生活中的继承 2-1
生活中,继承的例子随处可见
动物 谁是父类? 谁是子类? 能说出继承的特点吗?
食草动物
食肉动物
继承需要符合的关系:is-a,父类更通用、子类更具体
6
生活中的继承 2-2
子类具有父类的一般特性(包括属性和行为), 以及自身特殊的特性
可以接收子类类型 public class HQ3 { public void judge(Teacher t){ t.introduction(); t.giveLesson(); 根据实际创建的对象 } 类型调用相应方法 大家好!我是北京中心的李明. 启动 Eclipse 知识点讲解 总结提问

java多态JsonSubTypes反射对应的对象

java多态JsonSubTypes反射对应的对象

java多态JsonSubTypes反射对应的对象
Java多态JsonSubTypes反射是运用多态概念的一种反射技术,是Java
语言中多态的应用。

其目的是用来取代一般类型强制转换,简化反射时属性
和方法的调用。

多态JsonSubTypes反射有两种方式可以实现,一种是通过用JsonSubTypes键值对反序列化,把数据反序列化为相应的Class;另一种是
用反射获取Class对象,在反射时创建实例,传入参数初始化类实例,最后
返回实例。

JsonSubTypes反射使程序的可扩展性更强,它可以让你在反射时获取Class对象并实例化,你可以根据传入的参数动态的反射出不同的实例对象,就像动态引入类一样。

它比一般类型强制转换等反射技术更加灵活,可以实
现更高效的反射服务。

另外,Java的多态性在多次反射和反序列化时能得到有效利用,可以在
反射时针对不同的传入参数多次使用同一个类,而不必为每一种传入参数创
建一个新类,从而大大减少了定义类所用到的代码。

总之,Java多态JsonSubTypes反射是一种比较灵活的反射技术,它可
以提高反射的灵活性,减少反射所使用的代码,提高可扩展性,是一种比较
流行的反射技术。

Java基本概念:多态

Java基本概念:多态

Java基本概念:多态⼀、简介描述:多态性是⾯向对象编程中的⼀个重要特性,主要是⽤来实现动态联编的。

换句话说,就是程序的最终状态只有在执⾏过程中才被决定,⽽⾮在编译期间就决定了。

这对于⼤型系统来说能提⾼系统的灵活性和扩展性。

多态允许相同类域的不同对象对同⼀消息做出响应。

即同⼀消息可以根据发送对象的不同⽽采⽤多种不同的⾏为⽅式。

多态可以让我们不⽤关⼼某个对象到底是什么具体类型,就可以使⽤该对象的某些⽅法,从⽽实现更加灵活的编程,提⾼系统的可扩展性。

如果对象的编译时类型和运⾏时类型不⼀致,就会造成多态。

存在条件:1. 类之间有继承关系。

2. ⼦类重写⽗类⽅法。

3. ⽗类引⽤指向⼦类对象。

注意:多态是⽅法的多态,属性没有多态性。

⼀个对象的实际类型是确定的,但是可以指向这个对象的引⽤的类型,却是可以是这对象实际类型的任意⽗类型。

⼦类继承⽗类,调⽤⽅法,如果该⽅法在⼦类中没有重写,那么就是调⽤的是⼦类继承⽗类的⽅法,如果重写了,那么调⽤的就是重写之后的⽅法。

'protected'修饰的⽗类⽅法可以被⼦类见到,也可以被⼦类重写,但是它是⽆法被外部所引⽤的,所以没有多态性。

通过⼀个变量调⽤其引⽤的对象的⼀个⽅法,编译器是否能让其编译通过,主要是看该变量类型的类中有没有定义该⽅法,如果有则编译通过,如果没有则编译报错。

⽽不是看这个变量所引⽤的对象中有没有该⽅法。

Java中的⽅法调⽤,是运⾏时动态和对象绑定的,不到运⾏的时候,是不知道到底哪个⽅法被调⽤的。

编写程序时,如果想调⽤运⾏时类型的⽅法,只能进⾏类型转换,不然通不过编译器的检查。

但是如果两个没有关联的类进⾏强制转换,会报类型转换异常:ClassCastException。

⽰例:public class Test {public static void main(String[] args) {/* 编译看左,运⾏看右 */Student student = new Student();/* 变量person是可以指向Person类型或其⼦类型的对象,所以可以指向Student类型对象 */Person person = new Student();/* 变量student能调⽤的⽅法是Student类中有的⽅法(包括继承过来的) */student.say();//Student/* 变量person能调⽤的⽅法是Person类中有的⽅法 */person.say();//Student}}class Person {public void say() {System.out.println("Person");}}class Student extends Person {public void say() {System.out.println("Student");}}⼆、重写、重载、多态的关系1. 重载是编译时多态调⽤重载的⽅法,在编译期间就要确定调⽤的⽅法是谁,如果不能确定则编译报错。

在JAVA中有两种多态指的是什么

在JAVA中有两种多态指的是什么
在JAVA中有两种多态指的是什么??

同问 在JAVA中有两种多态指的是什么 2009-01-15 14:32 提问者: mdydyy |浏览次数:2218次
我来帮他解答
精彩回答
2009-01-15 15:11在JAVA中有两种多态是指:运行时多态和编译时多态。关于类的多态性简介如下: 多态(polymorphism)意为一个名字可具有多种语义.在程序设计语言中,多态性是指”一种定义,多种实现”.例如,运算符+有多种含义,究竟执行哪种运算取决于参加运算的操作数类型: 1+2 //加法运算符 “1” + “2” //字符串连接运算,操作数是字符串 多态性是面向对象的核心特征之一,类的多态性提供类中成员设计的灵活性和方法执行的多样性. 1、类多态性表现 (1)方法重载 重载表现为同一个类中方法的多态性.一个类生命多个重载方法就是为一种功能提供多种实现.编译时,根据方法实际参数的数据类型\个数和次序,决定究竟应该执行重载方法中的哪一个. (2)子类重定义从父类继承来的成员 当子类从父类继承来的成员不适合子类时,子类不能删除它们,但可以重定义它们,使弗雷成员适应子类的新需求.子类重定义父类成员,同名成员在父类与子类之间表现出多态性,父类对象引用父类成员,子类对象引用子类成员,不会产生冲突和混乱. 子类可重定义父类的同名成员变量,称子类隐藏父类成员变量.子类也可以重定义父类的同名成员方法,当子类方法的参数列表与父类方法参数列表完全相同时,称为子类方法覆盖(override)父类方法。覆盖父类方法时,子类方法的访问权限不能小于父类方法的权限。 由于Object类的equals()方法比较两个对象的引用是否相等而不是值是否相等,因此一个类要覆盖Object类的equals()方法,提供本类两个对象比较相等方法. 覆盖表现为父类与子类之间方法的多态性.java 寻找执行方法的原则是:从对象所属的类开始,寻找匹配的方法执行,如果当前类中没有匹配的方法,则逐层向上依次在父类或祖先类中寻找匹配方法,直到Object类. 2、super 引用 在子类的成员方法中,可以使用代词super引用父类成员.super引用的语法如下: super([参数列表]) //在子类的构造方法体中,调用父类的构造方法 super.成员变量 //当子类隐藏父类成员变量时,引用父类同名成员变量 super.成员方法([参数列表]) //当子类覆盖父类成员方法时,调用父类同名成员方法 *注意:super引用没有单独使用的语法 3、多态性有两种: 1)编译时多态性 对于多个同名方法,如果在编译时能够确定执行同名方法中的哪一个,则称为编译时多态性. 2)运行时多态性 如果在编译时不能确定,只能在运行时才能确定执行多个同名方法中的哪一个,则称为运行时多态性. 方法覆盖表现出两种多态性,当对象获得本类实例时,为编译时多态性,否则为运行时多态性,例如: XXXX x1 = new XXXX(参数列表); //对象获得本类实例,对象与其引用的实例类型一致 XXX xx1 = new XXX(参数列表); x1.toString(); //编译时多态性,执行XXX类的方法. xx1.toString(); //编译时多态性,执行XXXX类覆盖的方法. XXXX为XXX的父类. 由于子类对象既是父类对象,父类对象与子类对象之间具有赋值相容性,父类对象能够被赋值为子类对象.例如, XXXX x2 = new XXX(参数列表); //父类对象获得子类实例,子类对象即是父类对象 x2.toString(); //运行时多态 x2声明为父类对象却获得子类XXX的实例,那么x2.toString()究竟执行父类方法还是执行子类覆盖的方法呢? 这分为两种情况: 取决于子类是否覆盖父类方法.如果子类覆盖父类方法,则执行子类方法; 如果没有覆盖,则执行父类方法. 在编译时,仅仅依据对象所属的类,系统无法确定到底应该执行那个类的方法,只有运行时才能确定,因此这是运行时多态. 父类对象并不能执行所有的子类方法,只能执行那些父类中声明\子类覆盖的子类方法.

java多态演讲ppt

java多态演讲ppt

sram实现多态三个条件:
1:继承 2:重写(重写父类继承的方法) 3:父类引用指向字类对象
sramwww.
安博思软
多态的实现:通过继承实现
JAVA中,一个类之能有一个父类,不能多继承。一个父类可 以有多个子类,而在子类里可以重写父类的方法,这样每个子
sramwww.
安博思软
sramwww.
安博思软
多态性有两种:
编译时多态性(静态绑 定)
运行时多态性(动态 绑定)
如果在编译时不能确定,只能 , 在运行时才能确定执行多个 同名方法中的哪一个,则称为 运行时多态性。
对于多个同名方法,如果在编 译时能够确定执行同名方法 中的哪一个,则称为编译时多 态性。
sramwww.
安博思软
多态的实现:通过接口实现
继承 单继承 一个类只能继承一个父类! 一个类只能继承一个父类!
接口
多实现
一个类可以同时实现多个接口! 类可以同时实现多个接口! 同时实现多个接口
一个接口类型变量也可以指向其实现类的实例,这也是 个接口类型变量也可以指向其实现类的实例,这也是
输出结果:
我知道错了,别打了! 为什么打我?我做错什么了! 我跑,你打不着!
//子类3 public class Son3 extends Father{ //重写父类打孩子方法 public void hitChild(){ System.out.println("我跑,你打不着!"); }}
//子类1 public class Son1 extends Father{ //重写父类打孩子方法 public void hitChild(){ System.out.println("我知道错了,别打了!"); }}

Java实验报告继承、多态、接口和异常处理

Java实验报告继承、多态、接口和异常处理

Java实验报告继承、多态、接⼝和异常处理实验5 继承、多态、接⼝和异常处理⼀、实验⽬的1、掌握Java的类和对象的声明和使⽤⽅法;2、掌握Java的类的继承和实现⽅法;3、掌握多态性在类的继承中的运⽤;4、掌握接⼝的定义与使⽤;5、掌握基本异常的处理机制;6、熟悉try语句与catch语句的搭配使⽤;7、了解有异常处理与没有异常处理的差别;8、多重catch语句的使⽤;9、使⽤Throws声明异常和Throw抛出异常。

⼆、实验环境1、PC微机;2、DOS操作系统或 Windows 操作系统;3、Java sdk程序开发环境、eclipse集成环境。

三、实验内容1. 设计三个类,分别是学⽣类Student,本科⽣类UnderGraduate,研究⽣类Postjgraduate,其中Student类是⼀个抽象类,它包含学⽣的基本信息如姓名、所学课程、课程成绩等,⽽Undergraduate类和Postgraduate类都是Student类的⼦类,这两个类计算课程成绩等级的⽅法有所不同,如下表所⽰。

假设某班级⾥既有研究⽣⼜有本科⽣,编写程序统计出全班学⽣2. 和Mobilephone具体实现,并设计⼀个应⽤程序类来使⽤这些类。

3.要求设计⼀个GUI图形窗⼝程序,该程序让⽤户输⼊⼀个星期中的任意⼀天的数字1-7,然后输出该数字所对应的是星期⼏。

四、实验步骤实验内容⼀1.建⽴package experiment5_1,其最终⽬录结构如下:2.建⽴Student类:package experiment5_1;public abstract class Student {final static int CourseNo = 3;String name;String type;int[] courses;String courseGrade;public Student(String name) {/doc/1bd4a299a66e58fafab069dc5022aaea998f41e2.html = name; courses = new int[CourseNo];courseGrade = "" ;}public abstract void calculateGrade();public String getName( ) {return name;}public String getType( ) {return type ;}public String getCourseGrade( ) {return courseGrade;}public int getCourseScore(int courseNumber) {return courses[courseNumber];}public void setName(String name) {/doc/1bd4a299a66e58fafab069dc5022aaea998f41e2.html = name;}public void setType(String type) {this.type = type;}public void setCourseScore(int courseNumber, int courseScore) { //按课程索引号设置课程成绩this.courses[courseNumber] = courseScore ;}}3.建⽴外部类(1)研究⽣类Postjgraduatepackage experiment5_1;public class postgraduate extends Student {public postgraduate(String name) {super(name);type = "研究⽣";}public void calculateGrade() {// TODO Auto-generated method stubint total = 0;double average = 0;for (int i = 0; i < CourseNo; i++) {total += courses[i];};average = total / CourseNo;if (average>=90&&average<100) courseGrade = "优秀"; else if (average>=80&&average<90) courseGrade = "良好"; else if (average>=70&&average<80) courseGrade = "⼀般"; else if (average>=60&&average<70) courseGrade = "及格"; else courseGrade = "不及格";}}(2)本科⽣类UnderGraduatepackage experiment5_1;public class undergraduate extends Student {public undergraduate(String name ) {super(name);type = "本科⽣";}public void calculateGrade() {int total = 0;double average = 0;for (int i = 0; i < CourseNo; i++) {total += getCourseScore(i) ;};average = total / CourseNo;if (average>=80&&average<100) courseGrade = "优秀"; else if (average>=70&&average<80) courseGrade = "良好"; else if (average>=60&&average<70) courseGrade = "⼀般"; else if (average>=50&&average<60) courseGrade = "及格"; else courseGrade = "不及格";}}4.编写代码测试函数package experiment5_1;public class polymorphism {public static void main(String[] args) {Student[] students = new Student[5];students[0] = new undergraduate("陈建平");students[1] = new undergraduate("鲁向东");students[2] = new postgraduate("匡晓华");students[3] = new undergraduate("周丽娜");students[4] = new postgraduate("梁欣欣");for (int i=0; i<5 ;i++) {students[i].setCourseScore(0,87);students[i].setCourseScore(1,90);students[i].setCourseScore(2,78);}for (int i=0; i<5 ;i++) {students[i].calculateGrade();}System.out.println("姓名" + " 类型" +" 成绩");System.out.println("-----------------------");for (int i=0; i<5 ;i++) {System.out.println(students[i].getName( )+" "+students[i].getType( )+" "+students[i].getCourseGrade( ));}}}实验内容⼆1.建⽴package experiment5_2,其最终⽬录结构如下:2.写接⼝Soundable代码:package experiment5_2;public interface Soundable {public void increaseV olume( );public void decreaseV olume( );public void stopSound( );public void playSound( );}3.创建三个类Radio、Walkman和Mobilephone具体实现,分别添加代码:// Mobilephone类package experiment5_2;class Mobilephone implements Soundable{public void increaseV olume( ) {System.out.println("增⼤⼿机⾳量");}public void decreaseV olume( ) {System.out.println("减⼩⼿机⾳量");}public void stopSound( ) {System.out.println("关闭⼿机");}public void playSound( ) {System.out.println("⼿机发出来电铃声");}}// Walkman类package experiment5_2;class Walkman implements Soundable { public void increaseV olume( ) { System.out.println("增⼤随声听⾳量"); }public void decreaseV olume( ) { System.out.println("减⼩随声听⾳量"); }public void stopSound( ) {System.out.println("关闭随声听");}public void playSound( ) {System.out.println("随声听发出⾳乐"); }}// Radio类package experiment5_2;class Radio implements Soundable{ public void increaseV olume( ) { System.out.println("增⼤收⾳机⾳量"); }public void decreaseV olume( ) { System.out.println("减⼩收⾳机⾳量"); }public void stopSound( ) {System.out.println("关闭收⾳机");}public void playSound( ) {System.out.println("收⾳机播放⼴播"); }}4.创建people类及编写测试代码://People类package experiment5_2;class People {public void listen(Soundable s) {s.playSound( );}}//测试代码package experiment5_2;import java.util.Scanner;public class InterfaceTest {public static void main(String[] args) {int i;People sportsman = new People( );Scanner scanner = new Scanner(System.in);Soundable[] soundDevice = new Soundable[3];//往声⾳设备数组中放⼊能发声的设备soundDevice[0] = new Radio( );soundDevice[1] = new Walkman( );soundDevice[2] = new Mobilephone();System.out.println("你想听什么? 请输⼊选择:0-收⾳机1-随声听2-⼿机");i = scanner.nextInt( );//开始听声⾳sportsman.listen(soundDevice[i]);soundDevice[i].increaseV olume( );soundDevice[i].stopSound();scanner.close();}}实验内容三1.建⽴package experiment5_3,其最终⽬录结构如下package experiment5_3;import java.awt.*;import java.awt.event.*;import javax.swing.*;public class DateTransf extends JFrame implements KeyListener{/****/private static final long serialVersionUID = 1L;private static DateTransf frm;private static JTextField txt;private static JTextField data;DateTransf() {setTitle("数字与星期转换");setLocation(700, 300);setSize(400,130);}public static void main(String[] args) {frm = new DateTransf();frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frm.setLayout(new GridLayout(2,2));txt = new JTextField(12);data = new JTextField(12);JLabel lable1 = new JLabel("输⼊数字:");JLabel lable2 = new JLabel("星期⼏:");frm.add(lable1);txt.addKeyListener(frm);frm.add(txt);frm.add(lable2);frm.add(data);frm.setVisible(true);}public void keyPressed(KeyEvent e) {if (e.getSource() == txt) {if (e.getKeyCode() == KeyEvent.VK_ENTER) // 判断按下的键是否是回车键{try {int number = Integer.parseInt(txt.getText());switch (number) {case 1:data.setText("Mon");break;case 2:data.setText("Tue");break;case 3:data.setText("Wen");break;case 4:data.setText("Thu");break;case 5:data.setText("Fri");break;case 6:data.setText("Sat");break;case 7:data.setText("Sun");break;default:JOptionPane.showMessageDialog(null, "您输⼊的数字不是1~7","⽆效⽇期",/doc/1bd4a299a66e58fafab069dc5022aaea998f41e2.html RMATION_MESSAGE); break;}}catch (Exception e1) {// TODO: handle exceptionJOptionPane.showMessageDialog(null, "您输⼊的不是整数","⽆效⽇期",/doc/1bd4a299a66e58fafab069dc5022aaea998f41e2.html RMA TION_MESSAGE); }}}}public void keyReleased(KeyEvent e) {}public void keyTyped(KeyEvent e) {}}2.编译运⾏五、实验结果●实验内容⼀结果:●实验内容⼆结果:●实验内容三结果:六、实验⼩结1.这次实验的内容⽐较多,需要掌握Java的类和对象的声明和使⽤⽅法、Java的类的继承和实现⽅法、多态性在类的继承中的运⽤、接⼝的定义与使⽤、基本异常的处理机制、try语句与catch语句的搭配使⽤等等;2. 在实验过程中,重点是要区分好实例和类,灵活掌握类的调⽤。

JAVA多态性 ppt课件

JAVA多态性  ppt课件

a.fun1();
// 此方法被子类覆写过
}
}
PPT课件
6
对象的向下转型
class A{ public void fun1(){
// 定义类A // 定义fun1()方法
System.out.println("A --> public void fun1(){}") ;
} public void fun2(){
PPT课件
5
对象的向上转型
class A{ public void fun1(){
// 定义类A // 定义fun1()方法
System.out.println("A --> public void fun1(){}") ;
} public void fun2(){
// 定义fun2()方法
this.fun1() ;
A a = new B() ;
// 发生了向上转型的关系,子类 --> 父类
B b = (B)a ;
// 此时发生了向下转型关系
b.fun1() ;
// 调用方法被覆写的方法
b.fun2() ;
// 调用父类的方法
b.fun3() ;
// 调用子类自己定义的方法
}
}
PPT课件
7
多态禁忌
•千万不要出现这样的操作:就是将父类对象转换成为子类是类型 – Animal a=new Animal(); – Dog d4=(Dog)a;//类造型异常
}
}; class B extends A{
public void fun1(){
// 子类通过extends继承父类 // 覆写父类中的fun1()方法

Java的动态多态性

Java的动态多态性

angle 类和Trigle 类的对象给t 、 赋值, r 利
4 结语
多态性提高了程序的抽象程度和简洁 性,降低 了 类和程序模块之间的祸合性,提 高了类模块之间的封闭性。实现了 “ 一个接 口,多个 方法” 。
参考文献 【 朱喜福, ] 1 编著. J va 程序设计, a 清华大学出 版社 .
盛. 娜井
昊金秀
(黄冈职业技术学院
湖北黄冈
435002 )
摘 要: 运行时多 态性是面向 对象程序设计代码重用的一个最强 大机制,动态性的 概念也可以被说成 “ 接口 一个 ,多个方 。 av a 法” J
实现运行时多态性的基础是动态方法调度,它是一种在运行时而不是在编译时动态绑定的机制。 关键词: 覆盖 多态性 动态多 态性 上溯造型 中图分类号: T P 3 文献标识码: A 文章编号: 1672一 3791(2007)07(b卜0246一 01 面向对象的程序设计有三大特点: 封装, 继承和多态。多态提供了另一个层面的接口 与实现分离,也就是说把做什么和怎么做分 离开来。多态性是一项很重要的技术。 个对象在调用与其子类同名成员函数 ( 函数 原型一致) 时,调用规则是依据对象在实例 化时而非定义时的类型相应地调用对应类中 的同名成员函数,是在程序执行的过程中根 据不同对象类型有不同的绑定。 2 上述代码中Rect angle 类和T rigle 类都是 Sha pe 类的子类, 程序中定义了Shape 类的 两个引用对象t 和r , 分别通过创 建子类Re 一 t c
住砚. .
(目加 翻 州翻,
使用单排深层搅拌桩作防水帷幕时必须设反 循环观测井。 ④有邻近建筑物的基坑支护桩配筋宜用 双面配筋 ,以备加内撑时使用。 ⑤桩顶的圈梁作用重大,起调节跨中与 附近桩内力的作用,应予重视。

《java面向对象程序设计继承和多态》教案

《java面向对象程序设计继承和多态》教案

《Java面向对象程序设计-继承和多态》教案第一章:引言1.1 课程简介本课程旨在帮助学生掌握Java面向对象程序设计中的继承和多态概念。

通过学习,学生将能够理解继承和多态的原理,并能够运用它们解决实际编程问题。

1.2 课程目标理解继承的概念和原理掌握如何使用继承来实现代码复用理解多态的概念和原理掌握如何使用多态来实现动态绑定第二章:继承2.1 继承的概念介绍继承的定义和作用解释为什么使用继承2.2 继承的语法介绍如何使用extends关键字实现继承解释继承中的构造函数和继承关系2.3 继承的实现演示如何使用继承来复用代码解释继承的层次结构和菱形继承第三章:多态3.1 多态的概念介绍多态的定义和作用解释多态的好处3.2 方法重写解释方法重写的概念和规则演示如何使用方法重写来实现多态3.3 方法重载解释方法重载的概念和规则演示如何使用方法重载来提高代码可读性第四章:继承和多态的案例分析4.1 案例一:动物和鸟类使用继承和多态来定义动物和鸟类的关系实现动物和鸟类的属性和方法4.2 案例二:形状和圆形使用继承和多态来定义形状和圆形的关系实现形状和圆形的属性和方法第五章:总结和练习5.1 课程总结回顾继承和多态的概念和原理强调继承和多态在面向对象程序设计中的重要性5.2 练习题提供一些练习题,以帮助学生巩固所学知识第六章:继承和多态的深入理解6.1 继承的类型解释接口继承和类继承的区别讨论继承的优点和缺点6.2 多态的应用探讨多态在日常编程中的应用场景分析多态如何提高程序的可扩展性和灵活性第七章:Java中的继承和多态实例7.1 继承实例:汽车和摩托车通过实例展示如何使用继承来创建汽车和摩托车类演示如何通过继承来扩展属性和方法7.2 多态实例:支付接口和具体的支付方式创建一个支付接口和多个具体的支付方式类演示如何使用多态来实现不同的支付方法第八章:继承和多态的陷阱与最佳实践8.1 继承的陷阱讨论继承可能带来的过度耦合问题解释如何避免继承的陷阱8.2 多态的陷阱分析多态可能导致的类型不匹配问题探讨如何安全地使用多态8.3 最佳实践提供使用继承和多态的最佳实践指南强调代码可读性和可维护性第九章:继承和多态在设计模式中的应用9.1 设计模式简介介绍设计模式的概念和重要性解释设计模式与继承和多态的关系9.2 继承和多态在设计模式中的应用案例通过案例分析展示继承和多态如何在设计模式中发挥作用讨论设计模式如何提高程序设计的质量和可复用性第十章:课程回顾与拓展学习10.1 课程回顾总结本课程的重点内容和关键概念强调继承和多态在实际编程中的应用10.2 拓展学习资源提供一些拓展学习的资源和建议鼓励学生继续深入学习面向对象程序设计的其他方面第十一章:继承和多态的实际应用案例11.1 案例分析:图形库的设计通过分析图形库的设计,展示继承和多态如何用于实现复杂的图形操作。

Java程序设计教程第7章7.2 多 态

Java程序设计教程第7章7.2 多 态
mas参ter数.fe都ed是(pPenegt类uin的);子类
master.feed(xxx); ……
public void feed( XXX xxx ) { xxx.eat();
可否使用一个feed(Pet pet) 实现对所有宠物的喂食?
}
… … 频繁修改代码,代码可扩展性、可维护性差,
}
如何优化?
课堂操作——购置新车2-2
提前做完的同学可以尝试改进系统:
1. 循环从控制台选择汽车种类 2. 从控制台输入天数 3. 累加计算总租金
20/30
多态
总结
使用多态的好处
减少类中代码量 提高代码的可扩展性和可维护性
向上转型——子类转换为父类,自动进行类型转换
向下转型——父类转换为子类,结合instanceof运算符进行强 制类型转换
编写测试方法
调用主人类给狗狗喂的方法 调用主人类给企鹅喂的方法
为什么使用多态5-2
3/30
为什么使用多态5-3
问题
如果再领养XXX宠物,并需要给XXX喂食,怎么办?
添加XXX类,继承Pet类,实现吃食方法 修改Master类,添加给XXX喂食的方法
4/30
为什么使用多态5-4
主人类
练习
需求说明
使用多态实现喂养宠物功能 增加宠物猫并喂食,其健康值增加4
9/30
使用父类作为方法返回值实现多态
使用多态实现领养宠物
使用父类作为方法返回值 实现思路
在Master类添加领养方法getPet(String typeId ) 创建测试类,根据主人选择宠物类型编号来领养宠物
public class Master { public void feed( Dog dog ) { dog.eat(); } public void feed( Penguin pgn ) { pgn.eat(); }

JavaEEDay8_面向对象继承2多态

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对象,要求使用构造方法给该对象完成全部初始值的赋值工作。

Java基础多态PPT学习教案

Java基础多态PPT学习教案
通过多态计算汽车租赁的总租 金
第3页/共31页
本章目标
掌握多态的优势和应用场合 掌握父类和子类之间的类型转
换 掌握instanceof运算符的使用 使用父类作为方法形参实现多

第4页/共31页
为什么使用多态5-1
宠物生病了,需要主人给宠物看病
不同宠物看病过程不一样 Q仔 狗狗
打针
吃药
}
Master类p编ubD类liocg写clas喂s Do养g ext方ends法Pet,{ 使用Pet类型作为参数
运行时,调用喂养方法时,传递一个子类的对
public void eat(){ super.health = super.health + 3;

} }
Master
pu类blic void feed (Pet pet){

}
class ColorPrinter (){

print(String str) {

System.out.println("输出彩色的"+str);
}
}
class BlackPrinter (){
print(String str) {
同一种操
只能调用 System.out.println("输出黑白的"+str); 作方式,
需求说明:
实现喂养宠物功能 讲解需求说明 不同宠物吃的东西不同 主人可以第1喂7页/养共31不页 同类型宠物
指导——实现喂养宠物功能2-2
实现思路:
在Pet类添puPbe加litc类cla吃ss P饭et { 的抽象方法
子类实现吃饭方法 protected abstract void eat();

【7】Java多态:向上转型、向下转型、instanceof运算符

【7】Java多态:向上转型、向下转型、instanceof运算符

【7】Java多态:向上转型、向下转型、instanceof运算符⼀、概念多态,是允许不同类的对象对同⼀消息做出不同的响应,是⾯向对象最核⼼的特征。

举个栗⼦,打印机,有⿊⽩的打印机,可以打印⿊⽩效果,有彩⾊打印机,可以打印彩⾊效果。

再举个栗⼦,上课铃响了,上体育课的学⽣跑到操场上站好,上语⽂课的学⽣在教室⾥坐好⼀样。

再再举个栗⼦,动物们都会叫,猫咪叫声是喵喵喵,狗叫声是汪汪汪。

⼆、分类1)编译时多态(也叫设计时多态,举例如⽅法重载)2)运⾏时多态(程序运⾏时决定调⽤哪个⽅法)【⼀般情况下在Java中提到多态指的是运⾏时多态。

】三、多态存在的三个必要条件1)要有继承关系2)⼦类要重写⽗类的⽅法3)⽗类引⽤指向⼦类对象四、简单理解如果不去理解多态的原理,就从使⽤的⾓度来讲,可以总结出了多态⽆⾮就是三句话:⽐如我们有⼀个⽗类Father,有⼀个⼦类Children1、向上转型是⾃动的。

即Father f = new Children()是⾃动的,不需要强转2、向下转型要强转。

即Children c = new Father()是⽆法编译通过的,必须要Children c = (Children)new Father(),让⽗类知道它要转成具体哪个⼦类3、⽗类引⽤指向⼦类对象,⼦类重写了⽗类的⽅法,调⽤⽗类的⽅法,实际调⽤的是⼦类重写了的⽗类的该⽅法。

即Father f = new Children(),f.toString()实际上调⽤的是Children中的toString()⽅法五、向上转型&向下转型&instanceof运算符⽗类Animalpublic class Animal {//属性:昵称、年龄private String name;private int month;//⽆参构造public Animal(){}//带参构造public Animal(String name, int month){=name;this.month=month;}//get、set⽅法public String getName() {return name;}public void setName(String name) { = name;}public int getMonth() {return month;}public void setMonth(int month) {this.month = month;}//⽅法:吃东西public void eat(){System.out.println("动物都有吃东西的能⼒");};// ⽅法:静态⽅法say}Animal⼦类Catpublic class Cat extends Animal {//属性:体重private double weight;//⽆参构造public Cat() {}//带参构造public Cat(String name, int month, double weight) {super(name, month);//调⽤⽗类构造,也可以这个写法this.setMonth(month) this.weight = weight;}//get、set⽅法public double getWeight() {return weight;}public void setWeight(double weight) {this.weight = weight;}//⽅法:跑动(cat独有的⽅法)public void run() {System.out.println("⼩猫快乐的奔跑");}//⽅法:吃东西(重写⽗类⽅法)@Override//快速⽣成重写⽅法快捷键CTRL+Opublic void eat() {System.out.println("猫吃鱼~~");}//⽅法:⼦类的静态⽅法,不加@Override,与⽗类⽆重写关系public static void say(){System.out.println("⼩猫碰胡须");}}Cat⼦类Dogpublic class Dog extends Animal{//属性:性别private String sex;public Dog(){}public Dog(String name,int month,String sex){this.setMonth(month);this.setName(name);this.setSex(sex);}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;//⽅法:睡觉public void sleep(){System.out.println("⼩狗有午睡的习惯");}//⽅法:吃东西(重写⽗类⽅法)@Overridepublic void eat() {System.out.println("狗吃⾁~~");}}Dog测试类Testpublic class Test {public static void main(String[] args) {/*向上转型、隐式转型、⾃动转型Animal two=new Cat(),⽗类引⽤指向⼦类实例,可以调⽤⼦类重写⽗类的⽅法two.eat()以及⽗类派⽣的⽅法two.setMonth(2),⽆法调⽤⼦类独有⽅法two.run()*/// 应⽤多态的实现,多种编码⽅式Animal one= new Animal() {};//1第⼀种,常规⽅法Animal two=new Cat();//2第⼆种Animal指向Cat实例Animal three=new Dog();//3第三种Animal指向Dog实例one.eat();two.eat();three.eat();two.setMonth(2);two.getMonth();// two.run();//⽆法调⽤/*注意:⽗类中的静态static⽅法say⽆法被⼦类重写,所以向上转型之后,只能调⽤到⽗类原有的静态⽅法say 如果想调⽤⼦类的say⽅法,可以通过向下转型转回来⼩类转型为⼤类*/Cat cat=(Cat)two;cat.say();System.out.println("===========向上转型&向下转型分割线============");/*向下转型、强制类型转换* ⼦类引⽤指向⽗类对象,此处必须进⾏强转Cat temp=two-->Cat temp=(Cat)two,* 可以调⽤⼦类特有的⽅法* 必须满⾜转型条件才能进⾏强转* instanceof运算符:返回true/false,可以规避异常的产⽣* 判断左边的对象A是否为右边B的实例,或者对象A是否有B类的特征*/if(two instanceof Cat){//如果two是Cat的实例Cat temp=(Cat)two;//向下转型temp.eat();temp.run();//可以调⽤⼦类独有⽅法temp.getMonth();System.out.println("two可以转换为Cat类型");}if(two instanceof Dog){Dog temp2=(Dog)two;//cat和dog不兼容,所以这⾥不能强转temp2.eat();temp2.sleep();temp2.getSex();System.out.println("two可以转换为Dog类型");}if(two instanceof Animal){System.out.println("Animal");}if(two instanceof Object){System.out.println("Object");Test。

java多态实验报告

java多态实验报告

java多态实验报告Java多态实验报告引言:Java是一种面向对象的编程语言,多态是其核心特性之一。

本实验旨在通过编写代码并运行实验,深入理解Java中的多态概念和使用方法。

实验目的:1. 理解多态的概念和原理;2. 掌握多态的使用方法和技巧;3. 通过实验加深对多态的理解和应用。

实验步骤:1. 创建一个抽象类Animal,并定义一个抽象方法makeSound();2. 创建两个继承自Animal的子类:Dog和Cat,并分别实现makeSound()方法;3. 在主函数中创建一个Animal类型的数组,包含两个元素,分别为Dog和Cat 的实例;4. 遍历数组,调用每个元素的makeSound()方法;5. 运行程序,观察输出结果。

实验结果:通过运行实验代码,我们可以看到Dog和Cat的实例都调用了makeSound()方法,但输出的结果却不同。

这就是多态的体现。

多态性允许我们在父类Animal的引用下,调用子类Dog和Cat的方法,实现了代码的灵活性和扩展性。

实验分析:1. 多态的概念:多态是指同一种类型的对象,在不同的情况下表现出不同的行为。

在本实验中,Dog和Cat都是Animal的子类,它们都继承了makeSound()方法,但实现方式不同,因此在调用时会表现出不同的行为。

2. 多态的原理:多态的实现依赖于继承和方法重写。

通过将子类对象赋值给父类引用,实现了对子类对象的调用。

在运行时,会根据实际对象的类型来确定调用哪个方法。

3. 多态的优势:多态使代码更加灵活和可扩展。

当需要新增一种动物时,只需创建一个新的子类并实现makeSound()方法,不需要修改原有的代码,即可实现新增功能。

4. 多态的应用场景:多态常用于面向对象的设计和开发中,尤其是在需要处理多种类型对象的情况下。

通过使用多态,可以简化代码结构,提高代码的可读性和可维护性。

实验总结:通过本次实验,我深入理解了Java中的多态概念和使用方法。

Java语言中动态多态性的实现及应用

Java语言中动态多态性的实现及应用
{private double radius=5;
private String color;
,/实 现接 1:3 Shape2D的 抽 象方 法 getArca0 public double getAreaO
{return pi radius radius;} ,/实现接 13 Color的抽象方法 setColor0
//定 义接 口 Shape2D
public interface Shape2D
{double pi=3.14; public abstract double getArca0;
J //定义接 口 Color
public interface Color
{public abstract void sctColor(String str);} //定义接 13 Shape3D继 承 Shape2D和 Color两个接 口,拥有两个接 口的 所 有抽 象 方 法 和 属性
public void setColor(String str) {color=str;】 ) ,/定 义类 Cylinder实现 Shape3D接 口
class Cylinder implements Shape3D { pr ivate double radius=5;
private double height=10;
private String color;
1.引 言 多态性 (polymorpbism)一词来源于拉丁语 lv(表示多的意思)和 mor_ Dhos(意为形态 ),其字面的含义是多种形态。在面向对象系统中 ,多态 性是其核心内容之一 ,反映了人们在求解 问题 时,对相似性 问题 的一种 求解方法。Java语言实现 了两种多态性 :静态多态性和动态 多态性 。本 文重点论述其采用重写机制实现动态多态性 的原理 ,并结合实例讲解 动态多态性的应用 。 2.关 于 多态 的 概 念 2.1继 承 继承描述了两个类之 间的一种关系 。当一个类拥 有另外 一个类 的 所有非私有数据 和操作时 ,就称这两个类之间具有继 承关系。被继承 的 类称为父类或超类 ,由继承而得到的类称为子类。Java语言不支持 多重 继 承,一个类 只能有一个直接父类 ,父类可 以同时拥 有多个子类 。Java 中用 关 键 字 extends实现 继 承 。 2.2重 写 在类的继承的过程 叶】,子类可以根据需要对 从父类继承来的方法 进行重新定义 ,这时父类和子类中的两个 方法功能不同 ,但是要求两者 名字 、参 数 列 表 和返 回类 型 要 一 致 ,就 称 子类 重 写 了 父类 的该 方 法 对 于子类重写的父类 的方法 ,若父类的对象调用这 个方法时 ,则 调用父类 中的定 义 ;若子类的对象使用这个方法时 ,则 调用 子类中的定义 ,父类 中 的定 义 如 同 被 “屏 蔽 ”了。 2-3抽 象类 在 Jaya中 ,提供 了抽象类来表示 现实世界中的抽象概念 ,即用抽象

Java中封装、继承、多态的理解

Java中封装、继承、多态的理解

Java中封装、继承、多态的理解Java中的继承、封装、多态继承的理解:1、继承是⾯向对象的三⼤特征之⼀,也是实现代码复⽤的重要⼿段。

Java的继承具有单继承的特点,每个⼦类只有⼀个直接⽗类。

2、Java的继承通过extends关键字来实现,实现继承的类被称为⼦类,被继承的类称为⽗类(有的也称其为基类、超类),⽗类和⼦类的关系,是⼀种⼀般和特殊的关系。

就像是⽔果和苹果的关系,苹果继承了⽔果,苹果是⽔果的⼦类,⽔果是苹果的⽗类,则苹果是⼀种特殊的⽔果。

3、Java使⽤extends作为继承的关键字,extends关键字在英⽂是扩展的意思,⽽不是继承。

为什么国内把extends翻译成继承呢?除了与历史原因有关外,把extends翻译成为继承也是有其道理的:⼦类扩展⽗类,将可以获得⽗类的全部属性和⽅法,这与汉语中得继承(⼦辈从⽗辈那⾥获得⼀笔财富成为继承)具有很好的类似性。

值得指出的是:Java的⼦类不能获得⽗类的构造器。

4、实例:class BaseClass{public double weight;public void info() {System.out.println("我的体重是"+weight+"千克");}}public class ExtendsDemo001 extends BaseClass {public static void main(String[] args) {//创建ExtendsDemo001对象ExtendsDemo001 ed = new ExtendsDemo001();//ExtendsDemo001本⾝没有weight属性,但是ExtendsDemo001的⽗类有weight属性,也可以访问ExtendsDemo001对象的属性ed.weight = 56;//调⽤ExtendsDemo001对象的info()⽅法();}}打印结果为:我的体重是56.0千克5、Java类只能有⼀个⽗类。

学习猿地_Java_10_Java面向对象特征之一多态

学习猿地_Java_10_Java面向对象特征之一多态
}
接口
interface
接口的基本概念
• 接口可以看成是特殊的抽象类。即只包含有抽象方法的抽象类。
interface Runner {
通过interface关键字定义接口
public static final int DEF_SPEED = 100;
接口中不可以定义成员变量,但可以定义常量。 public void run();
private int x;
abstract关键字声明为抽象类。
private int y;
public abstract boolean contains(int x, int y);
} 用abstract修饰的方法,称之为抽象方法,抽象
方法仅仅有方法的定义,而没有方法的实现。
继承抽象类
• 一个类继承抽象类必须实现其抽象方法(除非该类也声明为抽象类)。
class AmericanCurl implements Hunter { public void run() {… … …} public void hunt() {… … …}
}
AmericanCurl必须实现Hunter 接口中的hunt 方法以及其父接口Runner中的run方法。
匿名内部类
repeat(5, new Action() {
public void doSth() {
System.out.println("Hello, World");
} });
通过内部匿名类传递参数,此处的语义可解释为:通过接口回调传
}
递了一个方法给repeat,让repe抽象类的基本概念
• 用abstract关键字修饰的类称为抽象类。抽象类不能实例化,抽象类的意义 在于“被继承”。抽象类为其子类“抽象”出了公共的部分,通常也定义了

列举java中多态的体现

列举java中多态的体现

列举java中多态的体现多态是面向对象编程中的一个重要概念,它允许不同的对象对同一消息做出不同的响应。

在Java中,多态性是通过继承和接口实现来实现的。

下面将列举Java中多态的体现。

一、方法重载方法重载是指在同一个类中定义了两个或两个以上名称相同但参数类型或个数不同的方法。

这种情况下,当调用该方法时,编译器会根据参数类型和个数来判断应该调用哪个方法。

这种方式就是Java中最基本的多态性体现。

二、方法覆盖方法覆盖是指子类重新定义了父类中已有的方法,并且子类和父类中该方法具有相同的名称、返回值类型和参数列表。

当使用父类引用变量引用子类对象时,调用该方法时会自动调用子类中定义的那个方法,而不是父类中定义的那个方法。

三、向上转型向上转型是指将子类对象赋值给父类引用变量。

这种情况下,可以通过父类引用变量来访问子类对象中继承自父类的成员变量和成员方法。

由于向上转型后只能访问到父类中定义的成员变量和成员方法,因此无法直接访问子类中定义的成员变量和成员方法。

四、动态绑定动态绑定是指在运行时根据对象的实际类型来确定调用哪个方法。

在Java中,所有的非私有方法都是动态绑定的,也就是说,当调用一个非私有方法时,编译器不会确定要调用哪个方法,而是等到运行时才根据对象的实际类型来确定要调用哪个方法。

五、抽象类和接口抽象类和接口也是Java中多态性的体现。

抽象类和接口都定义了一些规范,而具体实现则由子类来完成。

当使用父类引用变量引用子类对象时,可以通过父类引用变量来访问子类对象中实现了父类或接口中定义的规范的成员变量和成员方法。

六、多态数组多态数组是指数组中存储的元素可以是不同类型的对象。

在Java中,可以使用Object类型来定义一个多态数组,在运行时将不同类型的对象存储到该数组中。

由于Object类型是所有类型的父类,因此可以使用父类引用变量来访问存储在数组中的不同类型的对象。

七、泛型泛型也是Java中多态性的一种体现方式。

JAVA 05 继承与多态

JAVA 05 继承与多态

代码重用
易于维护
可扩展性
CD -artist -numberOfTracks +getArtist() +getNumberOfTracks() DVD -director +getDirector()
extends
extends class SubClassName extends BaseClassName
DanceGroup ControlPanel
Band
Waltz Rumba
Cha-Cha
Dancer
Salsa
接口(cont’d)
实现和使用接口
• class ClassName extends BaseClass implements Interface1,Interface2{…}
定义接口
类与接口(相似)
class interface
A superclass provides a secondary An interface provides a secondary data type to objects of its subclasses. data type to objects of classes that implement that interface. An abstract class cannot be instantiated. A concrete subclass of an abstract class must define all the inherited abstract methods. A class can extend another class. A subclass can add methods and override some of its superclass’s methods. An interface cannot be instantiated. A concrete class that implements an interface must define all the methods specified by the interface. An interface can extend another interface (called its superinterface) by adding declarations of abstract methods

java多态练习题

java多态练习题

Java多态练习题一、选择题A. 多态是指同一方法可以根据对象的不同而有不同的实现B. 多态只能用于类的继承关系中C. 在Java中,方法重载不属于多态D. 多态可以提高代码的可扩展性和可维护性A. extendsB. implementsC. staticD. overrideA. 可以直接调用子类的特有方法B. 必须进行类型转换才能调用子类的特有方法C. 可以调用父类的所有方法D. 无法调用任何方法二、填空题1. 在Java中,多态的三个必要条件是:________、________和________。

2. 当子类重写父类的方法后,可以使用________关键字来调用父类的方法。

3. 在Java中,________关键字用于判断两个对象的类型是否相同。

三、判断题1. 多态允许同一操作作用于不同的对象,产生不同的执行结果。

()2. 方法重载(Overload)和方法重写(Override)都是实现多态的方式。

()3. 在Java中,子类对象可以直接赋值给父类引用,而无需进行类型转换。

()四、简答题1. 请简述Java中多态的作用。

2. 请说明方法重写(Override)和方法重载(Overload)的区别。

3. 在使用多态时,如何访问子类特有的方法?五、编程题1. 定义一个动物类(Animal),包含一个吃(eat)的方法。

再定义一个狗类(Dog),继承动物类,并重写吃(eat)方法。

编写一个测试类,创建一个动物类引用,指向一个狗对象,并调用吃(eat)方法。

2. 编写一个图形类(Shape),包含一个求面积(getArea)的方法。

再定义两个子类:矩形类(Rectangle)和圆形类(Circle),分别重写求面积(getArea)方法。

编写一个测试类,创建一个图形数组,包含矩形和圆形对象,遍历数组并调用求面积(getArea)方法。

3. 定义一个员工类(Employee),包含姓名、工资等属性,以及一个计算工资(calculateSalary)的方法。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

java多态用法
多态是面向对象编程中的一个重要概念,它允许不同类的对象执行相同的操作。

在Java中,多态通过继承和重写父类方法来实现。

多态性可以提高代码的可重用性,并且允许我们以更灵活的方式使用对象。

在本篇文章中,我们将介绍Java多态的一些常见用法。

一、方法重写(MethodOverriding)
方法重写是子类定义一个与父类方法具有相同名称、参数列表和返回类型的方法。

当调用该方法时,子类的方法将根据子类的数据类型来执行。

这种机制允许我们根据不同的对象类型执行不同的操作。

示例代码:
```java
classAnimal{
publicvoidmakeSound(){
System.out.println("动物发出声音");
}
}
classDogextendsAnimal{
@Override
publicvoidmakeSound(){
System.out.println("汪汪汪");
}
}
classCatextendsAnimal{
@Override
publicvoidmakeSound(){
System.out.println("喵喵喵");
}
}
```
在上面的代码中,我们定义了一个Animal类,它有一个makeSound()方法。

Dog和Cat类继承了Animal类,并重写了makeSound()方法。

当我们调用makeSound()方法时,将根据对象的实际类型来执行相应的方法。

二、方法重载(MethodOverloading)
方法重载是在同一个类中定义多个具有相同名称的方法,但参数列表不同。

在Java中,方法重载基于参数的类型和数量进行区分。

它允许我们使用相同的名称来区分不同对象的方法。

示例代码:
```java
classShape{
publicvoiddraw(Shapeshape){
System.out.println("绘制一个形状");
}
publicvoiddraw(intx,inty){
System.out.println("在坐标("+x+","+y+")绘制一个点");
}
}
```
在上面的代码中,我们定义了一个Shape类,它有两个名为draw()的方法。

第一个方法接受一个Shape对象作为参数,而第二个方法接受两个整数作为参数。

由于参数列表不同,编译器会根据输入参数的类型和数量来确定要执行的方法。

三、向上转型(Upcasting)和向下转型(Downcasting)
多态的另一种常见用法是向上转型和向下转型。

向上转型是指将子类对象转换为父类对象,而向下转型是指将父类对象转换为子类对象。

这种转换允许我们使用较低层次的类来调用较高层次类的方法,反之亦然。

这样可以提高代码的可扩展性和可维护性。

DogextendsAnimal{
@Override
publicvoidmakeSound(){
System.out.println("汪汪汪");
}
}
publicclassMain{
publicstaticvoidmain(String[]args){
Animalanimal=newDog();//向上转型,使用较低层次的Animal对象调用较高层次的方法makeSound()
animal.makeSound();//输出"汪汪汪"而不是Animal类中的默认行为"动物发出声音"因为它已经转换为Dog类型并继承了Animal类型的makeSound()方法。

Dogdog=(Dog)newAnimal();//向下转型,使用较高层次的Dog对象调用较低层次的方法makeSound()方法,因为Animal是Dog的父类,它应该具有这个方法。

这样就能确保正确的调用Dog类中的makeSound()方法。

dog.makeSound();//输出"汪汪汪"因为现在调用的是Dog类中的makeSound()方法。

这就是向下转型的正确用法。

否则会抛出ClassCastException异常。

这是向下转型的必要性条件。

向下转型不是强制性的,但是向上转型是强制性的。

因为向下转型可能抛出ClassCastException异常所以我们需要谨慎使用向下转型并确保不会引发异常或错误。

四、抽象方法和接口在多态中的应用抽象方法和接口是Java多态的另一个重要应用领域。

抽象方法是一种没有实现的方法声明,它只提供了一个方法的签名和返回类型。

接口是一组方法的集合,这些方法必须在实现该接口的类中实现或重写。

通过使用抽象方法和接口,我们可以创建灵活的代码结构。

相关文档
最新文档