所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定
- 对象的多态性:父类的引用指向子类的对象(子类的对象赋给父类的引用)
- 有了对象的多态性之后,我们在编译期,只能调用父类中声明的方法,但在运行期,我们实际执行的是子类重写父类的方法。
- 多态性不适用于属性
- 多态性的前提:1.类的继承关系 2.方法重写
class person{
String name;
int age;
public void eat(){
System.out.println("人要吃饭");
}
public void walk(){
System.out.println("人要运动");
}
public void test(){
System.out.println("测试方法");
}
}
class man extends person{
boolean isSmoking;
public void earnMoney(){
System.out.println("男人挣钱养家");
}
public void eat(){
System.out.println("男生吃多,不会胖");
}
public void walk(){
System.out.println("男生打篮球");
}
}
class woman extends person{
boolean isBeauty;
public void goShopping(){
System.out.println("女生逛街");
}
public void eat(){
System.out.println("女生少吃,减肥");
}
public void walk(){
System.out.println("女生做瑜伽");
}
}
public class Test {
public static void main(String[] args) {
person p1 = new person();
p1.eat();
man m = new man();
m.eat();//男生吃多,不会胖
m.age = 25;
m.earnMoney();//男人挣钱养家
System.out.println("************************");
//对象的多态性:父类的引用指向子类的对象
person p2 = new man();
// person p3 = new woman();
//多态的使用:当调用父类同名同参数的方法时,实际上执行的是子类重写父类的方法---虚拟方法调用
p2.eat();//男生吃多,不会胖
p2.walk();//男生打篮球
p2.test();//测试方法
// p2.earnMoney();//报错,不能调用子类特有的方法,因为编译时,p2是person类型
System.out.println("*******************");
//有了对象的多态以后,内存中实际上是加载了子类特有的属性和方法,但是由于变量声明为父类类型,
//导致编译时,只能调用父类中声明的属性和方法,子类特有的属性和方法不能调用。
//如何才能够调用子类特有的属性和方法呢? 向下转型:使用强制类型转换符
man m1 = (man)p2;
m1.earnMoney();//由此就可以使用子类特有的方法了
m1.isSmoking = true;
//使用强转时,可能出现ClassCastException的异常。
// woman w1 = (woman) p2;
// w1.goShopping();
/*
* instanceof关键字的使用
*
* instanceof是Java的一个保留关键字,左边是对象,右边是类,返回类型是Boolean类型。
* 它的具体作用是测试左边的对象是否是右边类或者该类的子类创建的实例对象,
* 是,则返回true,否则返回false。
* a instanceof A:判断对象a是否是类A的实例。如果是,返回true,如果不是,返回false
* 先有继承关系,再有instanceof的使用。
*
* 当该测试对象创建时右边的声明类型和左边的类其中的任意一个跟测试类必须得是继承树的同一分支或存在继承关系
* 否则编译器会报错。
* */
if(p2 instanceof woman){
woman w1 = (woman) p2;
w1.goShopping();
}
if(p2 instanceof man){
man m2 = (man)p2;
m2.earnMoney();
m2.isSmoking = true;
}
if(p2 instanceof person){
System.out.println("******person********");
}
if(p2 instanceof Object){
System.out.println("********Object********");
}
//常见问题
/*
* 一:编译通过,运行错误
* 1.
* person p3 = new woman();
* man m3 = (man)p3;
* 2.
* person p4 = new person();
* man m4 = (man)p4;
*
* 二:编译通过,运行也通过
* Object obj = new woman();//多态
* person p = (person)obj;//向下转型
* */
}
}