Java里的接口的interface 简单介绍.(二)

2014-11-24 02:50:36 · 作者: · 浏览: 1
interface Itf_1{
        int i = 1;
        void f();
}

interface Itf_2{
        int k = 2;
        void g();
}

interface Itf_3 extends Itf_1, Itf_2{
        int j = 3;
}

class Itf_class2 implements Itf_3{
        public void f(){ //overwrite
                System.out.printf("i is %d, k is %d, j is %d\n", this.i, this.k, this.j);
        }

        public void g(){

        }
}

public class Interface_3{
        public static void f(){
                Itf_class2  a = new Itf_class2();
                a.f();
        }
}

上面的接口Itf_3 同时继承了接口Itf_1 和 Itf_2. 所以Itf_3 同时具有了两者的成员和方法
接着非抽象了类 Itf_class2 实现了Itf_3, 并重写了所有接口方法.

接口的多继承有时也会产生冲突. 下面有两种情况要注意的:

3.2.1 假如1个接口A 继承另外两个接口B和C, 但是接口B,C 有相同名字的成员i

这种情况并不影响多继承, 但是当1个类实现了接口A时, 使用成员i时就不能用this.i了.
因为编译器会告诉你成员混扰. 需要告诉编译器你想调用那个成员, 毕竟这个成员是静态的, 前面可以加接口名字谦虚.
例子:
interface Itf_1{
	int i = 1;
	void f();
}

interface Itf_2{
	String i = "abc";
	int k = 2;
	void g();
}

interface Itf_3 extends Itf_1, Itf_2{
	int j = 3;
}


class Itf_class2 implements Itf_3{
	public void f(){ //overwrite
		System.out.printf("i1 is %d, i2 is %s, k is %d, j is %d\n", Itf_1.i, Itf_2.i, this.k, this.j);
	}	

	public void g(){
		
	}
}

例如上面的成员i, 如果在类中直接调用this.i, 编译失败..



3.2.1 假如1个接口A 继承另外两个接口B和C, 但是接口B,C 有相同名字的方法f().

这里还要分两种情况
假如这两个方法具有相同的返回类型.
这样的话则不影响继承. 在实现接口A时直接重写一次f() 就ok了.
编译器会将两个同名方法视为1个方法:

package Interface_kng.Extend;

interface Itf_1{
	int i = 1;
	void f();
}

interface Itf_2{
	String i = "abc";
	int k = 2;  //same name with Itf_1
	void f();   //same name with Itf_1
	void g();
}

interface Itf_3 extends Itf_1, Itf_2{
	int j = 3;
}


class Itf_class2 implements Itf_3{
	public void f(){ //overwrite
		System.out.printf("i1 is %d, i2 is %s, k is %d, j is %d\n", Itf_1.i, Itf_2.i, this.k, this.j);
	}	

	public void g(){
		
	}
}



假如这两个方法具有不同的返回类型.


这种情况下就悲剧了, 一个非抽象类无法实现该接口
例如:
interface Itf_1{
	int i = 1;
	void f();
}

interface Itf_2{
	String i = "abc";
	int k = 2;  //same name with Itf_1
	int f();   //same name with Itf_1, but diff return type
	void g();
}

原因也很简单, 因为1个非抽象类无法同时重写这两个方法.
1个类中不允许有两个方法相同名字相同参数而返回值不同啊.


假如在工作中遇到这种情况怎么办 除了重构.. 个人建议只能分别用两个类来实现两个接口...
所以在 编程中, 为接口的成员和方法命名时最好加上接口的标记.. 避免将来可能发生的冲突...


3.5 1个类可以同时实现多个接口.

这个不难理解, 跟上面那点类似, 不过也可能会出现上面提到的冲突..
interface Itf_1{
	int i = 1;
	void f();
}

interface Itf_2{
	String i = "abc";
	int k = 2;  //same name with Itf_1
	void f();   //same name with Itf_1
	void g();
}

class Itf_class1 implements Itf_1, Itf_2{
	public void f(){ //overwrite
		System.out.printf("i1 is %d, i2 is %s, k is %d", Itf_1.i, Itf_2.i, this.k);
	}	

	public void g(){
		
	}
}


3.6 1个类可以继承另一个类的同时实现1个或多个接口.


这个也不难理解.
但是要把 extends 写在前面, implements 写在下面
语法:

class Class_name extends Superclass_name implements {
}


个人建议, 小心使用, 因为如果超类也实现了1个或多个相同的接口时就可能有冲突了..





四, Java接口的功能和意义

说道这个, 很多java教材介绍接口时对会提到 电脑主板内存插槽 和 内存金手指的例子...
但是本人觉得这个例子不是很能体现java接口的意义
本人觉得, java里的接口更像是1个功能包或插件.
而java的类实现1个接口就相当于装备上了这个功能包或插件, 从而具有了这个功能包和插件的功能..
接下来还是引用权威吧..


1. 通过接口可以实验不相关类的相同行为. 例如 java规定所有可以完成自我复制功能的类都必需实现java.lang.Colneable 接口. 而这个接口是空的. 没有任何内容, 只是起1个标记作用

2. 接口提供了不同对象进行协作的平台 例如事件处理

3. 接口可以实现多继承, 一定程度上弥补了java类只能单继承的缺点.

4. 接口是我们了解1个类的功能的重要途径 例如1个类的定义代码很复杂, 而我们可以观察它实现了哪些接口, 大概估出这个类的作用.



本人能力有限, 对上面的1. 2两点还不能详解. 而 3. 4点则很容易理解的.