我们都知道,面向对象有三大特征:封装,继承,多态;
多态:就是指相同的事物的不同状态,比如:水。水可以有三种状态。那么在JAVA中的多态也可以理解成这个意思,就是:
将父对象设置成为和一个或多个它的子对象相等的技术,
比如Animal = Dog;
当满足这三个条件 1.有继承 2. 有重写 3. 要有父类引用指向子类对象,就有多态的影子;
多态性使得能够利用同一类(父类)引用不同类的对象,
以及根据所引用对象的不同,以不同的方式执行相同的操作。
多态实现包括两种方式:重载和重写
例如:Animal a = new Dog();
父类引用指向子类对象,Animal类中包含一个eat()方法,而 Dog类继承自
Animal类,如果子类重写了父类的eat()方法,则调用的时候,就可以按照子类
的形式调用,本质上是父类的方法,但是子类重写之后,就成了另一种方式,
这就是多态。
转型:
* 向上转型,父类的引用指向子类的对象
通俗的说就是将子类对象转换为父类对象,此处的父类对象可以是接口
* 向下转型,把指向子类对象的父类引用赋值给子类的引用(要强制转换)
*
举个例子:
`package com.tr;
class Animal{
//描述动物,动物有吃饭,跑的行为
public void eat(){
System.out.println(“父类吃的方法!!”);
}
public void run(){
System.out.println(“父类跑的方法!!”);
}}
class Dog extends Animal{
//描述狗,同样的有吃饭,看家,睡觉的属性
public void eat(){
System.out.println(“子类dog吃的方法!!!”);
}
public void housekeeping(){
System.out.println(“子类dog看家的方法”);
}
public void sleep(){
System.out.println(“子类dog睡觉的方法”);
}}
class Ma extends Animal{
//描述狗,有吃饭喝水的行为
public void chi(){
System.out.println(“Ma吃的方法”);
}
public void he(){
System.out.println(“Ma喝的方法”);
}
}
public class DuotaiDemo {
public static void main(String[] args) {
//父类的引用指向子类的对象,而不能是子类的而子类的引用不能指向父类的对象
//能说dog是动物,而不能说动物就是dog
/**
* 向上转型,父类的引用指向子类的对象
* 通俗的说就是将子类对象转换为父类对象,此处的父类对象可以是接口
*/
Animal a = new Dog();
//a.eat();; //注意,向上转型之后子类a会遗失除与父类共有的其他方法,比如在这 a调不到housekeeping方法和sleep方法
/**
* 向下转型,把指向子类对象的父类引用赋值给子类的引用(要强制转换)
* 首先要向上转型,然后在向下转型,两个步骤
* 向下转型之后d能调到父类和子类的所有公有方法
* Girl g2=new Girl();
* MMGirl mmg1=(MMGirl)g2; //不安全的向下转型,编译无错但会运行会出错
* 运行出错:
* Exception in thread "main" java.lang.ClassCastException: com.wensefu.other1.Girl
* at com.wensefu.other1.Main.main(Girl.java:36)
* 如代码所示,可以通过instanceof来防止出现异常
*/
Dog d =(Dog)a;
d.run();
d.eat();
d.housekeeping();
d.sleep();
}
/**
* 有多个狗和马对象都要调用吃饭这个方法,这样会使
* d.eat()代码重复性非常严重
* Dog d = new Dog()
* d.eat()
* d.housekeeping();
d.sleep();
* 为了提高代码的复用性,可以将d.eat()封装起来
}
然后创建对象,直接调用fun()方法即可
public static void fun2(Dog d){
d.eat();
d.housekeeping();
d.sleep();
}
fun2(new Dog()); //static方法在同一个类中可以直接方法名调,不同类中要 类名.方法名 调用,要 public 修饰的
public static void fun3(Ma m){
m.eat();
m.chi();
m.he();
}
* public static void fun1(Animal h){
h.eat();
*/
}`