Java基础自学第三期——接口

本文深入讲解了Java中的接口概念,包括接口的使用、实现类以及多态的应用。同时,介绍了static和final关键字的作用,如静态域和静态方法的特性,并探讨了抽象类与接口的区别。最后,讨论了final关键字在定义不可变变量和防止方法覆盖中的用途。
摘要由CSDN通过智能技术生成

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修饰的变量必须初始化。

往期内容:

第一期——类与继承
第二期——反射与数组
第四期——内部类与lambda
第五期——异常
第六期——集合

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值