9多态抽象类、接口
- 格式:doc
- 大小:274.44 KB
- 文档页数:22
` 1
多态
多态的概述
1. 多态: 事物的多种形态 polymorphic
对象的多态性: 同一个对象,可能在不同环境下有不同名称
例如:黎国祥: 在咱们班: 讲师
回到北京出租房里: 老公
回到河南老家: 对于父母:
儿子 对于我的外甥们: 舅舅 对于姐姐: 弟弟
在java中,同一对象,指的是有不同类型的引用指向它, 本质: 同一个事物有不同的名称和描述
MiddleStudent 继承自 Student 继承自 Person
MiddleStudent ms = new MiddleStudent(); 初中生对象
MiddleStudent ms2 = ms;
Student s = ms; 学生
java中多态指的是,父类类型的引用可以指向子类对象;
2. 多态实现的前提
1. 要有父子类关系, 没有继承就没有多态
2. 方法的重写
3. 父类类型引用指向子类对象
实例代码
class 多态的概述_01 {
public static void main(String[] args) {
/*
MiddleStudent ms = new MiddleStudent();
Student s = ms;
*/
// Student <--- MiddleStudent 初中生是学生
Student s = new MiddleStudent();
s.study();
}
}
// 学生
class Student {
public void study(){
System.out.println("学习");
}
` 2
}
// 初中生
class MiddleStudent extends Student{
@Override
public void study(){
System.out.println("好好学习, 天天向上");
}
}
在多态中成员变量的访问特点
1. 编译的时候看左边, 运行的时候也看左边;
2. 编译的时候,要看[=]左边的引用类型中,是否定义了该变量名,如果没有,编译就报错;如果有,编译就成功;
3. 运行的时候,要看[=]左边的引用类型,左边引用类型中如何的赋值的,取出的就是左边引用类中的值;
实例代码
class 在多态中成员变量的访问特点_02 {
public static void main(String[] args) {
// 什么是引用: 指的就是使用了一块空间的地址
// 什么是引用类型变量: 存储着地址的变量就是引用类型变量
// 创建多态关系
Fu f = new Zi();
System.out.println(f.i);
// System.out.println(f.j);
}
}
class Fu {
int i = 10;
}
class Zi extends Fu {
int i = 20;
int j = 30;
}
` 3
多态访问成员方法的特点
1. 编译看左边,运行看右边
2. 编译的时候, 要看[=]左边的引用类型中,是否定义了该方法,如果有,就编译通过;如果没有,就编译失败;
3. 运行的时候,要看[=]右边,对象所属的类中,如果对这个方法进行实现,最终运行的就是子类对这个方法的实现;
实例代码
class 多态访问成员方法的特点_04 {
public static void main(String[] args) {
Fu f = new Zi();
f.test();
// f.test2();
}
}
class Fu {
public void test(){
System.out.println("父类test方法被调用了");
}
}
class Zi extends Fu {
@Override
public void test(){
System.out.println("子类test方法被调用了");
}
public void test2(){
System.out.println("子类test2方法被调用了");
}
}
多态访问静态方法的特点
1. 编译时看左,运行时看左
2. 编译的时候,要看[=]左边的引用类型中,是否有该静态方法名,如果有就编译通过,没有编译报错;
` 4
3. 运行的时候,要看[=]左边的引用类型中,如果对该静态方法进行的实现,调用父类中对该方法的实现;
实例代码
class 多态访问静态方法的特点_04 {
public static void main(String[] args) {
Fu f = new Zi();
f.test();
// f.test2();
}
}
class Fu{
public static void test(){
System.out.println("父类静态test方法被调用了");
}
}
class Zi extends Fu {
// @Override
public static void test(){
System.out.println("子类静态test方法被调用了");
}
public static void test2(){
System.out.println("子类静态test2方法被调用了");
}
}
向上向下转型
1. 向上转型
使用子类的引用指向指向的子类的对象(正常情况)
多态中,使用的是父类的引用指向子类的对象(向上转型)
本质:缩小了对象本身的访问范围, 减少了它的访问权限,只能访问父类中的内容
2. 向下转型:
概念: 让一个指向子类对象的父类引用,恢复成子类的引用
格式: 子类类型 引用名称 = (子类类型)父类类型引用;
` 5
例如: Zi z = (Zi)f;
本质:恢复子类对象的访问权限,访问范围;
3. 注意: 不可以把指向父类对象的父类引用做向下转型,否则就会抛出异常
cast: 转换 Fu cannot be cast to Zi Fu类型不能转为Zi类型
多态的内存理解
图示
实例代码
class 向上向下转型_05 {
public static void main(String[] args) {
// 向上转型
Fu f = new Zi();
System.out.println();
//System.out.println(f.age);
f.eat();
//f.drink();
// 向下转型
Zi z = (Zi)f;
System.out.println();
System.out.println(z.age);
z.eat();
z.drink();
Fu f2 = new Fu();
// 不能对f2向下转型
Zi z2 = (Zi)f2;
` 6
}
}
class Fu {
String name = "豆豆";
public void eat(){
System.out.println("吃");
}
}
class Zi extends Fu{
String name = "花花";
int age = 18;
@Override
public void eat(){
System.out.println("吃鸡腿...");
}
public void drink(){
System.out.println("喝啤酒...");
}
}
多态的好处
1. 可以提高代码的扩展性
2. 在方法中,如果形式参数类型是父类类型,将来在调用这个方法的时候,就可以把这个父类类型子类创建出来对象当做实参传递过去;
3. 如果一个方法的返回值是父类类型,那么可以在方法内将父类的子类对象当做方法的返回值使用; 调用者接受结果时,可以直接使用父类类型变量接受,也可以做向下转型(前提必须是知道返回的是什么类型的子类);
饲养宠物案例
1. 有一个女类: 这个喜欢养宠物
第一年: 女孩养个狗
第二年: 女孩养个猫
第三年: 女孩养个猴
第四年: 女孩养个蛇