interface Move{
public abstract void move(); //接口的扩展的抽象方法必须有void,方法重写后无void
}
interface Stay{
public abstract void stay();//接口的抽象方法,无方法体,实现子类必须重写该方法。
}
abstract class Animal{
private String name;
public Animal(){};
public void animal(){
System.out.println("【Animal】animal:我是动物,有愿望。");
}
public void move(){//方法重写
System.out.println("我是Animal,我会动。");
}
}
abstract class Plant{
private String name;
public Plant(){};
public void plant(){
System.out.println("【Plant】plant:我是植物,可以种植。");
}
public void stay(){//方法重写
System.out.println("【Plant】stay:我是Plant,我不会动。");
}
}
class Cat extends Animal implements Move{
public void move(){//方法重写
System.out.println("【Cat】move:我是Cat,我跑得快,能抓老鼠。");
}
public void execute(){
System.out.println("【Cat】execute:我是具体实现类Cat");
}
//*******************************************
//动物系,测试参数类型
//*******************************************
public void exhibit (Rose r){//①形式参数是类Rose//需要的是该类的对象
r.execute();//打印:【Rose】execute:我是具体实现类Rose
}
public void display(Plant p){//②形式参数是抽象类Plant//需要的是子类的对象
p.plant(); //打印:【Plant】plant:我是植物,可以种植。
}
public void show(Stay s){//③形式参数是接口Stay//需要的是接口的实现类对象
s.stay();//打印:【Rose】stay:我是Rose,我很静,我很漂亮。
}
}
class Rose extends Plant implements Stay{
public void stay(){//方法重写
System.out.println("【Rose】stay:我是Rose,我很静,我很漂亮。");
}
public void execute(){
System.out.println("【Rose】execute:我是具体实现类Rose。");
}
public Cat exhibit(){ //④返回值类型是类Cat//返回的是Cat的一个对象。
return new Cat();//等价于 Cat cn = new Cat(); return cn;//这里是匿名返回
}
public Animal display(){//⑤返回值类型是抽象类Animal//返回的是Animal的子类对象。
return new Cat(); //等价于Animal an = new Cat();//return an;
}
public Move show(){//⑥返回值类型是接口Move//返回的是Move的子类对象。
return new Cat(); //等价于Move mn = new Move();//return mn;
}
}
class Test{
public static void main(String[]args){
//①形式参数是类//Cat的exhibit方法里,形式参数是类Rose//需要的是该类的对象
//需求:调用Cat的exhibit方法,通过exhibit方法调用Rose的execute方法
Cat c1 = new Cat();
Rose r1 = new Rose();
new Cat().exhibit(new Rose());
c1.exhibit(r1); //①形式参数是类Rose//打印:【Rose】execute:我是具体实现类Rose
//new Cat().exhibit(new Rose());
//回忆匿名对象
new Cat().exhibit(new Rose());//打印:【Rose】execute:我是具体实现类Rose
System.out.println("*---------------------------------*");
//②形式参数是抽象类Plant//Cat的method方法里,形式参数是抽象类Plant//需要的是子类的对象
//需求:调用Cat的display方法,通过display方法调用Plant的plant方法
Cat c2 = new Cat();
Plant p1 = new Rose(); //抽象类Plant作为引用类型的参数,不能实例化,只能通过子类间接实例化
c2.display(p1);//打印:【Plant】plant:我是植物,可以种植。
new Cat().display(new Rose());
System.out.println("*---------------------------------*");
//new Cat().display(new Rose());
//③形式参数是接口Stay//Cat的perform方法里,形式参数是接口Stay//需要的是接口的实现类对象
//需求:调用Cat的show方法,通过show方法调用Stay的stay方法,该方法被实现类Rose重写。
Cat c3 = new Cat();
Stay s1 = new Rose();//接口Stay是抽象类,作为引用类型的参数,不能实例化,只能通过子类间接实例化
c3.show(s1);
new Cat().show(new Rose());
System.out.println("*---------------------------------*");
//new Cat().show(new Rose());
//④返回值类型是类Cat//在Rose的exhibit方法里,返回值类型是Cat//返回的是Cat的一个对象。
//需求:通过调用Rose的exhibit方法创建对象,调用方法。
Rose r4 = new Rose();
Cat c4 = r4.exhibit(); //调用exhibit创建对象进行接收。
c4.execute();//打印:【Cat】execute:我是具体实现类Cat
new Rose().exhibit().execute();
System.out.println("*---------------------------------*");
//new Rose().exhibit().execute();
//⑤返回值类型是抽象类Animal//在Rose的method方法里,返回值类型是Animal//返回的是Animal的一个子类对象
//需求:通过调用Rose的display方法创建对象,调用方法。
Rose r5 = new Rose();
Animal a5 = r5.display();
a5.animal();
new Rose().display().animal();
System.out.println("*---------------------------------*");
//new Rose().display().animal();
//⑥返回值类型是接口Move//在Rose的perform方法里,返回值类型是Move//返回的是Move的一个子类对象
//需求:通过调用Rose的show方法创建对象,调用方法。
Rose r6 = new Rose();
Move m6 = r6.show();
m6.move();
new Rose().show().move();
System.out.println("*---------------------------------*");
//new Rose().show().move();
System.out.println("参数引用类型都是需要一个对象用 new Rose()");
System.out.println("*---------------------------------*");
new Cat().exhibit(new Rose());
new Cat().display(new Rose());
new Cat().show(new Rose());
System.out.println("*---------------------------------*");
System.out.println("*链式编程:每次调用方法完毕后,返回值类型是一个对象*");
System.out.println("*---------------------------------*");
new Rose().exhibit().execute();//【Cat】execute:我是具体实现类Cat"
new Rose().display().animal();//【Animal】animal:我是动物,有愿望。");
new Rose().show().move();//【Cat】move:我是Cat,我跑得快,能抓老鼠。");
}