形式参数和返回值是抽象类或接口时该如何调用
形式参数是抽象类时
需求:
在测试类中调用StudentDemo01类中的method()方法,通过method方法调用Student类中的study()方法。
//学生类(抽象类)
abstract class Student {
public abstract void study();
}
class StudentDemo01 {
public void method(Student s) {
s.study();
}
}
//测试类
public class Test {
public static void main(String[] args) {
}
}
解决方法:
//学生类(抽象类)
abstract class Student {
public abstract void study();
}
class StudentDemo01 {
//Student抽象类作为形式参数,调用其study()方法。
public void method(Student s) {
s.study();
}
}
//自定义一个StudentDemo02类继承Student类,间接初始化Student类。
class StudentDemo02 extends Student {
public void study() {
System.out.println("good good study, day day up!");
}
}
//测试类
public class Test {
public static void main(String[] args) {
StudentDemo01 sd1 = new StudentDemo01();
//创建子类对象。
StudentDemo02 sd2 = new StudentDemo02();
sd1.method(sd2);
}
}
使用匿名内部类解决:
//学生类(抽象类)
abstract class Student {
public abstract void study();
}
class StudentDemo01 {
public void method(Student s) {
s.study();
}
}
//测试类
public class Test {
public static void main(String[] args) {
StudentDemo01 sd1 = new StudentDemo01();
//使用匿名内部类直接重写Student类中的Study()方法。
sd1.method(new Student() {
public void study() {
System.out.println("good good study, day day up!");
}
});
}
}
抽象类是返回值
需求:
在测试类中调用StudentDemo01类中的method()方法,通过method方法调用Student类中的study()方法
//学生类(抽象类)
abstract class Student {
public abstract void study();
}
class StudentDemo01 {
public Student method() {
return
}
}
//测试类
public class Test {
public static void main(String[] args) {
}
}
解决方法:
//学生类(抽象类)
abstract class Student {
public abstract void study();
}
class StudentDemo01 {
public Student method() {
return new StudentDemo02();
}
}
//自定义一个StudentDemo02类继承Student类,间接初始化Student类。
class StudentDemo02 extends Student {
public void study() {
System.out.println("good good study, day day up!");
}
}
//测试类
public class Test {
public static void main(String[] args) {
StudentDemo01 sd1 = new StudentDemo01();
Student s = sd1.method();
s.study();
}
}
匿名内部类解决:
//学生类(抽象类)
abstract class Student {
public abstract void study();
}
class StudentDemo01 {
public Student method() {
//使用匿名内部类直接重写Student类中的Study()方法。
return new Student() {
public void study() {
System.out.println("good good study, day day up!");
}
};
}
}
//测试类
public class Test {
public static void main(String[] args) {
StudentDemo01 sd1 = new StudentDemo01();
Student s = sd1.method();
s.study();
}
}
形式参数是接口时
需求:
在测试类中调用Student类中的method()方法,通过method方法调用Study接口中的study()方法。
//接口
interface Study {
public abstract void study();
}
//学生类
class Student {
public void method(Study s) {
s.study();
}
}
//测试类
public class Test {
public static void main(String[] args) {
}
}
解决方法:
//接口
interface Study {
public abstract void study();
}
//学生类
class Student {
public void method(Study s) {
s.study();
}
}
//自定义Study接口的子实现类StudentDemo,重写study()方法。
class StudentDemo implements Study {
public void study() {
System.out.println("good good study, day day up!");
}
}
//测试类
public class Test {
public static void main(String[] args) {
Student s = new Student();
StudentDemo sd = new StudentDemo();
s.method(sd);
}
}
匿名内部类解决:
//接口
interface Study {
public abstract void study();
}
//学生类
class Student {
public void method(Study s) {
s.study();
}
}
//测试类
public class Test {
public static void main(String[] args) {
Student s = new Student();
//使用匿名内部类直接重写Study接口中的Study()方法。
s.method(new Study() {
public void study() {
System.out.println("good good study, day day up!");
}
});
}
}
接口是返回值时
需求:
在测试类中调用Student类中的method()方法,通过method方法调用Study接口中的study()方法。
//接口
interface Study {
public abstract void study();
}
//学生类
class Student {
public Study method() {
return
}
}
//测试类
public class Test {
public static void main(String[] args) {
}
}
解决方法:
//接口
interface Study {
public abstract void study();
}
//学生类
class Student {
public Study method() {
return new StudentDemo();
}
}
//自定义Study接口的子实现类StudentDemo,重写study()方法。
class StudentDemo implements Study {
public void study() {
System.out.println("good good study, day day up!");
}
}
//测试类
public class Test {
public static void main(String[] args) {
Student s = new Student();
Study s1 = new StudentDemo();
s1.study();
}
}
匿名内部类解决:
//接口
interface Study {
public abstract void study();
}
//学生类
class Student {
public Study method() {
//使用匿名内部类直接重写Study接口中的Study()方法。
return new Study() {
public void study() {
System.out.println("good good study, day day up!");
}
};
}
}
//测试类
public class Test {
public static void main(String[] args) {
Student s = new Student();
Study s1 = s.method();
s1.study();
}
}
以上便是我对形式参数和返回值是抽象类或接口时该如何调用的理解,最后附上一张自己总结时写代码的照片。