多态
什么是多态:事物存在的多种形态
-
多态的前提:
- 要有继承关系
- 要有方法重写
- 要有父类引用指向子类对象
-
多态的几种方式
-
成员变量
-
访问成员变量时遵循的原则:编译看左边(父类),运行看左边(父类)
package asdf.com.cn; public class Main { public static void main(String[] args) { Father f = new Son(); System.out.println(f.num);// 10 Son s = new Son(); System.out.println(s.num); // 20 } } /* * 多态的三个条件:缺一不可 * 1.继承 * 2.重写 * 3.父类指引用向子类 4.一般不直接使用父类指引用向子类,而是当做参数,扩展性强 * */ class Father { public Father () {} int num = 10; } class Son extends Father{ public Son () {} int num = 20; }
-
-
-
成员方法
- 访问成员方法的特点:编译看左边(父类),运行看右边(子类)
- 访问成员方法的特点:编译看左边(父类),运行看右边(子类)
-
静态变量
-
访问成员方法的特点
-
静态方法
-
编译看左边(父类),运行看左边(父类)- 静态的叫做静态绑定,动静本身就是相对的,非静态的就叫做
动态绑定
(静态和类相关,算不上重写,所以,访问的还是左边)
只有非静态的成员方法,编译看左边,运行看右边,其他的都是编译看左边,运行看左边
-
class Person{ public static void prient() { System.out.println("Person里面的静态"); } } class Son extends Person { public static void prient() { System.out.println("Son里面的静态"); } } // 调用的时候 class Main { public static void main(String[] args) { Person p = new Son(); p.prient(); //这里相当于是类名.方法---》Person.prient(),很显然调用的是父类的方法。所以编译看左边,运行看左边。 }
-
案例
向上转型
-
Person p = new SuperMan(); // 父类引用指向子类对象,超人被提升成了人
向下转型
package asdf.com.cn;
public class Main {
public static void main(String[] args) {
Person p = new SuperMan(); // 父类引用指向子类对象,超人被提升成了人,这本身就是向上转型
System.out.println(p.name);
SuperMan sm = (SuperMan)p; // 向下转型,前提是被向上转型过
sm.fly(); // 如果上面没有进行转型,这里编译时会报错
//基本数据类型自动类型提升和强制类型转换
int i = 10;
byte b = 20;
i = b; // 这种为自动类型提升
// 如果这里使用 b = i 会报错,只能由低的向高的提升,反过来不行,没办法,只能强了
b = (byte)i; // 这种为强制类型转换
}
}
/*
* 多态的三个条件:缺一不可
* 1.继承
* 2.重写
* 3.父类指向子类引用
* */
class Person {
String name = "john";
public void talkMoney () {
System.out.println("谈生意");
}
}
class SuperMan extends Person{
String name = "Superman";
public void talkMoney () {
System.out.println("谈一个亿的生意");
}
public void fly () {
System.out.println("飞出去救人");
}
}