首先:多态是基于继承的,有继承才有多态。
为何使用多态:减少代码重复;
多态的基本语句:父类名 引用类型 = new 子类名();
多态的规则:只能访问父类的属性以及方法,但会优先访问子类的重写方法。放一段代码:
class a {
public String zhujing(int day) {//编写父类方法
return "0";
}
}
class b extends a{//子类b继承了父类a
public String zhujing(int day) {//重写父类方法
return "100";
}
}
class c extends a{//子类c继承父类a
public String zhujing(int day) {//重写父类方法
return "200";
}
}
class text{//测试类
public static void main(String[] args) {
a d;
//将a的地址给到引用类型d
d=new b();
//相等于 a d = new b(); 是一个标准的多态语句
System.out.println("结果为:"+d.zhujing(1));
//输出父类方法,但会优先调用子类的重写方法
d=new c();
//相等于 a d = new c(); 是一个标准的多态语句
System.out.println("结果为:"+d.zhujing(1));
//输出父类方法,但会优先调用子类的重写方法
}
}
短短几行代码 包含了多态的大致知识,上面测试类使用的是向上转型方法(自动转型方法),如果我们要使用父类调用子类中的独有方法时我们就要使用向下转型(强制转型方法),代码如下:
class ddd {
public void eat() {
System.out.println("宠物正在吃东西........");
}
}
class dog extends ddd{
public void eat() {
System.out.println("狗在吃骨头");
}
public void play() { //狗类的独有方法
System.out.println("狗玩飞盘......");
}
}
class cat extends ddd{
public void eat() {
System.out.println("猫在吃鱼");
}
public void cath() { //猫类的独有方法
System.out.println("猫抓老鼠......");
}
}
class master{
public void feed(ddd d) {
d.eat();
}
}
class test{
public static void main(String[] args) {
ddd d=new dog();
d=new cat();
if(d instanceof dog) {
dog dog=(dog)d;
dog.play();
}else if(d instanceof cat) {
cat cat=(cat)d;
cat.cath();
}
}
}
//测试类中使用的就是向下转型方法
如果使用向下转型方法的话,可以使用判断语句来判断是否有效,判断则使用关键词 instanceof 来判断。