一 多态
多态:一种事物的多种形态
举例:人 里面分 黄种人 黑种人 白种人
这就叫多态 由此我们能看出多态的一个规则
1 多态是建立在类与类之间要建立关系—–即继承的关系
2 必须要有重写
3 父类的指针(引用)指向 子类的对象(空间)
如我们 举一个 例子
人 跳舞
黄种人 民舞
黑种人 拉丁舞
public class Dance {
public static void main(String[] args) {
// TODO Auto-generated method stub
Peo p1 = new yellow();
p1.dance();
Peo p2 = new black();
p2.dance();
}
}
class Peo{
public void dance() {
System.out.println("我会跳舞");
}
}
class yellow extends Peo{
public void dance() {
System.out.println("我会跳民舞");
}
}
class black extends Peo{
public void dance() {
System.out.println("我会跳拉丁舞");
}
}
二 多态调用成员变量 和 成员 方法是怎么调用的呢
记住两句话即可
多态调用成员变量:
编译看父类;
运行也看父类;
多态调用成员方法:
编译看父类;
运行看子类;
public class Demo02 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Father f = new Son();
f.speek();
System.out.println(f.num);
Son son = new Son();
System.out.println(son.num);
}
}
class Father{
int num = 10;
public void speek() {
System.out.println("Father 说");
}
}
class Son extends Father{
int num = 20;
public void speek() {
super.speek();
System.out.println("Son 说");
}
}
这是为什么呢 请看图
(有同学会问 多态调用成员方法时,既然运行看子类的话 能不能将父类的重写方法删掉可以么
其实 这是不可以的 为什么呢 其实很简单 多态的规则 多态就是就是建立在重写的基础上的。)
三 多态的好处与弊端
任何事物都有双面性 多态也不例外
我们先来讲讲多态的好处
好处1 : 增强了代码的可维护性
好处2: 增强了方法的可扩展性
弊端 呢
不能调用父类的特殊方法(不是重写父类的)
public class Demo3 {
public static void main(String[] args) {
// TODO Auto-generated method stub
//父类指针指向子类对象
//骗子进行伪装 向上转型
People p = new fround();
//骗子调用自己的方法
p.speak();
//p能不能调用大
//向下转型
//注意:向下转型 之前必须要有向上转型
fround pZi = (fround)p;
pZi.gan();
}
}
class People{
public void speak() {
System.out.println("我能聊天");
}
}
class fround extends People{
public void speak() {
System.out.println("我能洗脑");
}
public void gan() {
System.out.println("我能打");
}
}
四 instanceof
instanceof 运算符是用来运行时指出对象是特定的一个类的实例
package con.lanou3g;
public class Demo4 {
public static void main(String[] args) {
//匿名
//Wuqi w = new Dao();
fun(new Dao());
//Wuqi w = new Jian();
fun(new Jian());
}
public static void fun(Wuqi w) {
//instanceof 关键词
//可以判断w属于哪个类
//Wuqi w = new Dao;
//Dao dao = (Dow)w;
//w.paik();
if(w instanceof Dao) {
Dao dao = (Dao)w;
((Dao) w).pak();
//Wuqi w = new Jian
//Jian jian = (Jian)w;
//w.paik();
}else if(w instanceof Jian) {
Jian jian = (Jian)w;
}
w.paik();
}
}
class Wuqi{
//方法的重写
public void paik() {
System.out.println("挥舞武器");
}
}
//extends 继承
class Dao extends Wuqi{
//方法的重写
public void paik() {
System.out.println("挥舞刀");
}
//特有行为
public void pak() {
System.out.println("挥舞刀123");
}
}
class Jian extends Wuqi{
//方法的重写
public void paik() {
System.out.println("挥舞剑");
}
}
instanceof 我们在这里用 instanceof 来判断 对象是属于刀类还是剑类 ,然后再用匿名对象 ,如果这时用来打许多刀和许多剑 这时用 instanceof 判断打印 就方便了许多