- 多态
- 向上转型和向下转型。
- 多态的优缺点。
- 必须通过向下转型,得到子类的特性。
- 抽象类
- 接口
多态的概述及其代码体现
- A:多态概述
- 事物存在的多种形态
- B:多态前提
- a:要有继承关系。
- b:要有方法重写。
- c:要有父类引用指向子类对象。
- C:案例演示
- 代码体现多态
|
|
多态中的成员访问特点
-
A:多态中的成员访问特点
-
a:成员变量
- 编译看左边,运行看左边。
当zi继承fu以后,开辟的对象空间里面存有从fu继承而来的区域,当使用
Fu f =new Zi()
f得到的句柄是指向zi里存储的F继承的区域,因此拿到的f.number的值是10,而不是20. -
b:成员方法
- 编译看左边,运行看右边。
在执行成员方法的时候,存在动态绑定,jvm在编译的时候,会先检查
Fu.class
里面有没有print()方法,如果有则去执行zi继承fu的print方法里面的内容,这就是多态的动态绑定,如果不存在fu的print方法,则输出就报错,这也是以后编程非常方便的一点,即是确定了父类的类型以后,可以不用考虑子类的类型的选择,灵活的进行调用。 -
c:静态方法
- 编译看左边,运行看左边。
- (静态和类相关,算不上重写,所以,访问还是左边的)
不存在动态绑定。
-
- B:案例演示
- 多态中的成员访问特点
|
|
超人的故事
- A:案例分析
- 通过该案例帮助学生理解多态的现象
|
|
多态中向上转型和向下转型
- A:案例演示
- 详细讲解多态中向上转型和向下转型
- 父类是Animal,子类是Cat
- Animal a = new Cat();向上转型
- Cat c = new Animal();错误的
- Cat c = (Cat)a;向下转型
|
|
|
|
多态的好处和弊端
- A:多态的好处
- a:提高了代码的维护性(继承保证)
- b:提高了代码的扩展性(由多态保证)
- B:案例演示
- 多态的好处
- C:多态的弊端
- 不能使用子类的特有功能。
-
D:案例演示
- 多态的弊端
1234567891011121314151617181920212223242526272829303132333435class Demo5DuoTai {public static void main(String[] args) {Animal a = new Cat();a.eat();//a.catchMouse(); //不能调用子类特有的方法Cat c = (Cat)a; //向下转型c.catchMouse();}}class Animal {public void eat() {System.out.println( "吃饭");}}class Cat extends Animal {public void eat() {System.out.println( "吃鱼");}public void catchMouse() {System.out.println( "抓老鼠");}}class Dog extends Animal {public void eat() {System.out.println( "吃肉");}public void lookHome() {System.out.println( "看家");}}
多态中的题目分析题
-
A:看下面程序是否有问题,如果没有,说出结果
-
1234567891011121314151617181920212223class 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 Test1Demo {public static void main(String[] args) {Fu f = new Zi();//f.method();不能访问子类的特性,必须先向下转型,才可以访问到子类的特性方法。f.show();}} -
B:看下面程序是否有问题,如果没有,说出结果
12345678910111213141516171819202122232425262728293031323334353637class A {public void show() {show2();}public void show2() {System.out.println( "我");}}class B extends A {public void show2() {System.out.println( "爱");}}class C extends B {public void show() {super.show();}public void show2() {System.out.println( "你");}}public class Test2DuoTai {public static void main(String[] args) {A a = new B();a.show();B b = new C();b.show();//out/*爱你*/}}
抽象类的概述及其特点
-
A:抽象类概述
-
B:抽象类特点
- a:抽象类和抽象方法必须用abstract关键字修饰
- abstract class 类名 {}
- public abstract void eat();
- b:抽象类不一定有抽象方法,有抽象方法的类一定是抽象类
- c:抽象类不能实例化那么,抽象类如何实例化呢?
- 按照多态的方式,由具体的子类实例化。其实这也是多态的一种,抽象类多态。
- d:抽象类的子类
- 要么是抽象类
- 要么重写抽象类中的所有抽象方法
- a:抽象类和抽象方法必须用abstract关键字修饰
-
C:案例演示
- 抽象类特点
抽象类的成员特点
- A:抽象类的成员特点
- a:成员变量:既可以是变量,也可以是常量。
- b:构造方法:有。
- 用于子类访问父类数据的初始化。
- c:成员方法:既可以是抽象的,也可以是非抽象的。
- B:案例演示
- 抽象类的成员特点
- C:抽象类的成员方法特性:
- a:抽象方法 强制要求子类做的事情。
- b:非抽象方法 子类继承的事情,提高代码复用性。
|
|
|
|
葵花宝典
- 案例演示
- 抽象类的作用
|
|
抽象类练习猫狗案例
- A:案例演示
- 具体事物:猫,狗
- 共性:姓名,年龄,吃饭
- 猫的特性:抓老鼠
- 狗的特性:看家
|
|
抽象类练习老师案例
-
A:案例演示
- 具体事物:基础班老师,就业班老师
- 共性:姓名,年龄,讲课。
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253class Demo5Abstract {public static void main(String[] args) {Teacher t = new BaseTeacher( "冯佳", 32);t.teach();}}/** A:案例演示* 具体事物:基础班老师,就业班老师* 共性:姓名,年龄,讲课。*/abstract class Teacher {private String name;private int age;public Teacher(){}public Teacher(String name,int age) {this.name = name;this.age = age;}public void setName(String name) {this.name = name;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public int getAge() {return age;}public abstract void teach();}class BaseTeacher extends Teacher {public BaseTeacher(){}public BaseTeacher(String name,int age) {super(name,age);}public void teach() {System.out.println( "我的名字是:" + this.getName() + ",我的年龄是:" + getAge() + ",我讲的javase");}}
抽象类练习员工案例
-
A:案例演示
- 假如我们在开发一个系统时需要对程序员类进行设计,程序员包含3个属性:姓名、工号以及工资。
- 经理,除了含有程序员的属性外,另为还有一个奖金属性。
- 请使用继承的思想设计出程序员类和经理类。要求类中提供必要的方法进行属性访问。
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586class Demo6Abstract {public static void main(String[] args) {Coder c = new Coder( "魏昊", "007", 7000.00);c.work();Manager m = new Manager( "周怀", "9527", 5000, 20000);m.work();}}/** A:案例演示* 假如我们在开发一个系统时需要对程序员类进行设计,程序员包含3个属性:姓名、工号以及工资。* 经理,除了含有程序员的属性外,另为还有一个奖金属性。* 请使用继承的思想设计出程序员类和经理类。要求类中提供必要的方法进行属性访问。分析:共性:属性: 姓名,工号,工资行为: 工作*/abstract class Employee {private String name;private String id;private double pay;public Employee(){}public Employee(String name,String id,double pay) {this.name = name;this.id = id;this.pay = pay;}public void setName(String name) {this.name = name;}public void setId(String id) {this.id = id;}public void setPay(double pay) {this.pay = pay;}public String getName() {return name;}public String getId() {return id;}public double getPay() {return pay;}public abstract void work();}class Coder extends Employee {public Coder(){}public Coder(String name,String id,double pay) {super(name,id,pay);}public void work() {System.out.println( "我的姓名是:" + getName() + ",我的工号是:" + getId() + ",我的薪资是:" + getPay() + ",我的工作内容是敲代码");}}class Manager extends Employee {private int bonus;public Manager(){}public Manager(String name,String id,double pay,int bonus) {super(name,id,pay);this.bonus = bonus;}public void work() {System.out.println( "我的姓名是:" + getName() + ",我的工号是:" +getId() + ",我的薪资是:" + getPay() + ",我的奖金是:" + bonus + ",我的工作内容是管理");}}
抽象类中的面试题
- A:面试题1
- 一个抽象类如果没有抽象方法,可不可以定义为抽象类?如果可以,有什么意义?
- 可以
- 这么做目的只有一个,就是不让其他类创建本类对象,交给子类完成
- B:面试题2
- abstract不能和哪些关键字共存
|
|
接口的概述及其特点
- A:接口概述
- 从狭义的角度讲就是指java中的interface
- 从广义的角度讲对外提供规则的都是接口
- B:接口特点
- a:接口用关键字interface表示
- interface 接口名 {}
- b:类实现接口用implements表示
- class 类名 implements 接口名 {}
- c:接口不能实例化
- 那么,接口如何实例化呢?
- 按照多态的方式来实例化。
- d:接口的子类
- a:可以是抽象类。但是意义不大。
- b:可以是具体类。要重写接口中的所有抽象方法。(推荐方案)
- a:接口用关键字interface表示
- C:案例演示
- 接口特点
|
|
接口的成员特点
- A:接口成员特点
- 成员变量;只能是常量,并且是静态的。
- 默认修饰符:public static final
- 建议:自己手动给出。
- 默认修饰符:public static final
- 构造方法:接口没有构造方法。
- 成员方法:只能是抽象方法。
- 默认修饰符:public abstract
- 建议:自己手动给出。
- 默认修饰符:public abstract
- 成员变量;只能是常量,并且是静态的。
- B:案例演示
- 接口成员特点
|
|
类与类,类与接口,接口与接口的关系
- A:类与类,类与接口,接口与接口的关系
- a:类与类:
- 继承关系,只能单继承,可以多层继承。
- b:类与接口:
- 实现关系,可以单实现,也可以多实现。
- 并且还可以在继承一个类的同时实现多个接口。
- c:接口与接口:
- 继承关系,可以单继承,也可以多继承。
- a:类与类:
- B:案例演示
- 类与类,类与接口,接口与接口的关系
|
|
抽象类和接口的区别(面试题)
- A:成员区别
- 抽象类:
- 成员变量:可以变量,也可以常量
- 构造方法:有
- 成员方法:可以抽象,也可以非抽象
- 接口:
- 成员变量:只可以常量
- 成员方法:只可以抽象
- 抽象类:
- B:关系区别
- 类与类
- 继承,单继承
- 类与接口
- 实现,单实现,多实现
- 接口与接口
- 继承,单继承,多继承
- 类与类
- C:设计理念区别
- 抽象类 被继承体现的是:”is a”的关系。抽象类中定义的是该继承体系的共性功能。
- 接口 被实现体现的是:”like a”的关系。接口中定义的是该继承体系的扩展功能。
猫狗案例加入跳高功能分析及其代码实现
- A:案例演示
- 动物类:姓名,年龄,吃饭,睡觉。
- 猫和狗
- 动物培训接口:跳高
|
|