接口

概述
接口就是一种公共的规范标准,只要符合规范标准,大家都可以通用。
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();

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

java中接口返回类型不确定怎么办 接口返回的参数_代理模式

接口的成员特点

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

java中接口返回类型不确定怎么办 接口返回的参数_代理模式_02

//接口
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();//强转,可以调用子类的特有方法
	}

}

接口引用的类只能调用接口中重写的方法,父类引用的子类只能调用父类重写的方法,这样做很麻烦。

由于子类继承了父类,同时也实现了接口,所以实际上是这样使用的:

java中接口返回类型不确定怎么办 接口返回的参数_java中接口返回类型不确定怎么办_03


又回到了最初创建对象的方法,这样无论是接口还是父类中的方法,还是子类特有的方法,都可以调用了。

类和接口的关系

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

一个类继承一个类、实现多个接口:

java中接口返回类型不确定怎么办 接口返回的参数_java-ee_04

接口和接口的关系:

继承关系,可以单继承,也可以多继承。

java中接口返回类型不确定怎么办 接口返回的参数_java_05

抽象类和接口的区别

java中接口返回类型不确定怎么办 接口返回的参数_java_06


门有开关功能和报警功能。但并不需要所有门都有报警功能,所以如果把这三个功能都放在接口或者抽象类中,是不符合实际需求的。

解决方案为,开关门功能为所有门都有的功能,放在抽象类,报警功能放在接口,当门需要该功能时只需要实现接口即可。

java中接口返回类型不确定怎么办 接口返回的参数_System_07

类名作为形参和返回值

类名作为形参

//猫
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;
}

java中接口返回类型不确定怎么办 接口返回的参数_java-ee_08


抽象类名作为形参

//抽象类
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();
	}

}

java中接口返回类型不确定怎么办 接口返回的参数_java_09

接口名作为形参和返回值

//接口
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();
	}
}

java中接口返回类型不确定怎么办 接口返回的参数_代理模式_10