將類當成參數傳入方法,其實就是將類的對象傳入方法,如果是抽象類,其實就是將抽象類的子類的對象傳入方法,如果是接口,其實就是將接口實現類的對象傳入方法。
因為抽象類和接口是不能實例化成對象的,所以必須找它們的子類或實現類
1. 普通類對象當成方法參數傳入
public class Person{
public void eat(){
System.out.println("吃飯");
}
}
//方法
public static void operatePerson(Person p){
p.eat();
}
//main調用方法,將person對象傳入方法中
operatePerson(new person());
2. 抽象類作為方法參數傳入
//抽象類
public abstract class Animal{
public abstratc void eat();
}
//Animal的子類
public class Cat extends Animal{
//重寫方法
public void eat(){
System.out.println("貓吃魚");
}
}
//main中的方法,這里要求傳入Animal類,但Animal的類是一個抽象類,不能實例對象,所以只能傳其子類。
function static void operateAnimal(Animal a){
a.eat();
}
//方法的調用
Animal a = new Cat();
operateAnimal(new cat());或operateAnimal(a);
當然,還要以通過內部類一次性傳參
operateAnimal(
new Animal(){
//重寫animal抽象方法
public void eat(){System.out.println("貓還吃飯");}
}
);
要求傳入父類對象,但可以傳入任意子類對象,這樣就使得擴展性得到提高
operateAnimal(new Cat());
operateAnimal(new Dog());
operateAnimal(new Bird());
......
傳入什么類,就調用什么類的功能,這就是多態的實現。
3. 接口實現類的對象當成方法參數傳入
public interface Smoking{
public abstract void smoking();
}
//實現類
public class Student implements Smoking{
//實現接口方法
public void smoking(){
System.out.println("抽煙中....");
}
}
//main中定義方法,將接口實現類當方法參數傳入
public static void operateSmoking(Smoking s){
s.smoking();
}
//方法的調用
Smoking s = new Student();
operateSmoking(s);或operateSmoking(new Student());
或用內部類傳入
operateSmoking(
new Smoking(){
//重寫接口方法
public void smoking(){
System.out.println("不准吸煙");
}
}
);
總結:類當成方法參數傳入,其實就是傳對象。抽象類和接口其實就是傳其子類或實現類的對象。