9.3接口(一)

9.1.1接口基本定义

接口在java中属于一种特殊的类,需要通过interface关键字进行定义,在接口中可以定义全局常量、抽象方法(必须是public访问权限)、default方法以及static方法。
范例:定义标准接口
由于类名称与接口名称的定义要求相同,所以为了区分出接口往往会在接口名称前加入字母I(interface的简写)

public interface INine200 {      //定义接口
        public static final String INFO="SSS";  //全局常量
        public abstract String getInfo();      //抽象方法
}

接口中存在抽象方法,所以无法被直接实例化,其使用原则如下。

  • 接口需要被子类实现,子类利用implements关键字可以实现多个父接口。
  • 子类如果不是抽象类,那么一定要覆写接口中的全部抽象方法。
  • 接口对象可以利用子类对象的向上转型进行实例化。
    关于extends、implements关键字的顺序
    子类可以继承父类也可以实现父接口
    class 子类 【extends】父类【implements 接口1,接口2…】{}
    范例:使用接口

public interface INine200 {      //定义接口
        public static final String INFO="SSS";  //全局常量
        public abstract String getInfo();      //抽象方法
}


public class Nine200 implements INine200 {

	@Override
	public String getInfo() {
		return "我喜欢你";
	}

}
public class java200 {
       public static void main(String[] args) {
    	     INine200 msg=new Nine200();
		     //Nine200 msg=new Nine200();//也可以
		     System.out.println(msg.getInfo());
	}
}

执行结果:我喜欢你
可以直接实例化子类,也可以向上转型实例化接口对象
范例:子类实现多个父接口


public interface INine200 {      //定义接口
        public static final String INFO="520";  //全局常量
        public abstract String getInfo();      //抽象方法
}


public interface INine201 {
        public abstract boolean coent();
}


public class Nine201 implements INine200, INine201 {

	@Override
	public boolean coent() {
		return false;
	}

	@Override
	public String getInfo() {
		
		if(this.coent()) {
			return "我喜欢你";
		}
		return "我爱你"+INine200.INFO;
	}

}


public class Java201 {
       public static void main(String[] args) {
		       Nine201 ni=new Nine201();
		       System.out.println(ni.getInfo());
	}
}

执行结果:我爱你520
子类实现两个父类接口,必须同时覆写两个父接口中的抽象方法,所以Nine201是两个接口类和Object类3个类的实例。
范例:观察接口实例转换

public class Jave201b {
       public static void main(String[] args) {
		INine200 msg=new Nine201();    //子类实例化父类接口
		Object obj=msg; //使用Object接收引用类型
		INine201 no=(INine201)obj;//强制转换为接口实例
		System.out.println(no.coent());
	}
}

执行结果:false
如果没有Nine201子类那么两个接口和Object三者之间是没有任何联系的,但是由于Nine201同时实现了这些接口并默认继承了Object类,所以该实例就可以进行任意父类接口的转型。
关于接口的简化定义
全局常量:String INFO=“KNJKIJM”; 抽象方法可以省略abstract

范例:子类继承抽象类同时实现接口

public interface INine200 {      //定义接口
        public static final String INFO="520";  //全局常量
        public abstract String getInfo();      //抽象方法
}


public interface INine201 {
        public abstract boolean coent();
}


public abstract class AbNine202 {    //定义抽象类
	public abstract boolean run();//抽象方法

}



public class Nine202 extends AbNine202 implements INine200, INine201 {

	@Override
	public boolean coent() {
		return true;
	}

	@Override
	public String getInfo() {
		if(this.coent()) {
			if(this.run()){
				return "我爱你"+INine200.INFO;
			}
			else {
				return "我喜欢你";
			}
		}
		return "不喜欢";
	}

	@Override
	public boolean run() {
		return true;
	}

}


public class Java202 {
       public static void main(String[] args) {
		      INine200 xt=new Nine202();
		      System.out.println(xt.getInfo());
	}
}


执行结果:我爱你520
抽象类中必须有abstract关键字定义
java中extends关键字除了具有类继承的作用外,也可以继承接口,并且可以同时实现多个父接口(接口和接口之间)。在类中只能继承一个类。
范例:使用extends继承多个父接口

 public interface INine200 {      //定义接口
        public static final String INFO="520";  //全局常量
        public abstract String getInfo();      //抽象方法
}


public interface INine201 {
        public abstract boolean coent();
}



public interface INine203 extends INine200,INine201{//接口多继承
       public String sing();
}


public class Nine203 implements INine203 {

	@Override
	public String getInfo() {
		if(this.coent()) {
			return "0";
		}else {
			return this.sing();
		}
	}

	@Override
	public boolean coent() {
		
		return false;
	}

	@Override
	public String sing() {
		
		return "1";
	}

}




public class Java203 {
      public static void main(String[] args) {
    	  Nine203  ll=new Nine203();
    	  System.out.println(ll.getInfo());
	}     
}

执行结果:1
INine203继承了两个接口,相当于拥有了那两个接口的所有抽象方法,所以实现接口时用Impplements时只用实现INine一个就可以了。

9.3.2接口定义加强

接口还可以使用default定义的普通方法或者使用static定义静态方法。
范例:在接口中使用default定义普通方法

public interface INine204 {
       public String mess();
       public default boolean connt() {   //定义普通方法,该方法可以被子类继承或者覆写
    	   System.out.println("建立通道");
    	   return true;
       }
}

public class Nine204 implements INine204{

	public String mess() {   //实现接口,覆写抽象方法
		return "123";
	}
       
}



public class Java204 {
       public static void main(String[] args) {
		   INine204 ms=new Nine204();
		   if(ms.connt()) {
			   System.out.println(ms.mess());
		   }
	}
}

执行结果:
建立通道123
default定义的普通方法,这样接口中的组成就不在只有普通方法,同时这些default定义的普通方法也可以直接被子类继承。使用default定义的普通方法需要通过接口实例化对象才可以调用,而为了避免实例化对象的依赖,在接口中也可以使用static定义方法,此方法可以直接利用接口名称调用。
范例:再接口中定义static方法

public interface INine204 {
       public String mess();
       public default boolean connt() {   //定义普通方法,该方法可以被子类继承或者覆写
    	   System.out.println("建立通道");
    	   return true;
       }
       public static Nine204 getInfo() {
    	   return new Nine204();
       }
}


public class Nine204 implements INine204{

	public String mess() {   //实现接口,覆写抽象方法
	    if(this.connt()) {
	    	return "电子信息";
	    }
	    return  "不知道";
	}
       
}


public class Java204 {
       public static void main(String[] args) {
		 INine204  ms=INine204.getInfo();
		 System.out.println(ms.mess());
	}
}

执行结果:建立通道
电子信息
用static定义的方法可以直接被接口名称调用,主要作用是获取接口实例化对象

发布了162 篇原创文章 · 获赞 9 · 访问量 3108

猜你喜欢

转载自blog.csdn.net/ll_j_21/article/details/104503790
9.3