JAVA关键字理解

各种关键字总是弄混,划一根线来梳理一下它们之间的关系~

前言

关键字,是语言的肢体,利用关键字才能表现出不同的动作,进而真正实现功能。

不得不说任何一种计算机语言都会从数据类型开始讲起。当基本数据类型不足以满足当下需求时,就会出现数组等各种类型,即引用数据类型。
【所以会有用于定义数据类型的关键字】

实现功能时使用简单的逻辑,条件 循环等
【所以会有用于定义流程控制的关键字】

实现上述两个功能后,基本的功能都是可以实现的。但在解决不同的问题、面对不同的情境时,总会出来更多省时省力的方法。针对这些思路抽象出更方便的实现模式。在JAVA的世界里,一切皆对象,不严谨地说,类包含了一切(毕竟是对象的模板)。
就会有【用于定义建立实例及引用实例,判断实例的关键字】

制造出不同的对象解决不同的问题,面向对象的三大特征必不可少:封装、继承和多态。
暴露在外边的时候,就会有【用于定义访问权限修饰符的关键字】

继承的时候,就会有有的希望被继承,有的是父类的特有属性,有的被抽象到一定程度。
就会有【用于定义类、函数、变量修饰符的关键字】、【用于定义类与类之间关系的关键字】

何时何地应急情况 不可控情况,always has a plan B。
异常处理必须存在,所以有【用于异常处理的关键字】

介于JAVA的管理模式 project module package class,一定会有【用于包的关键字】

做事情总要滴水不漏啊,所以一定会有不在这些大流程范围内的【其他关键字】

万一随着场景的多样化又出来新的门类呢?所有事情都是在迭代中不断完善进步的!

用于定义数据类型的关键字

byte short int long float double char boolean,
class interface enum,
void
注意啊,引用数据类型包括类,接口,数组,枚举,注解。String 也是类哦。

用于定义流程控制的关键字

if else switch case default
for while do break continue return

用于定义建立实例及引用实例,判断实例的关键字

new this super instanceof

用于定义访问权限修饰符的关键字

public protected private

修饰符 本类 本包 其他包子类 其他包非子类
public
protected √(本包子类非子类都可见) √(其他包仅限于子类可见) ×
缺省 √(本包子类非子类都可见) × ×
private × × ×

public 和 default

可以修饰类、成员变量、成员方法、构造方法。

protected 和 private

可以修饰成员变量、成员方法、构造方法,不能修饰类(这里指的是外部类)
那么内部类
参考链接:https://blog.csdn.net/mashaokang1314/article/details/83111727
【写了好多啊,值得我再写一篇整理参考了。】
跳转链接:下一篇。

用于定义类、函数(方法)、变量(成员)修饰符的关键字

static final abstract

static

修饰成员变量和方法,不能修饰类。
因为它本身就是来表示属性和方法与类的绑定关系的。与和对象绑定的属性和方法进行区分。static修饰的方法或变量不需要依赖对象进行访问,只要类被加载了,就可以通过类名去访问。

因为主要和加载这块相关,所以修饰代码块 -- 在变量的初始化顺序那里也有一定的应用。

静态变量

随类加载,只有一次。只能修饰成员变量,不能修饰局部变量。

静态方法

静态方法不依赖对象就可以访问,所以不构建对象,没有this。所以静态方法中不能访问类的非静态成员变量和非静态方法。【必须要一起加载了才能实现,我加载 你不加载 我们没法合作。】
如果想在不创建对象的情况下调用某个方法,就可以将方法设置为static。

静态代码块

很多时候会将一些只需要进行一次的初始化操作放在static代码块中进行。
静态初始化块可以置于类中的任何地方,类中可以有多个静态初始化块。在类初次被加载时,会按照静态初始化块的顺序来执行每个块,并且只会执行一次。

mian方法加载前在干什么

JAVA以类为单位执行,找到main函数入口开始执行(非单元测试情况下)。
先加载类(使用类加载器搜索类的二进制代码,然后加载),链接类(验证 准备 解析),初始化类(静态变量的初始化和静态代码块的初始化),调用main方法。

“初始化包括静态变量的初始化和静态代码块的初始化。初始化是按文本顺序进行。如果 Test 类可以被初始化,其直接父类需要先被初始化了,而如果直接父类可以被初始化,直接父类的直接父类需要先被初始化了,以此递推。Object 类没有父类,所以 Object 类初始化后,递推结束。在初始化直接父类的时候,如果直接父类还没有被加载,则需要先加载、链接、初始化直接父类。所以,在初始化一个类阶段,有可能会抛出加载错误、链接错误、初始化错误。”

final

修饰成员变量和方法,类。
final表示最终,已经终结,意味着不能延续。
修饰成员变量,这个变量不能更改,我拿到的是什么 什么就不能更改,我拿到的就是常量。基本数据类型值不能改,引用数据类型地址不能改。
修饰局部变量,由方法传入的参数来完成初始化,不能被赋值。
修饰类,这个类不能被继承。
修饰方法,这个方法不能被重写。

abstract

修饰成员方法和类
参考链接:https://blog.csdn.net/weixin_40096176/article/details/79094991

抽象类

不能创建实例的类,是高度抽象的“模板”,主要是用来继承的,因此不能用final修饰。有没有抽象方法不重要,主要是为了不产生对象。
但有抽象方法的一定是抽象类,重写也要全部重写才能不是模板。

抽象方法

没有方法体,主要是用来给别人继承的。所以不能用final修饰,不能用static修饰(随类加载且没有方法体 这样的做法无意义)。
同样也不能用private修饰,private修饰只能本类调用。
抽象方法声明时不需要{},规定没有方法体。
抽象类中也有构造方法,是供子类创建对象时初始化父类成员变量使用的。子类的构造方法中有默认的suoer方法或手动的super(实参列表),需要访问父类构造方法。

用于定义类与类之间关系的关键字

extends implements

继承

当子类对象被创建时,在堆中给对象申请内存时,要看子类和父类都声明了什么实例变量,这些变量否要分配内存。
子类对象调用方法时,编译器会先在子类模板中看该类是否有这个方法,如果没找到,就会看父类 父类的父类等,遵循从下往上找的顺序,找到了就停止,找到头没找到就会报编译错误。

多态

父类的引用类型变量指向了子类的对象 or 接口的引用类型指向了接口实现类的对象。
主要在调用方法时体现,成员变量没有多态性。

接口

避免单继承的局限,接口可以多实现。接口也会被编译成.class文件,但接口并不是类,而是另外一种引用数据类型。
“抽象类强调的是对事物的抽象,接口类强调的是对行为的抽象。”

接口的演变:
参考链接:https://blog.csdn.net/Falser101/article/details/109094920

  1. 接口是一种规范,规范里只有常量和规则。所以有公共的静态常量和公共的抽象方法。
  2. 一开始制定的规则总会有需要增删的地方(当然 一般是增)。如果增加一个抽象方法,那么所有接口的实现类都要去实现这个方法,否则就会报错。成本也太高了。有些类可能根本就用不到这个新方法,所以默认方法就加了进来。所有的实现类自动继承,想改的去改,不想改的无事发生。当接口的某个抽象方法,在很多实现类中的实现代码是一样的,此时将这个抽象方法设计为默认方法更为合适,那么实现类就可以选择重写,也可以选择不重写。所有一公共的默认方法。【所以这里会存在多继承冲突问题,如果继承的多个接口都存在相同的默认方法,继承的到底是哪一个呢?】
  3. 公共的静态方法与公共的默认方法类似,只是不能被重写。
  4. 私有方法:将私有方法写在接口里,具有很高的安全性,不会被子类看到。接口中私有方法只能在接口内部的方法里面被调用。
    后边这三种情况一般开发(初期)的时候用不到。

注:默认方法冲突问题
(1)类优先原则:当一个类既继承一个父类又实现若干个接口且父类中的成员方法与接口中的抽象方法重名时,子类就近选择执行父类的成员方法。
(2)当一个类同时实现了多个父接口,而多个父接口中包含方法签名相同的默认方法时,选项1:直接重写;选项2:选择保留其中一个,通过“接口名.super.方法名"的方法选择保留哪个接口的默认方法。
(3)当一个子接口同时继承了多个接口,而多个父接口中包含方法签名相同的默认方法时,直接重写吧。
子接口重写默认方法时,default 关键字可以保留。子类重写默认方法时,default 关键字不可以保留。

注:常量冲突问题
• 当子类继承父类又实现父接口,而父类中存在与父接口常量同名的成员变量,并且该成员变量名在子类中仍然可见。
• 当子类同时实现多个接口,而多个接口存在相同同名常量。
此时在子类中想要引用父类或父接口的同名的常量或成员变量时,就会有冲突问题。写清楚要调谁的就可以了。

用于异常处理的关键字

try catch finally throw throws

用于包的关键字

package import

其他修饰符关键字

native strictfp transient volatile assert

posted @ 2023-08-15 09:46  芋圆院长  阅读(10)  评论(0编辑  收藏  举报