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. 有一个女类: 这个喜欢养宠物

第一年: 女孩养个狗

第二年: 女孩养个猫

第三年: 女孩养个猴

第四年: 女孩养个蛇