【Java 基础】关键字static、final概述、关键字sealed

一、概述

  • Java有两个非常重要的关键字static、final,static的关键字会被预先加载,并被所有该类的实例共享,而final则意味着 “最终”,类不可派生、方法不可被重写(覆盖)。

二、关键字

1、static

如果将域定义为static,每个类中只有一个这样的域。而每个对象对于所有实例域都有一根自己的拷贝。

  • 由static关键字修饰的语句都会最先被加载至内存中。
  • static将成员变量或方法存储进 方法区
  • 因为方法区能保证数据只存在一份,只会加载一次(类加载器加载类的时候才加载一次)。
  • static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念。

① 修饰代码块(静态代码块)

  • 作为静态代码块在类加载时,最先被加载。

  • 加载顺序:静态代码块 > 代码块 > 构造器(构造方法)

② 修饰方法(静态方法)

  • static方法(静态方法、类方法),由于静态方法不依赖于任何对象就可以直接访问。

  • 静态方法不依附于任何对象。

  • 在静态方法中不能访问类的非静态成员变量、非静态方法,因为非静态成员变量、非静态方法都必须依赖于具体的对象才能被调用。

③ 修饰内部类(静态内部类 / 静态嵌套类)

Nested classes are divided into two categories: static and non-static. Nested classes that are declared static are called static nested classes. Non-static nested classes are called inner classes.
(——转自Oracle官方)

根据官方说法可以看到,我们俗称的 “静态内部类” 的官方名称为 静态嵌套类

  • 字面上也可以看出来,静态内部类可以方便我们更好的使用外部类(对应“嵌套类”的概念,我们可以称之为“外壳类”)的静态变量,其本身与其他static修饰的关键字一样,不依附于外部类。

  • 用static修饰的内部类,称为“静态内部类”。

  • 静态内部类可直接使用外部类的静态变量、方法,无论相隔多少层,可直接使用名称调用。
    static

  • 只有静态内部类可以调用main方法,而普通的内部类则不可以。
    内部类 - main方法

④ 修饰成员变量(静态成员变量)

  • 被static修饰的成员变量和成员方法独立于该类的任何对象。

  • 它不依赖类特定的实例,被类的所有实例(对象)共享。

  • 只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。

  • 因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。

2、final

① 修饰基本类型

  • 当类基本数据类型被final修饰时作为常量,只能被赋值一次, 无法更改。
  • 常量一般以全大写命名。
final double PI = 3.1415926535;	//常量PI
  • 修饰方法参数也具有同样的效果。

② 修饰引用类型

  • 当final修饰引用时, 表示该引用只有1次指向对象的机会。
public class Car{}
public class Demo{
	final Car car = new Car();	//该引用只有1次指向对象的机会
	public void move(final Car car)
}
  • 当修饰方法参数也具有同样的效果。
    修饰方法参数

③ 修饰类

  • 当类被final修饰时, 则该类无法被继承(无法派生任何子类)。
public final class A{
	//该类不可被继承(无法派生任何子类)
}

④ 修饰方法

  • 当方法被final修饰时, 则该方法在子类中不能被重写。
public final void justDoIt(){
     //该方法在子类中不能被重写
}

3、sealed

  • 密封Sealed表示的概念是可以扩展一个类,但只能通过已知的子类型列表进行扩展,而不能通过其他任何扩展。

  • 其他语言可能对功能的看法有所不同,在Java中,应将其视为代表 几乎最终 类的功能。

  • 从Java 16开始,允许使用 sealed 修饰class,并通过permits明确写出能够从该class继承的子类名称。

  • sealed是在JDK 15 版本 中 尚未允许使用 的关键字,在 JDK 16 版本中首次允许使用。其次,使用第二个新关键字,permits可使开发人员列出此密封类型的允许子类。

  • 例如,定义一个Car类:

public sealed class Car permits MiniCar, SmallCar, Bigcar{
    ...
}
  • 上述Car 类就是一个sealed类,它只允许指定的3个类继承它。如果这样写是没问题的:
public final class MiniCarextends Car {...}
  • 因为Rect出现在Shape的permits列表中。
  • 但是,如果定义一个Ellipse就会报错:
public final class Train extends Car {...}
// Compile error: class is not allowed to extend sealed class: Car 
// 编译错误:类不允许继承于密封sealed类car
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值