1. 包 1.1 什么是包
- 包主要是分门别类的来管理类,类似于文件夹。
- 建包语法:package 公司域名.技术名称,建议全部小写
- 建包语句必须在第一行
- 相同包下类可以直接访问,不通包下可以通过导包引用类。
- 如果需要导相同类,在类上只能导入一个包路径,类中如果需要再引用相同类需要使用全路径名:包名.类名();
- 格式:import 包名.类名 / import 包名.类名
权限修饰符访问范围如下:
修饰符 | 同一类 | 同一包中其他类 | 不同包下子类 | 不同包下无关类 |
---|---|---|---|---|
private | √ | |||
缺省 | √ | √ | ||
protected | √ | √ | √ | |
public | √ | √ | √ | √ |
- 修饰变量:该变量仅只能赋值一次
- 修饰方法:该方法为最终方法,不可以被重写
- 修饰类:该类为最终类,不能被继承
修饰基础类型:被第一次赋值后不能被改变。
修饰引用类型:对象引用地址不能被改变,但地址对象内部信息可以修改。
示例:
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 常量
- 常量是使用public static final修饰的变量,必须初始化值并且在执行过程中不能修改值。
- 常量常用于文件配合,提高代码可读性,便于后期维护。
- 常量命名规范:单词名称大写,多个单词之间使用下划线连接
在编译过程进行替换,会把所有常量替换成字面量。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;
}
}
枚举的特征:4.2 接口(interface) java中的接口是一种规范,类似于生活当中的接口。比如现在市面上的Type-C充电口,这就是一种规范,大家都按照这样设计,那样的话就可以通用。约束了一致的内容也开放了自定义实现。
- 枚举类都是继承java.lang.Enum
- 枚举类是最终类,不可以被继承
- 构造器都是私有,不能被实例化
- 枚举类第一行默认都是写枚举类对象的名称
4.2.1 定义格式
修饰符 interface 类名 {
...
}
4.2.2 特点
- JDK8前内部只能有抽象方法和常量(下面介绍)
- 接口不能实例化
- 接口中的所有成员都是public,默认是的写不写都是
格式:
修饰符 class 类名 implements 接口类名1、接口类名2...{
...
}
- 接口是用来被实现的实现接口的类被称之为实现类,也可以理解为子类,使用关键字implements
- 接口可以被单实现,也可以被多实现
- 一个类实现接口必须重写所有抽象方法,否则实现类为抽象类
- 继承与实现:①类只能单继承 ②类可以多实现 ③接口之间可以实现多继承
当接口被定义下来后,需要很多子类来实现。后期扩展维护时,需要添加新抽象方法,这时所有实现类必须都要实现,否则程序编译失败。这样导致出现很多不必要工作量。JDK8后新增了新规范。
- 默认方法
方法定义格式类似类成员方法,修饰符必须是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();
}
}
- 静态方法
静态方法是用public(默认修饰符)修饰,方法需要添加static。接口静态方法必须用接口本身进行调用。
// 接口方法,写在Interface1接口中
static double getPI() {
return 3.14;
}// 执行接口静态方法
Interface1.getPI();
- 私有方法(jdk1.9后)
方法必须使用private修饰,只能在本类被默认和私有方法调用
private void go(){
System.out.println("开始执行接口私有方法");
}
4.2.5 注意事项
- 接口不能实例化对象
- 一个类可以实现多个接口,多个接口中的静态方法不冲突
- 一个类继承父类同时实现多个接口,如果接口和父类出现同名方法,默认使用父类
- 一个类单继承多实现
// 抽象类格式
修饰符 abstract 类名 {
}// 抽象方法
修饰符 abstract 返回类型 方法名(形参列表...);
// 示例
public abstract class AbstractTest {
public abstract void show();
}
抽象类的特征和注意事项:【【Java基础09】类、枚举和接口】抽象类的优势:
使用场景:
- 抽象类不能进行实例化
- 类的成员抽象类都具备
- 抽象类不一定存在抽象方法,存在抽象方法的类一定是抽象类
- 继承抽象类的子类一定重写抽象方法,否则这个类也是抽象类
- abstract不能修饰成员变量、构造器和代码块
可以把抽象方法看成是一个模板,当大部分功能都相同,但是只有个别功能独特。这时就可以使用抽象类,让使用者继承抽象类重写方法。
- 提高代码的复用性
- 需要实现的方法定义成抽象法,使使用者只需要关心要实现的功能
-
- *
源码 【GitHub】 【码云】
推荐阅读
- Java|Java基础——数组
- 人工智能|干货!人体姿态估计与运动预测
- java简介|Java是什么(Java能用来干什么?)
- Java|规范的打印日志
- Linux|109 个实用 shell 脚本
- 程序员|【高级Java架构师系统学习】毕业一年萌新的Java大厂面经,最新整理
- Spring注解驱动第十讲--@Autowired使用
- SqlServer|sql server的UPDLOCK、HOLDLOCK试验
- jvm|【JVM】JVM08(java内存模型解析[JMM])
- 技术|为参加2021年蓝桥杯Java软件开发大学B组细心整理常见基础知识、搜索和常用算法解析例题(持续更新...)