您的位置:首页 > 编程语言 > Java开发

java中多态的体现思想

2016-07-21 00:45 190 查看
我们都知道,面向对象有三大特征:封装,继承,多态;

多态:就是指相同的事物的不同状态,比如:水。水可以有三种状态。那么在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();
*/


}`
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 面向对象