多态性 : 一种事物的多种形态
多态性的体现:
1.广义上 : ①方法的重载和重写 ②子类对象的多态性
2.狭义上 :①子类对象的多态 性
子类对象的多态性 : 父类的引用指向子类的对象 (Person p = new Student())
多态使用的前提 : ①要有继承关系 ②要有方法的重写
一个对象的实例:Man m = new Man();
m就是这个对象的实例
public static void main(String[] args) {
//1.本态
Man man = new Man();
man.say();
man.smoking();
//2.子类对象的多态性
Person women = new Women(); //向上转型
//虚拟方法调用(动态绑定)
women.say();
//编译看左边,运行看右边
// p.shopping(); 不能调用
//3.使用多态的前提
System.out.println("-----------------------------");
//多态使用的前提 : ①要有继承关系 ②要有方法的重写
Person p2 = new Man();
p2.say();
//4.思考 ? 属性具有多态性吗? -- 属性不具备多态性
System.out.println(p2.name);
//5.如何调用子类对象特有的属性和方法
//向下转型 (为了调用子类对象中特有的属性和方法)
System.out.println("-----------------------------");
Man m = (Man)p2;
System.out.println(m.isPlay);
m.smoking();
//注意 : 类型转换异常 : women对象本身就是一个Women类的对象 强转成 Man肯定不行
// Man Man = (Man)women;
// man.smoking();
// Women w = (Women)p2;
// w.shopping();
/*
* 6. instanceof
* a instanceof A : a对象是否是类A的一个实例,如果是返回true反之返回false;
*
* a instanceof A 结果为true
* a instanceof B 结果为true
* 那么A和B存在继承关系
*/
System.out.println("--------------------------------------");
Person p3 = new Man();
if(p3 instanceof Women){
Women w2 = (Women) p3;
w2.shopping();
}else{
System.out.println("我不是一个女人");
}
Creature c = new Person();
if(c instanceof Man){
System.out.println("is a man");
}
if(c instanceof Person){
System.out.println("is a person");
}
if(c instanceof Creature){
System.out.println("is a creature");
}
System.out.println("------------------------------------------");
Creature c2 = new Man();
c2.say();
Person p = (Person)c2;
p.say();
System.out.println("-----------------------------------------");
//常见问题
/*
* 类型转换异常
Object obj = new String("aaaa");
Man m3 = (Man)obj;
*/
}
public class Man extends Person {
String name = "man";
boolean isPlay = true;
@Override
public void say() {
System.out.println("男人说话恶狠狠");
}
public void smoking(){
System.out.println("男人不抽烟,女人不喜欢");
}
}
public class Women extends Person {
@Override
public void say() {
System.out.println("女人说话娇滴滴");
}
public void shopping(){
System.out.println("女人没钱也要买买买");
}
}
public class Person extends Creature {
String name = "person";
public void say(){
System.out.println("人说话了");
}
}
public class Creature {
public void say(){
System.out.println("生物说话了");
}
}