Java基础自学第三期
本文我将主要介绍一下接口,static和final关键字。
接口
接口的介绍
在日常生活中,我们经常使用接口:插座的插口,电脑的USB接口,电缆的接口等。我们使用接口的时候,从来不会去考虑他的内部构造是怎样的,只管这个接口能够给我们提供怎样的功能。
在Java中,接口与类相似,但又不同于类,而是对类的一组需求描述,这些类要遵从接口描述的统一格式进行定义。简单点说,接口中也会有自己的成员变量,成员方法。接口没有构造方法,所以无法直接实例化一个接口。
既然无法直接实例化一个接口,这时候Java给我们提供了一个implement关键字,使得一个类可以实现一个接口,这个类被称为实现类。
当然,既然无法实例化一个接口,那么接口中的方法内容也就没有了存在的意义,所以接口中的方法都是抽象方法,由实现类及其子类来重写。
注意:
接口中的方法自动被设置为public abstract类型
接口中的域自动被设置为public static final类型
接口的使用
接口不是类,尤其不能使用new实例化一个接口,需要编写以一个类来实现接口。
public interface Eat {
public abstract void eat();
} //定义一个接口
public class Person implements Eat{
@Override //重写方法的标志
public void eat()
{
System.out.println("吃饭中");
}
}
Person类就是Eat接口的一个实现类,这时候我们可以通过new创建一个实现类对象来调用接口中的方法
Person p = new Person();
p.eat();
注意:
一个类只能继承一个类,但可以实现多个接口
接口可以继承多个接口,使用extends关键字
实现类如果没有子类,则必须重写接口的所有方法
如果实现类只重写了接口的部分方法,则该类为抽象类,其余的方法需要由其子类重写
接口中不能有静态方法
接口中的成员变量必须赋初值,否则报错
抽象类与接口
抽象类与接口类似,不可以直接new创建对象,只能作为超类,需要一个实现类来继承抽象类,并重写其中所有的方法。
既然抽象类比接口自由度这么高,为什么Java还有提供接口使用呢?因为一个类只能继承一个类,但可以实现多个接口,这样极大地丰富了类的灵活性。
多态的使用
在前面我们总结了多态的好处,这里我们也可以使用多态。
Eat e = new Person(); //左边是声明接口类型变量,右边是实现类的实例化
e.eat(); //e可以调用Person类的所有方法
使用多态写法,可以清晰地看到类实现了哪个接口。
静态域与静态方法
如果在一个类中,将成员变量定义为static,则每个对象都会默认生成这样一个实例域。例如:
public abstract class Employee
{
public static int id = 0;
}
这样每一个Employee对象中都会有一个id=0的实例域。即使没有对象,这个id域也是存在的。如果静态域被修改,则其他地方使用的该静态域都被修改为相同的值。
静态方法与静态域相同,是在类实例化之前就已经加载入内存了,所以不需要通过对象调用,可以直接通过类名来调用。
注意:静态域与静态方法可以通过类名或者对象来调用。
public class Employee{
public static int id = 0;
public Employee() {
}
public static void method()
{
System.out.println("方法");
}
}
Employee e = new Employee();
System.out.println(Employee.id);
System.out.println(e.id);
e.method();
Employee.method();
区分静态域与实例域
静态域:每一个类所存在的域
实例域:每一个对象所存在的域
即静态域是依赖于类而存在,实例域是依赖于对象而存在。
如果将域定义为static,那么每个类中只有一个这样的域。而每一个对象对于所有的实例域却都有自己的一份拷贝。例如,假定需要给每一个雇员赋予唯一的表示码。这里给Employee类添加一个实例域id和一个静态域nextld:
class Employee
{
private int id;
private static int nextId=1;
}
现在,每一个雇员对象都有一个自己的id域,但这个类的所有实例将共享一个nextId域,换句话说,如果有1000个Employee类的对象,则有1000个实例域id,但是只有一个静态域nextId,即使没有一个雇员对象,静态域nextld也存在,其属于类,而不属于任何独立的对象。
final关键字
我们在日常写程序的过程中要养成定义了变量就要初始化的好习惯。但Java规定了如果变量没有赋值则会默认初值。
int t; //默认为0
String name; //默认为null
当然我们可以给变量和方法添加final关键字。final在英文中表示 “最终” 的意思,也就是不可以被修改。在Java中final类似于定义了一个常量或者是不可以被覆盖重写的方法。既然被final修饰的方法无法被覆盖重写,那么抽象方法就不可以被final修饰。需要注意的是,被final修饰的变量必须初始化。