学习Java第十七天--接口之接口的概念和多态

10.接口

10.1 什么是接口

10.1.1 接口的语法

  • 接口相当于特殊的抽象类,定义方式、组成部分与抽象类类似;
public class TestBasicInterface {
	public static void main(String[] args) {
		System.out.println(MyInterface.A);
		System.out.println(MyInterface.B);
		//MyInterface.C = "cc";//error
		System.out.println(MyInterface.D);
	}
}
interface MyInterface{
	//公开静态常量(只能)
	public static final String A = "aaa";
	public final String B = "bbb";
	public static String C = "ccc";
	String D = "ddd";//public static final 隐式存在、修饰

	//公开抽象方法
	public abstract void m1();
	public void m2();
	abstract void m3();
	void m4();//public abstract 隐式存在、修饰
}

10.1.2 与抽象类的异同

  • 相同:
    可编译成字节码文件;
    不能创建对象;
    可以作为引用类型;
    具备Object类所定义的方法;

  • 不同:
    所有属性都是公开静态常量,隐式使用public static final修饰;
    所有方法都是公开抽象方法,隐式使用public abstract修饰;
    没有构造方法、动态代码块、静态代码块;

10.1.3 接口的微观概念

  • 微观概念:接口是一种能力和约束;

  • 接口的定义:代表了某种能力;

  • 方法的定义:能力的具体要求;

  • 经验:Java为单继承,当父类的方法种类无法满足子类需求时,可实现接口扩充子类能力;

  • 接口支持多实现,可为类扩充多种能力;

10.1.4 接口的规范

  • 任何类在实现接口时,必须实现接口中的所有的抽象方法,否则此类为抽象类;
  • 实现接口中的抽象方法时,访问修饰符必须是public;

10.1.5 接口引用

  • 同父类一样,接口也可以声明为引用,并指向实现类对象;
  • 注意:
    仅可调用接口中所声明的方法,不可调用实现类中独有的方法;
    可强转回实现类本身类型,进行独有方法调用;
public class TestApplyInterface {

	public static void main(String[] args) {
		
		Animal a = new Dog();//父类方法引用子类对象
		
		Runnable d = new Dog();//接口引用子类对象
		d.run();
		
		if(d instanceof Dog) {//可强转回实现类本身类型
			Dog dog = (Dog)d;
			dog.swim();
		}
	}

}
class Animal{
	String breed;
	int age;
	String sex;
	
	public void eat() {}
	public void sleep() {}
}

class Dog extends Animal implements Runnable , Swimmable{//实现接口->代码落地 
	String furColor;
	public void run() {
		System.out.println("狗在奔跑。。。");
	}
	
	@Override
	public void swim() {
		System.out.println("狗在游泳。。。");
	}
}

class Cat extends Animal implements Runnable , Climbable{
	String furColor;
	public void run() {
		System.out.println("猫在跑。。。");
	}
	public void climb() {
		System.out.println("猫在爬树。。。");
	}
}

class Fish extends Animal implements Swimmable{
	public void swim() {
		System.out.println("鱼在游。。。");
	}
}

class Bird extends Animal implements Flyable{
	public void fly() {
		System.out.println("鸟在飞翔。。。");
	}
}

//定义了一种能力:会跑的
interface Runnable{
	public abstract void run();
}

//定义了一种能力:会游的
interface Swimmable{
	public abstract void swim();
}

//定义了一种能力:会爬的
interface Climbable{
	void climb();
}

//定义了一种能力:会飞的
interface Flyable{
	void fly();
}

10.2 接口的多态

10.2.1 接口多态的概念

public class TestPolymorpfic{
	public static void main(String[] args){
		Dog myDog = new Dog();//将狗当狗看
		Animal a = myDog;//将狗当动物看
		Runnable = myDog;//将狗当会跑的东西看
		Swimmable = myDog;//将狗当会游的东西看
	}
}
interface Runnable{
	void run();
}
interface Swimmable{
	void swim();
}
abstract class Animal{
	public void eat(){}
	public void sleep(){}
}
class Dog extends Animal implements Runnable , Swimmable{
	public void run(){}//接口方法
	public void swim(){}//接口方法
	public void shout(){}
}
  • 多种不同类型的引用指向同一个对象时,表示看待对象的视角不同;
  • 不同引用所能看到的对象范围不同,只能调用自身类型中所声明的部分;

10.2.2 常见关系

  • 类与类:
    单继承
    extends 父类名称

  • 类与接口:
    多实现;
    implements 接口名称1 , 接口名称2 , 接口名称n

  • 接口与接口:
    多继承;
    extends 父接口1 , 父接口2 , 父接口n

10.2.3 常量接口

  • 将多个常用于表示状态或固定值的变量,以静态常量的形式定义在接口中统一管理,提高代码可读性;
发布了34 篇原创文章 · 获赞 7 · 访问量 1298

猜你喜欢

转载自blog.csdn.net/weixin_44257082/article/details/104504107