接口、形参和返回值

本文详细介绍了Java中的接口和抽象类的概念及其使用。通过示例展示了如何定义接口、实现接口以及接口与类之间的关系。同时,讨论了抽象类与接口的区别,强调了接口在多态和功能扩展中的作用。此外,还探讨了类名作为参数和返回值的情况,以及抽象类名和接口名作为参数和返回值的场景。

接口

概述
接口就是一种公共的规范标准,只要符合规范标准,大家都可以通用。
Java中的接口更多的体现在对行为的抽象。

定义接口

public interface Jumpping {
   public abstract void jump();
}

类实现接口

public class Cat implements Jumpping{
   public void jump(){
       System.out.println("猫可以跳");
   }
}

接口如何实例化?

Jumpping j=new Jumpping();
//报错,不能直接实例化
//可以参照多态的形式
Jumpping j=new Cat();

要是接口实现类不想重写接口中的方法,那么这个类就要定义为抽象类。

在这里插入图片描述

接口的成员特点

1.接口中的成员变量默认是public static final int num=10;也就是说当定义时public int num=10,等价于前面的。
2.接口中的成员变量是静态变量,所以可以通过接口名.变量名直接访问,且是常量,不可重新赋值。
3.接口不能有构造方法。
4.接口中不能有非抽象方法

//接口
package myday;

public interface Inter {
	public abstract void eat();
}
//实现类
package myday;

public class InterImp implements Inter{
//这种写法相当于:
//public class InterImp extends Object implements Inter{}
//因为接口中没有构造方法,所以实现类中的super();其实调用的是Object中的无参构造方法(空的)
	public InterImp() {
		super();
	}
	public void eat() {
		System.out.println("啊啊啊");
	}
}
//接口中:
public void show(){};//报错,不能有非抽象方法
public abstract void show();//可以
void show();//可以,默认有修饰符public abstract

在这里插入图片描述

//接口
package myday;

public interface Inter {
	public abstract void jump();
}
//父类
package myday;

public abstract class Animal {
	public String name;
	public int age;
	
	public Animal() {
		
	}
	
	public Animal(String name,int age) {
		this.name=name;
		this.age=age;
	}
	

	public void setName(String name) {
		this.name=name;
	}
	
	public void setAge(int age) {
		this.age=age;
	}
	
	public String getName() {
		return this.name;
	}
	
	public int getAge() {
		return this.age;
	}
	
	public abstract void eat();
	
}
//子类
package myday;

public class Cat extends Animal implements Inter {
	public Cat() {
		
	}
	
	public Cat(String name,int age) {
		super(name,age);
	}
	
	public void jump() {
		System.out.println("猫跳高");
	}
	public void eat() {
		System.out.println("猫吃鱼");
	}
	public void Catch() {
		System.out.println("猫捉老鼠");
	}
}
//测试
package myday;

public class Demo {
	public static void main(String[] args) {
		Inter c1=new Cat();
		c1.jump();//只能调用接口的重写方法
		System.out.println("-----");
		Animal c2=new Cat();
		c2.setAge(15);//只能调用父类的重写方法
		c2.setName("aaa");
		System.out.println(c2.getAge()+","+c2.getName());
		Cat c3=(Cat) c2;
		c3.Catch();//强转,可以调用子类的特有方法
	}

}

接口引用的类只能调用接口中重写的方法,父类引用的子类只能调用父类重写的方法,这样做很麻烦。
由于子类继承了父类,同时也实现了接口,所以实际上是这样使用的:
在这里插入图片描述
又回到了最初创建对象的方法,这样无论是接口还是父类中的方法,还是子类特有的方法,都可以调用了。

类和接口的关系

类和类的关系:
继承关系,只能单继承,但是可以多层继承。
类和接口的关系:
实现关系,可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口。

一个类继承一个类、实现多个接口:
在这里插入图片描述

接口和接口的关系:
继承关系,可以单继承,也可以多继承。
在这里插入图片描述

抽象类和接口的区别

在这里插入图片描述
门有开关功能和报警功能。但并不需要所有门都有报警功能,所以如果把这三个功能都放在接口或者抽象类中,是不符合实际需求的。
解决方案为,开关门功能为所有门都有的功能,放在抽象类,报警功能放在接口,当门需要该功能时只需要实现接口即可。
在这里插入图片描述

类名作为形参和返回值

类名作为形参

//猫
package myday;

public class Cat {
	public void eat() {
		System.out.println("猫吃鱼");
	}
}
//猫操作类
package myday;

public class CatOp {
	public void useCat(Cat c) {
		c.eat();
	}
}
//猫测试类
package myday;

public class Demo {
	public static void main(String[] args) {
		Cat c=new Cat();
		CatOp op=new CatOp();
		op.useCat(c);
	}

}

类名作为返回值

public Cat getCat(){
   Cat c=new Cat();
   return c;
}

在这里插入图片描述
抽象类名作为形参

//抽象类
package myday;

public abstract class Animal {
	
	public abstract void eat();
	
}
//实现类
package myday;

public class Cat extends Animal{
	public void eat() {
		System.out.println("猫吃鱼");
	}
}
//操作类
package myday;

public class AnimalAll {
	public void useAnimal(Animal d) {
	//Animal类作为形参,也就是抽象类
		d.eat();
	}
}
//测试类
package myday;

public class Demo {
	public static void main(String[] args) {
		AnimalAll ao=new AnimalAll();
		Animal a=new Cat();
		//抽象类不能直接创建对象
		//所以要父类引用的方法创建对象传入方法
		ao.useAnimal(a);
	}

}

抽象类作为返回值

//抽象类
package myday;

public abstract class Animal {
	
	public abstract void eat();
	
}
//操作类
package myday;

public class AnimalAll {
	public void useAnimal(Animal d) {
		d.eat();
	}
	public Animal getAnimal() {
		Animal a=new Cat();
		return a;//返回的是Animal类(抽象类)
		//所以父类引用创建子类对象
	}
}
//子类
package myday;

public class Cat extends Animal{
	public void eat() {
		System.out.println("猫吃鱼");
	}
}
//测试类
package myday;

public class Demo {
	public static void main(String[] args) {
		AnimalAll ao=new AnimalAll();
		Animal a=ao.getAnimal();
		a.eat();
	}

}

在这里插入图片描述

接口名作为形参和返回值

//接口
package myday;

public interface Inter {
	void jump();
}
//接口实现类
package myday;

public class InterIm implements Inter{
	public void jump() {
		System.out.println("猫跳高");
	}
}
//操作类
package myday;

public class Interop {
	public void usejump(Inter j) {
	//形参为接口类
	//接口类不能直接定义对象
	//所以利用多态的形式创建对象
		j.jump();
	}
}
//测试类
package myday;

public class Demo {
	public static void main(String[] args) {
		Interop j=new Interop();
		Inter a=new InterIm();
		j.usejump(a);
	}

}

接口名作为返回值

//接口类
package myday;

public interface Inter {
	void jump();
}
//接口实现类
package myday;

public class InterIm implements Inter{
	public void jump() {
		System.out.println("猫跳高");
	}
}
//操作类
package myday;

public class Interop {
	public void usejump(Inter j) {
		j.jump();
	}
	public Inter getjump() {
		Inter j=new InterIm();
		return j;
	}
}
//测试类
package myday;

public class Demo {
	public static void main(String[] args) {
		Interop j=new Interop();
		Inter a=j.getjump();//new InterIm()
		a.jump();
	}
}

在这里插入图片描述

### 使用函数的形参返回值实现逻辑判断 在编程中,为了避免使用全局变量来传递状态或控制流程,可以通过设计合理的函数接口(即参数返回值)来完成特定的任务。以下是通过三个函数的参数返回值实现逻辑判断的具体方法。 #### 设计思路 1. **第一个函数**:接收初始条件作为输入,并基于此条件进行初步处理,返回中间结果。 2. **第二个函数**:接收第一个函数的结果作为输入,进一步加工或验证,最终决定是否满足某种逻辑条件。 3. **第三个函数**:接收前两个函数的结果作为输入,综合分析并给出最终结论。 这种分层的设计方式不仅能够避免全局变量的使用,还能提高代码的模块化程度可维护性。 --- #### 示例代码 假设我们需要编写一组函数来判断某个整数 `n` 是否为质数,并统计其因数数量: ```python def check_divisibility(n, divisor): """ 判断 n 是否能被 divisor 整除。 参数: n (int): 待检测的整数 divisor (int): 检测因子 返回: bool: 如果能整除则返回 True;否则 False """ return n % divisor == 0 # 判断能否整除 [^1] def count_factors(n): """ 统计 n 的正因数个数。 参数: n (int): 输入的整数 返回: int: 正因数的数量 """ factor_count = 0 for i in range(1, abs(n) + 1): # 遍历可能的因数 if check_divisibility(n, i): # 调用辅助函数检查因数关系 factor_count += 1 return factor_count # 返回因数总数 [^2] def is_prime(n): """ 判断 n 是否为质数。 参数: n (int): 输入的整数 返回: bool: 如果是质数,则返回 True;否则 False """ factors = count_factors(n) # 获取因数数量 return factors == 2 # 质数仅有两个因数 [^3] ``` --- #### 解析 1. **`check_divisibility` 函数** 接收两个参数 `n` `divisor`,用于判断 `n` 是否能被 `divisor` 整除。这是最底层的操作,提供了一个简单的布尔判定工具[^1]。 2. **`count_factors` 函数** 基于 `check_divisibility` 的结果,遍历所有可能的因数范围 `[1, |n|]` 并累加符合条件的因数数目。最后返回总因数个数[^2]。 3. **`is_prime` 函数** 结合 `count_factors` 的输出,依据质数定义(仅有两个因数),得出最终的质数判定结果[^3]。 整个过程完全依赖函数间的参数传递返回值交互,无需引入任何全局变量。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值