1.形参和返回值
(关于基本数据类型作为形参和返回值的问题,比较简单就不讨论了,重点讲解引用类型作为形参和返回值。而引用类型作为形参和返回值这里我们重点研究的是讲解的面向对象过程中的类,抽象类和接口它分别作为形参和返回值的问题。)
1.1类名作为形参和返回值
先到程序中演示再小结:
public class Cat {
//1.在Cat类里有一个eat方法
public void eat(){
//2.在eat方法里面将来会输出猫吃鱼
System.out.println("猫吃鱼");
}
}
/*
猫的操作类
*/
class CatOperator {
//3.在CatOperator类里面有一个useCat方法,就是使用猫类
public void useCat(Cat c){//4.把Cat作为方法的形参放在这里
//5.在方法内通过变量c调用eat方法
c.eat();
//9.所以说类名作为形参其实它要得是该类的对象
}
//10.接下来说一下类名作为返回值
/*11.这里返回值类型怎么写呢,他要的是一个Cat类型的,而我们知道
我们最终要返回的数据一定是Cat类型的,Cat类型的数据?Cat是个类呀,
它这种类型的数据应该是什么?应该是对象。所以在方法里面要返回对象,就要创建对象。
*/
public Cat getCat(){
//12.创建对象
Cat c = new Cat();
//13.直接返回对象,就可以了
return c;//14.这个c是Cat类型的对象所以返回值类型定义为Cat是没有问题的
}
}
/*
测试类
*/
class CatDemo {
public static void main(String[] args) {
//6.创建操作类对象,并调用方法
CatOperator co = new CatOperator();
//8.创建Cat类对象
Cat c = new Cat();
/*7.调方法,useCat方法需要的形参是一个Cat作为形参
要让Cat类型的变量c能去调用方法,调用方法的一个东西
它应该是一个对象,所以我们创建Cat类型的对象,所以
我们首先要创建一个Cat c = new Cat,然后把c放到
co.useCat的括号里才可以。这样就不会报错了。
*/
co.useCat(c);//猫吃鱼
//15.通过co对象调用getCat方法
Cat c2 = co.getCat();
/*16.co.getCat();调用的是getCat();方法
然后进入到方法里面首先创建了一个Cat类型对象c,
并把这个对象c返回,这个对象c其实就是new Cat();
co.get Cat();就相当于把new Cat();的内容赋值给了
Cat类型对象c2,那么c2就相当于Cat的一个对象,那么就可以
通过c2来调用方法
*/
c2.eat();//猫吃鱼
//17.这几个类讲的就是类作为形参,和类作为返回值
}
}
类名作为形参和返回值小结:
- 方法的形参是类名,其实需要的是该类的对象。
- 方法的返回值是类名,其实返回的是该类的对象。
1.2抽象类名作为形参和返回值
先到代码演示再小结:
/*
抽象动物类
*/
public abstract class Animal {
//1.在动物类中有一个抽象的eat方法
public abstract void eat();
}
/*
4.创建子类继承抽象类并重写方法
*/
class Cat extends Animal{
@Override
public void eat() {
System.out.println("猫吃鱼");
}
}
/*
动物操作类
*/
class AnimalOperator {
//2.它有一个是使用Animal类的eat抽象方法形参是类名 变是a
public void useAnimal(Animal a){//6.Animal a就等于new Cat();
/*7.然后执行a.eat,编译看左边Animal里有没有eat抽象方法,
执行看右边看Cat里面有没有重写eat方法,如果有,就执行
*/
a.eat();
}
//8.上述说的就是抽象类名作为形参的问题,其实它需要的是该抽象类的子类对象
//9.第二种方法
public Animal getAnimal(){
//10.通过多态形式来创建子类对象
Animal a = new Cat();
return a;
}
}
/*
测试类
*/
class AnimalDemo {
public static void main(String[] args) {
//3.创建操作类对象,调用方法
AnimalOperator ao = new AnimalOperator();
/*4..抽象类对象是不能直接实例化的所以要使用多态的方式
因为多态的创建对象是父类引用指向子类对象,所以要先创建一个
子类
*/
Animal a = new Cat();
//5.把a传递过去
ao.useAnimal(a);//执行看到猫吃鱼其实是调用了useAnimal方法执行了里面的eat方法
//11.然后调用getAnimal方法,
Animal a2 = ao.getAnimal();
/*12.ao.getAnimal的返回值是一个对象,
就相当于把new Cat();赋值给了Animal a2
这就是多态的形式,然后a2就是个对象,接着使用a2来调用方法
编译看左边,Animal里面有,执行看右边右边是Cat,Cat类里面重写了
执行直接得到Cat类重写的eat方法。
*/
a2.eat();//猫吃鱼
}
}
抽象类名作为形参和返回值小结:
- 方法的形参是抽象类名,其实需要的是该抽象类的子类对象。
- 方法的返回值是抽象类名,其实返回的是该抽象类的子类对象。
1.3接口名作为形参和返回值
先到程序中演示再小结:
import java.nio.file.attribute.AclFileAttributeView;
/*
接口
*/
public interface Jumpping {
//1.接口里面有一个jump方法
void jump();
}
/*
接口操作类
*/
class JumppingOperator {
//2.在接口操作类里面有一个方法,形参是接口
public void useJumpping(Jumpping j){//Jumpping j = new JumppingImpl();
j.jump();
}
//8.第二种方法,返回值类型是一个接口,返回的是该接口类型的对象(该接口的实现类对象)
public Jumpping useJumpping(){
Jumpping j = new JumppingImpl();
return j;
}
}
/*
5.创建接口实现类
*/
class JumppingImpl implements Jumpping{
//6.重写接口中的方法
@Override
public void jump() {
System.out.println("猫经过训练学会了跳高");
}
}
/*
测试类
*/
class JumppingDemo {
public static void main(String[] args) {
//3.在测试类中创建操作类对象,调用方法
JumppingOperator jo = new JumppingOperator();
/*4.接口是不能实例化的,这里所以也要按照多态的形式创建对象
要的是接口实现类的对象。所以要先去创建一个类实现接口
*/
Jumpping j = new JumppingImpl();
jo.useJumpping(j);//猫经过训练学会了跳高
//7.第二种方法
Jumpping j2 = jo.useJumpping();
j2.jump();//猫经过训练学会了跳高
//;老规矩编译看左,执行看右
}
}
接口名作为参数和返回值小结:
- 方法的形参是接口名,其实需要的是该接口的实现类对象。
- 方法的返回值是接口名,其实返回的是该接口的实现类对象。