/**
*多态:可以理解为事物存在的多种体现形态。
*比如人:男人 女人
* 动物:猫 狗
* 猫 x = new 猫();
* 动物 x = new 猫();
*对象的多态性
*
*1,多态的基本体现
* 代码体现形式: 父类的引用指定自己的子类对象
* 父类的引用也可以引用自己的子类对象
*2,多态的前提
*必须是类与类之间有关系 要么继承 要么实现
* 通常还有一个前提:存在覆盖
*3,多态的好处
*多态的出现大大的提高了程序的扩展性
*
*4,多态的应用
*
*5,弊端:
* 提高了扩展性,但是只能使用父类的引用访问父类的功能中的成员
*6,多态的出现代码的特点(多态的使用的注意事项)
* */
/*
* 动物
* 猫,狗
* */
abstract class Animal{
abstract void eat();//都得吃饭
}
class Cat extends Animal{
public void eat(){
System.out.println("Eat Fish");
}
public void catchMouse(){
System.out.println("Catch Mouse");
}
}
class Dog extends Animal{
@Override
public void eat() {
// TODO Auto-generated method stub
System.out.println("Eat 骨头");
}
public void kanJia(){
System.out.println("kan 家");
}
}
class Pig extends Animal{
@Override
public void eat() {
// TODO Auto-generated method stub
System.out.println("Eat 饲料");
}
public void gongDi(){
System.out.println("拱地");
}
}
//————————————————-
public class DuoTaiDemo {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Cat c = new Cat();
c.eat();
Animal e = new Cat();//一个对象具备了多种形态造成的 猫类型也是动物类型 多态在程序中的表现
e.eat();
Animal a = new Cat();
a.eat();//类型提升 从Cat到Animal型 也称为向上转型
//如果想要调用猫的特有方法时 如何操作?
///Cat c1 = new Cat();
//强制将父类的引用转成子类类型
Cat f = (Cat)a;//强转 向下转型 可强制转换
f.catchMouse();
//function(c);
//Dog d = new Dog();
/*千万不要出现以下操作:就是父类对象转化成子类类型
* 我们能转换的是父类应用指向了自己的子类对象时,该应用可以被提升,也可以被强制转换
* Animal a = new animal();
* Cat c = (Cat)a;
* 多态自始至终都是子类对象在做变化
* */
function(new Cat());//Animal a = new Cat();
function(new Dog());//Animal a = new Dog();
function(new Pig());//Animal a = new Pig();
/*毕姥爷 x = new 毕老师();
* x.讲课();讲的是子类 java
* 毕老师 y = (毕老师)x;
* y.看电影(); 毕老师自始至终在变在变
* */
function(new Dog());// java.lang.ClassCastException 类型转换异常
}
public static void function(Animal a){//函数封装 提高函数的扩展性
a.eat();
if(a instanceof Animal){
System.out.println("ahhhhh");
}
else if(a instanceof Cat){//instanceof是关键字 判断他是否所属类型
Cat c = (Cat)a;
c.catchMouse();
}else if(a instanceof Dog){
Dog c = (Dog)a;
c.kanJia();
}
}
/*public static void function(Cat c){//cat类
c.eat();
}
public static void function(Dog d){//dog类
d.eat();
}
public static void function(Pig p){//pig类
p.eat();
} */
}
/*基础班的学生:
* 学习 睡觉
*高级班的同学:
* 学习 睡觉
*
*可以将这两类的事物进行抽取
*将对象调用简单化 找共同点在封装类
* */
abstract class Student1{
public abstract void study();
public void sleep(){
System.out.println(“躺着睡”);
}
}
class BaseStudent extends Student1{
public void study(){
System.out.println("基础课程学习");
}
public void sleep(){
System.out.println("坐着睡");
}
}
class AdvStudent extends Student1{
@Override
public void study() {
// TODO Auto-generated method stub
System.out.println("高级课程学习");
}
}
class DoStudent{
public void doSome(Student1 stu){
stu.study();
stu.sleep();
}
}
public class DuoTaiDemo1 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
BaseStudent bs = new BaseStudent();
//bs.study();
//bs.sleep();
//AdvStudent as = new AdvStudent();
//as.study();
//as.sleep();
DoStudent ds = new DoStudent();
ds.doSome(new BaseStudent());
ds.doSome(new AdvStudent());
}
}