多态–01
/*多态*/
public class TestPolymorphism{
public static void main(String[] args){
TestPolymorphism p=new TestPolymorphism();
Animal a=new Dog();//多态的体现:父类的引用或者接口指向了自己的子类
Animal b=new Cat();//向上转型
p.method(a);
p.method(b);
}
public static void method(Animal a){
/*优点:提高了程序的扩展性
缺点:但是父类引用操作子类对象时,只能引用父类已有的方法,而不能引用子类特有的方法*/
a.eat();
if(a instanceof Dog) {
Dog x=(Dog)a;//向下转型
x.lookhome();//调用子类特有的方法
}
else if(a instanceof Cat){
Cat y=(Cat)a;
y.catchMouse();
}
}
/*多态前提:必须具有关系,如继承或实现
一般有重写操作
*/
}
abstract class Animal{
public abstract void eat();
}
class Dog extends Animal{
public void eat(){
System.out.println("骨头");
}
public void lookhome(){
System.out.println("看家");
}
}
class Cat extends Animal{
public void eat(){
System.out.println("fish");
}
public void catchMouse(){
System.out.println("抓老鼠");
}
}
/*
使用向上转型:不关系子类型,子类型被隐藏,不需要调用子类的特有方法
需要使用instanceof判断,避免发生ClassCastException
*/
多态–02
/*练习多态并使用之前学习的内容
需求1:笔记本电脑运行
按照面向对象的方法,用代码体现
需求2:在笔记本电脑上加一个手握式鼠标,鼠标可开启和关闭
*/
public class DemoPolymorphism{
public static void main(String[] args){
Notebook n=new Notebook();
n.run();
n.useUsb(new Mouse());
n.useUsb(new Keyboard());
}
}
interface Usb{//接口的出现,增强了扩展性,定义了规则
void open();
void close();
}
class Notebook{
public void run(){ //运行功能
System.out.println("notebook run");
}
public void useUsb(Usb usb){//使用接口
if(usb!=null){
usb.open();
usb.close();
}
}
}
class Mouse implements Usb {
public void open(){ //鼠标的开启功能
System.out.println("mouse open");
}
public void close(){ //鼠标的关闭功能
System.out.println("mouse close");
}
}
class Keyboard implements Usb{
public void open(){
System.out.println("keyboard open");
}
public void close(){
System.out.println("keyboard close");
}
}
多态–03
/* 多态
1.成员变量:当子父类出现同名变量时,多态调用该变量时,编译时期,
参考的是引用型变量所属的类中是否有被调用的成员函数,若没有 编译失败
运行时期也是调用引用型变量所属的类中的成员函数(编译运行都看左边)
2.成员函数:
编译看左边,如果没有编译失败
运行参考右边对象所属的类(编译看左,运行看右)
成员函数动态地绑定到对象
3.静态函数的特点:
编译和运行都看左边
静态函数静态地绑定到类
总结:成员变量和静态函数编译和运行都看左边
静态函数编译看左边运行看右边
*/
public class FeaturePolymorphism{
public static void main(String[] args){
Fu f=new Zi();
Zi z=new Zi();
/*测试成员变量的调用
System.out.println(f.num);//3
System.out.println(z.num);//5*/
/*测试成员函数的调用
f.show();//Zi show run
z.show();//Zi show run */
//测试静态函数的调用
f.run();//Fu static run
z.run();//Zi static run
}
}
class Fu{
int num=3;
void show(){
System.out.println("Fu show run");
}
static void run(){
System.out.println("Fu static run");
}
}
class Zi extends Fu{
int num=5;
void show(){
System.out.println("Zi show run");
}
static void run(){
System.out.println("Zi static run");
}
}