首先接口和抽象类关系比较好。
接口是一个特殊的类。接口也是一个类。里面也是可以放成员变量和属性的。不过对于需要new来创建对象的,是不行的。(比如构造方法。)
所以在接口中使用,成员方法和属性都是可以的。(不过一般里面只放抽象方法。)
而且现在了解到的,主要是被static,default,public,abstract和final修饰的。(如果你没有加,他前面是会有默认的。)
比如我这里写一个接口:
interface JieKouTest1_1 {
int a = 10;
}
public class TestJieK1_1 {
public static void main(String[] args) {
System.out.println(JieKouTest1_1.a);
}
输出为:
10
但是我想把a赋值成别的数字。
interface JieKouTest1_1 {
int a = 10;
}
public class TestJieK1_1 {
public static void main(String[] args) {
JieKouTest1_1.a = 20;//想要在这里把原本的a改成20;
System.out.println(JieKouTest1_1.a);
}
}
输出为:
java: 无法为最终变量a分配值
这不是被final修饰了的变量才会报的错误吗(对于final何时会报不允许改变赋值的错,会写一份博客的。)所以我个人认为这里的在接口中的int a前面是有一个final修饰的。
package com.JieKou;
interface Test1_1 {
//两个方法一个显示的写出前面的,另一个则没有。测试没有的是否有隐式的。
public abstract void name();
void age();
}
class JieK implements Test1_1 {
@Override
public void name() {
System.out.println("pz");
}
@Override
public void age() {
System.out.println("18");
}
}
public class TestJieK1_1 {
public static void main(String[] args) {
JieK jieK = new JieK();
jieK.age();
jieK.name();
//然后用这里的向上转型发现也是可以使用的。
Test1_1 test = new JieK();
test.age();
test.name();
}
}
输出为:
18 pz 18 pz所以说:接口中的抽象方法,如果一个类实现了这个接口的话,这个类(不为抽象类)就需要重写接口中的所有抽象方法
那这个接口是否具备关于继承的所以特征呢?
1、如果用implements实现接口了的类,如果其中没有所对应的方法的话,会去接口里面找对应的方法吗? (不过这里就出现了一个问题,如果不覆写,那就只能把这个类写成抽象类了。)
2、接口就可以实现,多次继承这个接口,而抽象类就不行。(那接口能继承接口来进行套娃吗?比如A接口继承了B接口,然后一个类继承了A接口,是不是也具有B接口的特征?)
3、为何说接口也是一个类呢?还有除了abstract和final,上面提到的default和static怎么使用。(或者说体现类该有的特征?)
- 1、
package com.JieKou;
interface Test1_1 {
int a = 10;
public static void show() {
System.out.println("接口中的static方法。");
}
public static void show(int a) {
// this.a = a;
//这里加了this会报错。
System.out.println(a);
}
default void display() {
System.out.println("接口中default方法。");
}
}
class JieK implements Test1_1 {
}
public class TestJieK1_1 {
public static void main(String[] args) {
JieK jieK = new JieK();
jieK.display();
Test1_1.show();
Test1_1.show(20);
//然后这里可以看出,对应的参数可调用static的方法。
}
}
输出为:
接口中default方法。 接口中的static方法。 20
这里测试对于接口里面的抽象方法,是否具有跟抽象类中的抽象方法有类似的特征。(这里测试的是,对于多重继承需要注意的地方。)
interface Method {
public abstract void show();
}
abstract class Zi implements Method {
}
class ZiTwo extends Zi {
//如果这里没有覆写这个show()方法的话也是会报错的。这里跟抽象类中继承特征一样(不为抽象类的前提下。)
public void show() {
System.out.println("继承Zi类的子类。");
}
}
public class ShiXianJieKou {
public static void main(String[] args) {
Method shiXian = new ZiTwo();
shiXian.show();
}
}
输出为:
继承Zi类的子类。
这里说明接口的抽象方法与抽象类中的抽象方法在实现多重使用的时候也是需要都覆写其中的抽象方法的。
package com.JieKou;
//第一个Method接口
interface Method {
public abstract void show();
}
//第二个Function接口来继承第一个Method接口,并且其中定义两个不同的抽象方法。
interface Function extends Method {
public abstract void name(String name);
}
//用一个类来实现第二个接口,看是否需要覆写第一个接口的抽象方法。
//这里和上面例子不同的地方在于上面那个是对类中的继承看接口与抽象类的区别,而这个是看接口之间存在的关系。
class Imp implements Function {
String name;
//这里只实现第二个接口中Function的抽象方法。
public void name(String name) {
this.name = name;
System.out.println(name);
}
}
public class ShiXianJieKou {
public static void main(String[] args) {
Imp shiXian = new Imp();
shiXian.show();
shiXian.name("pz");
}
}
输出为:(报错)
java: com.JieKou.Imp不是抽象的, 并且未覆盖com.JieKou.Method中的抽象方法show()
看来对于接口的继承和类的继承没有什么太大的区别,这里只能说是对抽象方法有这个感觉吧。由于还没有对接口中的static等修饰的方法和属性来进行判断,所以还没有太肯定的回答。
对上面的这段加上
public void show() {
System.out.println("继承于接口Function的方法。");
}
输出为:
继承于接口Function的方法。 pz
接口也是可以实现继承extends多个接口的。(不过接口不能实现implements接口)。类可以实现多个接口,但是只能继承一个类(或是抽象类)。



