一、定义
为了体现事物功能的扩展性,Java中就提供了接口来定义这些额外功能。
二、特性
-
接口用关键字interface表示
格式: interface 接口名 {}
-
类实现接口用implements表示
格式: class 类名 implements 接口名 {}
-
接口不能实例化,需要按照多态的方式来实例化。
如: 接口名 接口变量名 = new 类名();
-
接口的子类
1.可以是抽象类。但是意义不大。
2.可以是具体类。要重写接口中的所有抽象方法。
三、接口的成员特点
1.接口成员特点:
成员变量:只能是常量,并且是静态的。
默认修饰符:public static final
建议:自己手动给出。
2.构造方法:接口没有构造方法。
3.成员方法:只能是抽象方法。
默认修饰符:public abstract
建议:自己手动给出。
类与类,类与接口,接口与接口的关系:
1.类与类:
继承关系,只能单继承,可以多层继承。
2.类与接口:
实现关系,可以单实现,也可以多实现。
并且还可以在继承一个类的同时实现多个接口。
3.接口与接口:
继承关系,可以单继承,也可以多继承。
四、区分类和接口
1.成员区别
抽象类:
成员变量:可以变量,也可以常量
构造方法:有
成员方法:可以抽象,也可以非抽象
接口:
成员变量:只可以常量
成员方法:只可以抽象
2.关系区别
类与类
继承,单继承
类与接口
实现,单实现,多实现
接口与接口
继承,单继承,多继承
3.设计理念区别
抽象类 抽象类中定义的是该继承体系的共性功能。
接口 接口中定义的是该继承体系的扩展功能。
五、关键词总结
private
1.private是一个权限修饰符,用来修饰成员变量和成员方法;
2.私有是针对类,而不是针对对象,所以同一个类下的不同对象之间可以互相访问私有的成员;
3.被私有的成员只在本类中有效。
this
this指向的是对当前对象的引用。
this()特指访问本类的构造方法,只能写在构造方法中,不能使用在普通方法中。
不能在static中使用this。因为this是在创建对象之后才存在,而static方法在类加载时就存在了。
super
super代表了父类空间的引用,并不能代表对象,只是代表一个对象中的一块内存而已。
在子类构造方法中第一句会默认存在一句super()调用父类的构造方法。
static
1、被static修饰的变量属于类变量,可以通过类名.变量名直接引用,而不需要new出一个类来;
2、被static修饰的方法属于类方法,可以通过类名.方法名直接引用,而不需要new出一个类来;
被static修饰的变量、被static修饰的方法统一属于类的静态资源,是类实例之间共享的,一处变、处处变。
和静态变量、静态方法一样,静态代码块只再初始化的时候执行一次,而且优先于构造代码块和构造方法执行。当子类继承父类时,创建子类对象时会先执行父类静态代码块,再执行子类静态代码块,再对父类进行初始化,即执行父类的构造代码块和构造方法,最后对子类进行初始化,执行子类构造代码块和构造方法,
当存在多个静态资源时,静态资源加载的顺序是严格按照静态资源定义的顺序来加载的。
如:
public class A
{
private static int a = B();
static
{
System.out.println("Enter A.static block");
}
public static void main(String[] args)
{
new A();
}
public static int B()
{
System.out.println("Enter A.B()");
return 1;
}
}
代码执行的结果是:
Enter A.B()
Enter A.static block
final
1、被final修饰的类不可以被继承
2、被final修饰的方法不可以被重写
3、被final修饰的变量不可以被改变
其中,变量不可被改变指的是被final修饰不可变的是变量的引用,而不是引用指向的内容,引用指向的内容是可以改变的。
如:在方法中定义private变量
public class FinalString
{
private String str;
public FinalString(String str)
{
this.str = str;
}
public String getStr()
{
return str;
}
public void setStr(String str)
{
this.str = str;
}
}
fs为final修饰的变量,给fs的Str重新赋值,结果为2,重新赋值成功。
public class Test
{
public static void main(String[] args)
{
final FinalString fs = new FinalString("1");
fs.setStr("2");
System.out.println(fs.getStr());
}
}
当主函数修改为:
public class Test
{
public static void main(String[] args)
{
final FinalString fs = new FinalString("1");
final FinalString fs2 = new FinalString("2");
fs = fs2;
}
}
结果报错,证明final修饰的变量的引用是不可变的,而引用指向的内容是可变的。
abstract
如果一个类中至少有一个抽象方法,那么这个类一定是抽象类,但反之则不然。也就是说一个抽象类中可
以没有抽象方法。这样做的目的是为了此类不能被实例化。
interface
接口是可以多继承的,不能使用private和protected修饰接口。
常量:接口中的属性是常量,即使定义时不添加public static final修饰符,系统也会自动加上。
方法:接口的方法只能是抽象方法,总是使用,即使定义时不添加public abstract修饰符,系统也会自动加上。
extends
继承。子类只能继承父类所有非私有的成员。
implements
实现接口中定义的抽象方法。