轻松学Java之继承和多态
- 格式:ppt
- 大小:1.01 MB
- 文档页数:23
Java中的继承、封装、多态Java中的继承、封装、多态本博客包含以下内容,博主是菜鸟,正在努力学习中,如有错误或不足,欢迎交流讨论。
1.基本定义2.初始化和类的加载3.final关键字4.类之间的关系5.向上转型6.多态的缺陷7.构造器和多态1、基本定义继承:在创建一个新类(子类、导出类)时,使用extends关键字表明它派生于一个已经存在的类(父类、基类、超类),导出类会获得基类的所有域和方法,但并不是一定能直接访问,和访问权限控制有关。
和组合相比,继承是隐式的放置基类子对象封装:封装即将成员变量或者方法的具体实现隐藏起来,对用户提供接口的形式来访问,用户不需要知道具体有什么以及怎么现实,只需要知道如何使用。
若是将一个类的字段和某些方法封装起来不让用户直接访问字段或者方法,只提供类似接口的方式访问,对用户来说,此类可以看做一种抽象数据类型,比如stack多态:有称动态绑定、后期绑定或运行时绑定。
首先明确下什么是绑定:将方法调用同一个方法主体关联起来。
若在程序执行前进行绑定,叫做前期绑定,由编译器和连接程序实现,比如C都是前期绑定;动态绑定,即在程序执行前不知道对象的类型(所属的类到底是基类还是导出类),但是在运行时根据方法调用机制能找到方法调用的正确类型从而进行绑定。
故后面需要学习运行时类型信息。
2、初始化和类的加载当创建导出类对象时,该对象实际上包含了一个基类子对象,是隐式的,而不是直接显式地用基类创建对象。
从上述来看,调用导出类的构造器创建对象是需要调用基类构造器的,而导出类可能会依赖基类对象,导出类只能访问自己的成员,不能访问基类的成员(一般是private的),故创建导出类对象的第一步是调用基类的构造器,若是继承层次较多,则从根类开始调用。
如果导出类构造器没有显式地(通过super关键字)调用基类的构造器,则会自动地调用基类的默认构造器(无参的构造器),若基类构造器是有参数的,导出类构造器又没有显式的调用基类构造器,则Java编译器将报错。
java继承与多态继承继承:可以让⼦类继承⽗类,这样⼦类会继承⽗类所有的属性和⽅法。
然⽽在Java中是不允许有多继承的,即⼀个⼦类只能继承⼀个⽗类,不能同时继承多个⽗类。
如果⼀个类还需要另外⼀个类的⽅法,可以让⽗类去继承需要的类。
但Java中⽀持多重继承,即⼀个⼦类也可以做为其他类的⽗类。
Object类:是Java中的祖宗类,当⼀个类在代码层⾯没有去继承任何的⽗类,那这个类默认会继承object类。
继承的重写(覆盖):⼦类继承⽗类以后,可以获取到⽗类的所有⽅法(包含被private修饰的⽅法,只是访问不到),如果⽗类的⽅法功能不能满⾜⼦类的需求,那么⼦类可以根据需求对这个⽅法进⾏重写。
Super关键字:⼦类继承⽗类后,⼦类可以通过super关键字去指向⽗类的元素(属性,构造⽅法,普通⽅法)。
如果是指向⽗类的构造⽅法:super()如果是指向⼦类的构造⽅法:this()注:像super(),this()这样的表达式只能存在于构造⽅法中,且只能出现⼀次。
如果是指向⽗类的普通⽅法:super.⽅法名称()如果是指向⽗类的属性:super.属性名称()构造⽅法的继承:在继承时,当⼦类⽤到默认的⽆参构造⽅法时,⽗类必须要有⽆参构造⽅法,不然⼦类的构造⽅法就会报错。
因为⼦类继承⽗类之后,获取到了⽗类的内容(属性/字段),⽽这些内容在使⽤之前必须先初始化,⼦类如果在没有⾃定义构造⽅法的情况下默认会有⼀个⽆参构造⽅法,其中第⼀⾏默认会有⼀个super(),所以必须先调⽤⽗类的构造函数进⾏内容的初始化。
所以⽗类必须要有⼀个⽆参构造⽅法。
⼦类直接继承得到的属性⽆法直接获取,可以通过⽗类的get和set⽅法来获取和修改属性。
public class Animal {private String name;private int age;private String hobby;public Animal(){}public Animal(String name, int age, String hobby) { = name;this.age = age;this.hobby = hobby;}}public class Dog extends Animal {public Dog(String name, int age, String hobby) {super(name, age, hobby);}}⽅法重写与⽅法重载的区别:⽅法重写override:⽅法重写是指⼦类在继承了⽗类之后需要对⽗类的⼀些⽅法进⾏修改,以适应程序需求,因此在⼦类中重写⽗类中原有的⽅法。
《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继承与多态第⼀节、继承⼀、继承的概念、格式、特点(⼀)继承的概念:1、继承是多态的前提,如果没有继承,就没有多态。
2、继承解决的主要问题是:共性抽取。
3、⾯向对象的三⼤特征:封装性、继承性、多态性。
(⼆)继承的格式⽗类的格式:(即普通类)public class ⽗类名称 {// ...}⼦类的格式:public class ⼦类名称 extends ⽗类名称 {// ...}(三)继承的三个特点(单继承、多层继承、相对继承)1、Java只⽀持单继承,不⽀持多继承。
2、Java⽀持多层继承(继承体系)。
3、⼦类和⽗类是⼀种相对的概念。
⼆、继承中的变量(⼀)成员变量的访问(直接、间接)在⽗⼦类的继承关系当中,如果成员变量重名,则创建⼦类对象时,访问有两种⽅式:1、直接通过⼦类对象访问成员变量:等号【左边】是谁,就优先⽤谁,没有则向上找。
2、间接通过成员⽅法访问成员变量:该⽅法【属于】谁,就优先⽤谁,没有则向上找。
(⼆)⼦类⽅法中重名的三种变量区分(局部、本成、⽗成)1、局部变量:直接写局员变量名2、本类的成员变量: this.成员变量名3、⽗类的成员变量: super.成员变量名三、继承中的⽅法(⼀)成员⽅法-覆盖重写1、访问:在⽗⼦类的继承关系当中,创建⼦类对象,访问成员⽅法的规则:创建的对象是谁,就优先⽤谁,如果没有则向上找。
注意事项:⽆论是成员⽅法还是成员变量,如果没有都是向上找⽗类,绝对不会向下找⼦类的。
重写(Override):⽅法的名称⼀样,参数列表【也⼀样】。
覆盖、覆写。
重载(Overload):⽅法的名称⼀样,参数列表【不⼀样】。
2、重写(Override)概念:重写要求两同两⼩⼀⼤原则:⽅法名相同,参数类型相同,⼦类返回类型⼩于等于⽗类⽅法返回类型,⼦类抛出异常⼩于等于⽗类⽅法抛出异常,⼦类访问权限⼤于等于⽗类⽅法访问权限。
(1)必须保证⽗⼦类之间⽅法的名称相同,参数列表也相同。
第八章类的继承和多态教学目的:深刻理解类的继承教学内容:1、类的继承和实现2、构造器的调用3、防止类的继承一、类的继承和实现所谓继承就是在已经存在类的基础上再扩展新的类。
已经存在的类我们称父类、超类、基类。
新产生的类,我们称子类、派生类。
子类拥有父类的所有特性。
当然我们也可以在子类中添加新的方法和成员变量,这些新添加的方法和成员变量仅仅属于子类。
在Java中通过关键字“extends”来实现。
比如在学生类中,有一种特殊的学生就是学生干部,他们出来拥有和普通学生一样的方法和属性之外,有的有一个职务描述(Duty)。
我们定义学生管理类ClassManger,它拥有父类的所有的方法和属性。
一般来讲,应该把相对通用的方法都放在父类中,只有更具体和专门的方法放在子类中。
1、对于学生干部而言,我们要添加一个属性就可以了private String duty=””;2、但是student里的print()就不能满足我们的ClassMange的要求了。
而且student的构造方法也不能直接用来ClassMange上。
那么我们怎么定义ClassMange()和print()呢?如果重新写很麻烦,可不可以在父类方法的基础上修改呢?只要使用关键字super就可以了。
this:一个对象的引用。
super:是用来告诉编译器调用父类的方法的关键字。
代码如下:class school{public static void main(String[] args){student[] stu=new student[3];stu[0]=new ClassMange("章三","2009001","班长");stu[1]=new student("李四","2009002");stu[2]=new student("王五","2009003");/* for (int i=0;i<stu.length ;i++ ){ stu[i].print();} */stu[0].setSex("男");stu[0].setSpeci("软件技术");stu[0].print();}}class student{ private String name; //定义学生姓名private String ID; //定义学生学号private String sex=""; //定义学生性别private String speci=""; //定义学生专业//构造方法public student(String name,String ID){ =name;this.ID=ID;}public student(String name,String ID,String sex,String speic){ =name;this.ID=ID;this.sex=sex;this.speci=speic;}//访问器public String getName(){ return name;}public String getID(){ return ID;}public String getSex(){ return sex;}public String getSpeci(){ return speci;}//设置器public void setSex(String sex){ this.sex=sex;}public void setSpeci(String speci){ this.speci=speci;}//打印方法public void print(){ System.out.println("学生学号:"+ID+"\n学生姓名:"+name);if(!sex.equals(""))System.out.println("性别="+sex);if(!speci.equals(""))System.out.println("专业="+speci);}}class ClassMange extends student{ private String duty="";public ClassMange(String name,String ID,String duty){ super(name,ID); //调用父类的构造方法,初始化相关字段this.duty=duty;}public String getDuty(){ return duty;}public void print(){ super.print();if(!duty.equals(""))System.out.println("职务:"+duty);}}总结子类和父类的关系:1、子类完全继承父类的所有的属性和方法,子类的对象只可以调用父类里公共的属性和方法。