第五章 继承与多态
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• • • •
思考
• 如果现在将父类的一个方法定义成private 访问权限, 在子类中将此方法声明为default访问权限,那么这样还 叫覆写吗?
覆写
未覆写
属性的覆盖
重载与覆写的区别
This与super的区别
实例
• 要求: • 定义一个整型数组类,要求包括构造方法,增加数据及 输出数据成员方法,并利用数组实现动态内存分配。在 此基础上定义以下子类: • A.排序类---实现排序 • B.反转类----实现数据的反向存放
Person
Teacher
Student
Cloneable()接口
• • • • • • • • • • • • • class Circle { public Point point=new Point(1,2); public int[]arrayInt=new int[]{1,2,3,4,5,6}; public double radius=50; public Circle(Point p,int[] array,double radius){ public Circle clone(){}//需要实现 } public class CircleTest { public static void main(String[] args) { Circle c=new Circle(); Circle d=c.clone(); } }
interface Network{ public void browse() ; // 浏览 } class Real implements Network{ public void browse(){ System.out.println("上网浏览信息") ; } }; class Proxy implements Network{ private Network network ; // 代理对象 public Proxy(Network network){ this.network = network ; } public void check(){ System.out.println("检查用户是否合法。 ") ; } public void browse(){ this.check() ; this.network.browse() ; // 调用真实的主 题操作 } }; public class ProxyDemo{ public static void main(String args[]){ Network net = null ; net = new Proxy(new Real()) ;// 指定代 理操作 net.browse() ; // 客户只关心上 网浏览一个操作 } };
接口的实际应用-制定标准
• 接口的更多的作用是制定标准,比如:U盘和打印机 可以插在电脑上使用,这是因为它们都实现了USB的 即可,对于电脑来说,只要符合USB的接口标准的设 备都可以插进来。接口表示将方法的视图暴露给远 程的客户端。
例子
继承接口和抽象类
继承抽象类
多态性
• 多态性是面向对象中最重要的概念之一,在java中面向 对象主要体现: • 方法的重载与覆写; • 对象的多态性;
隐含的语句
方法的覆写
例子
子类想调用父类被覆写的方法
内部类
• 在类内部也可以定义另一个类。如果类Outer的内部再定 义一个类Inner,则Inner被称为内部类。 • 内部类可声明public和private,对它的访问的限制与 成员方法和变量相同。 • Public class Outer{ • //外部类的成员 • public class Inner{ • //内部类的成员 • } • }
习题
• 按要求编写程序: • 1)编写一个父类Test,其中有一个带参数构造方法 Test(int index)和一个方法fun()。 • 2)编写一个子类Test2继承Test类,其中有一个构造方 法要显式调用父类的构造方法,重写方法fun(),在该方 法中要求用super来调用父类的同名方法fun()。 • 3)编写一个测试类TestDemo,在main方法中分别用父 类和子类创建对象,并调用各自的方法fun()。
这样的代码使用如何?
主方法:应该表示客户端,主方法 的代码越少越好。其次,直接在主 方法中指定了要操作的子类,如果 要更换子类,则必须修改客户端。 表示跟特定的子类紧密耦合在一起 。 JVM: 程序->JVM->OS
• 过渡端就称为工厂类,进行解耦合。
工厂模式代码
•interface Fruit{ // 定义一个水果接口 • public void eat() ; // 吃水果 •} •class Apple implements Fruit{ • public void eat(){ • System.out.println("** 吃苹果。") ; • } •}; •class Orange implements Fruit{ • public void eat(){ • System.out.println("** 吃橘 子。") ; • } •} •class Factory{ • public static Fruit getInstance(String className){ • Fruit f=null; • if(className.equals("Apple")){ • f=new Apple(); • }if(className.equals("Orange")){ • f=new Orange(); • } • return f; • }
• 代理设计是指一个代理主题来操作真实主题,真实主题 执行具体的业务操作,而代理主题负责其他相关的业务 的处理,就好比经常使用到的代理上网,客户通过网络 代理连接网络,有代理服务器完成用户权限,访问与上 网操作相关的操作。
• • • • • • • • • • • • • • • • • • • • • • • • • • • •
第五章继承与多态
继承
两个类设计是否合理?
类的继承
• 在java中使用extends关键字完成类的继承关系。 • Class 父类{} • Class 子类 extends 父类{}
继承关系
继承关系图
继承的限制
• 在java中允许单继承,不能使用多重继承,即:一个子 类只能继承一个父类。但是允许进行多层继承。
分析
例题
例题
例题
例题
Final关键字
例题
抽象类的定义及使用规则
• • • • 包含一个抽象方法的类必须是抽象类。 抽象类和抽象方法都要使用abstract关键字声明; 抽象方法只需声明而不需要实现; 抽象类必须被子类继承,子类(如果不是抽象类)必须 覆写抽象类中的全部抽象方法。
抽象类比普通类多一个抽象方法
例子
• • • • • • • • • • • • • • • • • • package class02; class Outer{ private String name=“学习好!"; class Inner{ public void print(){ System.out.println(name); } } public void fun(){ new Inner().print(); } } public class NewClass01 { public static void main(String[] args){ new Outer().fun(); Outer.Inner s=new Outer().new Inner(); } }
对象的多态性
向上转型
பைடு நூலகம்
向下转型
下面的代码编译能通过吗?
对象多态性
• 如果上例中A有B,C两个子类,要调用覆写的方法fun1( ),则需要如下,如果A有1000个子类,如何办呢?
Instanceof关键字
习题
• 1、创建一个Animal(动物)类,让Horse(马)、Dog(狗)、 Cat(猫)等动物继承Animal类。在Animal类中定义sound ()方法,让其子类重写sound()方法,编写一个运行 时多态的程序。 • 2、创建一个Animal类型的数组,在其中填充不同子类, 然后调用自己的父类中的方法,看看会有什么情况发生。
• • 缺点:正常的一个类操作时,在类中最好只 定义属性和方法,如果定义一个类,则肯定 破坏了程序的一个结构。 优点:如果要想发现优点,则必须通过代码 的拆分来观察,将以上的内部类和外部类变 成两个类的形式。代码增加了,复杂度增加 了。 使用内部类的优点可以方便的访问外部类中 的私有属性。 注意: 使用static 可以声明一个内部类,声明的内 部类称为外部类,可以直接在类的外部调用 。new Outer.Inner().print(); 或者 new Outer().new Inner() .print();
• 利用多态编程创建一个图形(Shape)类,实现求正方形 (Square),三角形(Triangle),圆(Circle)的面积。
设计学校的人事管理系统
• 系统中包括对教师Teacher和学生 Student的基本信息 管理。其中有些信息是老师和学生共同拥有的。例如, 编号、姓名、性别、出生日期等。老师特有的所属部门 ,职称,工资等。学生包含分数,所学专业等。为此要 共同拥有一个抽象的人员类person。
public class InterfaceCaseDemo03{ public static void main(String args[]){ Fruit f = Factory.getInstance("Apple") ; // 实例化接口 f.eat() ; } }
工厂类的操作流程
代理设计
访问方式
• 注意: 子类是不能直接访问父类中的私有成员的,但是 子类可以调用父类中的非私有方法,但不能直接调用父 类中的私有成员。
用子类对象的实例化过程
• 在继承的操作中,对于子类对象的实例化也是有要求的 :子类对象在实例化之前必须首先调用父类中的构造方 法之后再调用子类自己的构造方法。
构造方法的调用过程
抽象类的实际应用-模板
• 假设人分为学生和工人,学生和工人都可以说话,但学 生和工人说话的内容是不一样的,说话的功能是一个具 体的功能,而说话的内容就要由学生和工人来决定。
继承关系
思考
• 问题1:一个抽象类可以使用final关键字声明吗? • 问题2:一个抽象类中可以定义构造方法吗?
接口
• 接口是java中最重要的概念,接口可以理解为一种特殊 的类,里面全部是由全局常量和公共的抽象方法所组成 。
工厂模式
•interface Fruit{ // 定义一个水果接口 • public void eat() ; // 吃水果 •} •class Apple implements Fruit{ • public void eat(){ • System.out.println("** 吃苹果。") ; • } •}; •class Orange implements Fruit{ •public void eat(){ •System.out.println("** 吃橘子。") ; • } •}; •public class InterfaceCaseDemo03{ • public static void main(String args[]){ •Fruit f = new Apple() ; // 实例化接口 • f.eat() ; • } •};
• • • • • • • • • • • • • • • • • • • • • •
interface Network{ public void browse() ; // 浏览 } class Real implements Network{ public void browse(){ System.out.println("上网浏览信息") ; } }; class Proxy implements Network{ private Network network ; // 代 理对象 public Proxy(Network network){ this.network = network ; } public void check(){ System.out.println("检查用户是否合法。 ") ; } public void browse(){ this.check() ; this.network.browse() ; // 调用真实的主题操作 } };