【Java基础09】类、枚举和接口

1. 包

1.1 什么是包

  • 包主要是分门别类的来管理类,类似于文件夹。
  • 建包语法:package 公司域名.技术名称,建议全部小写
  • 建包语句必须在第一行

1.2 导包

  • 相同包下类可以直接访问,不通包下可以通过导包引用类。
  • 如果需要导相同类,在类上只能导入一个包路径,类中如果需要再引用相同类需要使用全路径名:包名.类名();
  • 格式:import 包名.类名 / import 包名.类名

2. 权限修饰符

权限修饰符是来修饰成员访问的范围,权限修饰符可以修饰成员变量,构造器,方法和内部类。

权限修饰符访问范围如下:

修饰符 同一类 同一包中其他类 不同包下子类 不同包下无关类
private
缺省
protected
public

3. final和常量

3.1 fianl

fianl表示最终的,可以修饰变量,方法和类

  • 修饰变量:该变量仅只能赋值一次
  • 修饰方法:该方法为最终方法,不可以被重写
  • 修饰类:该类为最终类,不能被继承

注意事项:
修饰基础类型:被第一次赋值后不能被改变。
修饰引用类型:对象引用地址不能被改变,但地址对象内部信息可以修改。

示例:

public class FinalTest {
    public static final int num = 10;

    public static final Dog dog = new Dog("二哈", 10);

    public static void main(String[] args) {

        System.out.println(num);
        System.out.println(dog.getName());
        // 程序报错
        // num = 20;

        dog.setName("三哈");
        System.out.println(dog.getName());
    }
}

3.2 常量

  1. 常量是使用public static final修饰的变量,必须初始化值并且在执行过程中不能修改值。
  2. 常量常用于文件配合,提高代码可读性,便于后期维护。
  3. 常量命名规范:单词名称大写,多个单词之间使用下划线连接

执行原理:

在编译过程进行替换,会把所有常量替换成字面量。
替换成字面量提高执行的效率。

4. 枚举,接口和抽象类

4.1 枚举(enum)

枚举是java的一种特殊类型,是为了做信息的标志和分类

格式:

修饰符 enum 枚举类型 {
    ...
}

示例:

public enum Direction {
    UP("向上", 1),
    DOWN("向下", 2),
    LEFT("向左", 3),
    RIGHT("向右", 4);

    private String name;
    private int flag;

    private Direction(String name, int flag) {
        this.name = name;
        this.flag = flag;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getFlag() {
        return flag;
    }

    public void setFlag(int flag) {
        this.flag = flag;
    }
}

枚举的特征:

  1. 枚举类都是继承java.lang.Enum
  2. 枚举类是最终类,不可以被继承
  3. 构造器都是私有,不能被实例化
  4. 枚举类第一行默认都是写枚举类对象的名称

4.2 接口(interface)

java中的接口是一种规范,类似于生活当中的接口。比如现在市面上的Type-C充电口,这就是一种规范,大家都按照这样设计,那样的话就可以通用。约束了一致的内容也开放了自定义实现。

4.2.1 定义格式

修饰符 interface 类名 {
    ...
}

4.2.2 特点

  • JDK8前内部只能有抽象方法和常量(下面介绍)
  • 接口不能实例化
  • 接口中的所有成员都是public,默认是的写不写都是

4.2.3 接口使用(implements)

格式:
修饰符 class 类名 implements 接口类名1、接口类名2...{

    ...

}

  • 接口是用来被实现的实现接口的类被称之为实现类,也可以理解为子类,使用关键字implements
  • 接口可以被单实现,也可以被多实现
  • 一个类实现接口必须重写所有抽象方法,否则实现类为抽象类
  • 继承与实现:①类只能单继承 ②类可以多实现 ③接口之间可以实现多继承

4.2.4 JDK8后接口新规范

当接口被定义下来后,需要很多子类来实现。后期扩展维护时,需要添加新抽象方法,这时所有实现类必须都要实现,否则程序编译失败。这样导致出现很多不必要工作量。JDK8后新增了新规范。
  1. 默认方法

    方法定义格式类似类成员方法,修饰符必须是default。该方法需要接口实现类来调用。

示例:

public interface Interface1 {

    void show();

    default int add(int x, int y) {
        return x + y;
    }

    default int addNum(int x, int y) {
        return add(x, y);
    }

}
public class InterfaceImpl implements Interface1 {
    @Override
    public void show() {
        System.out.println("实现了Interface1的show方法");
        int a = addNum(1, 2);
        System.out.println("调用抽象类默认方法:" + a);
    }

    public static void main(String[] args) {
        InterfaceImpl anInterface = new InterfaceImpl();
        anInterface.show();
    }
}
  1. 静态方法
    静态方法是用public(默认修饰符)修饰,方法需要添加static。接口静态方法必须用接口本身进行调用。
// 接口方法,写在Interface1接口中
static double getPI() {
   return 3.14;
}

// 执行接口静态方法
Interface1.getPI();
  1. 私有方法(jdk1.9后)
    方法必须使用private修饰,只能在本类被默认和私有方法调用

示例:

private void go(){
    System.out.println("开始执行接口私有方法");
}

4.2.5 注意事项

  • 接口不能实例化对象
  • 一个类可以实现多个接口,多个接口中的静态方法不冲突
  • 一个类继承父类同时实现多个接口,如果接口和父类出现同名方法,默认使用父类
  • 一个类单继承多实现

4.3 抽象类(abstract)

在java中abstract是抽象的意思,如果一个类中有不确定的方法,需要不同的子类来实现,则可以用abstract创建抽象类,只需定义方法名,不需要具体实现。abstract关键词可以修饰类和方法。

// 抽象类格式
修饰符 abstract 类名 {
}

// 抽象方法
修饰符 abstract 返回类型 方法名(形参列表...);
// 示例
public abstract class AbstractTest {
    public abstract void show();
}

抽象类的特征和注意事项:

  1. 抽象类不能进行实例化
  2. 类的成员抽象类都具备
  3. 抽象类不一定存在抽象方法,存在抽象方法的类一定是抽象类
  4. 继承抽象类的子类一定重写抽象方法,否则这个类也是抽象类
  5. abstract不能修饰成员变量、构造器和代码块

使用场景:
可以把抽象方法看成是一个模板,当大部分功能都相同,但是只有个别功能独特。这时就可以使用抽象类,让使用者继承抽象类重写方法。

抽象类的优势:

  • 提高代码的复用性
  • 需要实现的方法定义成抽象法,使使用者只需要关心要实现的功能
    • *

本章结束,用于个人学习和小白入门,大佬勿喷!希望大家多多点赞收藏支撑支撑!

源码 【GitHub】 【码云】

你可能感兴趣的:(java)