2013年8月27日、多态|andUSB接口实现|多态时成员的特点



/*


对象的多态性。


class 动物
{}


class 猫 extends 动物
{}


class 狗 extends 动物
{}






猫 x = new 猫();


动物 x = new 猫();//一个对象,两种形态。






猫这类事物即具备者猫的形态,又具备着动物的形态。
这就是对象的多态性。 


简单说:就是一个对象对应着不同类型. 


多态在代码中的体现:
父类或者接口的引用指向其子类的对象。




多态的好处:
提高了代码的扩展性,前期定义的代码可以使用后期的内容。


多态的弊端:
前期定义的内容不能使用(调用)后期子类的特有内容。


多态的前提:
1,必须有关系,继承,实现。
2,要有覆盖。 






*/


abstract class Animal
{
abstract void eat();


}


class Dog extends Animal
{
void eat()
{
System.out.println("啃骨头");
}
void lookHome()
{
System.out.println("看家");
}
}


class Cat extends Animal
{
void eat()
{
System.out.println("吃鱼");
}
void catchMouse()
{
System.out.println("抓老鼠");
}
}


class Pig extends Animal
{
void eat()
{
System.out.println("饲料");
}
void gongDi()
{
System.out.println("拱地");
}
}






class DuoTaiDemo 
{
public static void main(String[] args) 
{

// Cat c = new Cat();
// c.eat();
// c.catchMouse();


Animal a = new Cat(); //自动类型提升,猫对象提升了动物类型。但是特有功能无法s访问。
//作用就是限制对特有功能的访问。
//专业讲:向上转型。将子类型隐藏。就不用使用子类的特有方法。




// a.eat();


//如果还想用具体动物猫的特有功能。 
//你可以将该对象进行向下转型。
// Cat c = (Cat)a;//向下转型的目的是为了使用子类中的特有方法。
// c.eat();
// c.catchMouse();


// 注意:对于转型,自始自终都是子类对象在做着类型的变化。
// Animal a1 = new Dog();
// Cat c1 = (Cat)a1;//ClassCastException




/*
Cat c = new Cat();


// Dog d = new Dog();


// c.eat();
method(c);
// method(d);
// method(new Pig());
*/


method(new  Dog());


}


public static void method(Animal a)//Animal a = new Dog();
{
a.eat();


if(a instanceof Cat)//instanceof:用于判断对象的具体类型。只能用于引用数据类型判断
// //通常在向下转型前用于健壮性的判断。


{
Cat c = (Cat)a;
c.catchMouse();
}
else if(a instanceof Dog)
{
Dog d = (Dog)a;
d.lookHome();
}
else
{

}

}
/*
public static void method(Cat c)
{
c.eat();
}
public static void method(Dog d)
{

}
*/

}

——————————————————————————



/*
笔记本电脑使用。
为了扩展笔记本的功能,但日后出现什么功能设备不知道。


定义一个规则,只要日后出现的设备都符合这个规则就可以了。
规则在java中就是接口。


*/
interface USB// 暴露的规则。
{
public void open();
public void close();
}




class BookPC
{
public static void main(String[] args)
{
useUSB(new UPan());//功能扩展了。
useUSB(new UsbMouse());
}


//使用规则。
public static void useUSB(USB u)//接口类型的引用,用于接收(指向)接口的子类对象。//USB u= new UPan();
{
if(u!=null)
{
u.open();
u.close();
}
}
}
//一年后。------------------------------
//实现规则。


//这些设备和电脑的耦合性降低了。


class UPan implements USB
{
public void open()
{
System.out.println("upan open");
}
public void close()
{
System.out.println("upan close");
}


}




class UsbMouse implements USB
{
public void open()
{
System.out.println("UsbMouse open");
}
public void close()
{
System.out.println("UsbMouse close");
}


}
















/*
class Mouse
{
}


class BookPC
{
public static void main(String[] args)
{
useMouse(new Mouse());
}
public static void useMOuse(Mouse m)
{
m.open();
}
public static void useMOuse(Mouse m)
{
m.open();
}
}
*/

/*
笔记本电脑使用。
为了扩展笔记本的功能,但日后出现什么功能设备不知道。


定义一个规则,只要日后出现的设备都符合这个规则就可以了。
规则在java中就是接口。


*/
interface USB// 暴露的规则。
{
public void open();
public void close();
}




class BookPC
{
public static void main(String[] args)
{
useUSB(new UPan());//功能扩展了。
useUSB(new UsbMouse());
}


//使用规则。
public static void useUSB(USB u)//接口类型的引用,用于接收(指向)接口的子类对象。//USB u= new UPan();
{
if(u!=null)
{
u.open();
u.close();
}
}
}
//一年后。------------------------------
//实现规则。


//这些设备和电脑的耦合性降低了。


class UPan implements USB
{
public void open()
{
System.out.println("upan open");
}
public void close()
{
System.out.println("upan close");
}


}




class UsbMouse implements USB
{
public void open()
{
System.out.println("UsbMouse open");
}
public void close()
{
System.out.println("UsbMouse close");
}


}
















/*
class Mouse
{
}


class BookPC
{
public static void main(String[] args)
{
useMouse(new Mouse());
}
public static void useMOuse(Mouse m)
{
m.open();
}
public static void useMOuse(Mouse m)
{
m.open();
}
}
*/

————————————————————————————-





/*
多态时,
成员的特点:
1,成员变量。
编译时:参考引用型变量所属的类中的是否有调用的成员变量,有,编译通过,没有,编译失败。
运行时:参考引用型变量所属的类中的是否有调用的成员变量,并运行该所属类中的成员变量。
简单说:编译和运行都参考等号的左边。哦了。
作为了解。






2,成员函数(非静态)。
编译时:参考引用型变量所属的类中的是否有调用的函数。有,编译通过,没有,编译失败。
运行时:参考的是对象所属的类中是否有调用的函数。
简单说:编译看左边,运行看右边。


因为成员函数存在覆盖特性。








3,静态函数。
编译时:参考引用型变量所属的类中的是否有调用的静态方法。
运行时:参考引用型变量所属的类中的是否有调用的静态方法。
简单说,编译和运行都看左边。


其实对于静态方法,是不需要对象的。直接用类名调用即可。







*/


class Fu
{
// int num = 3;
void show()
{
System.out.println("fu show");
}


static void method()
{
System.out.println("fu static method");
}
}


class Zi extends Fu
{
// int num = 4;
void show()
{
System.out.println("zi show");
}


static void method()
{
System.out.println("zi static method");
}
}






class  DuoTaiDemo3
{
public static void main(String[] args) 
{
Fu.method();
Zi.method();
Fu f = new Zi();//
// f.method();
// f.show();
// System.out.println(f.num);




// Zi z = new Zi();
// System.out.println(z.num);
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值