前端开发如何更好的避免样式冲突?级联层(CSS@layer)

news2025/2/25 2:23:05

作者:vivo 互联网前端团队 - Zhang Jiqi

本文主要讲述了CSS中的级联层(CSS@layer),讨论了级联以及级联层的创建、嵌套、排序和浏览器支持情况。级联层可以用于避免样式冲突,提高代码可读性和可维护性。

一、什么是级联层(Cascade Layers)?

1.1 级联层的官方定义

我们参看Cascading and Inheritance Level 5(13 January 2022) 中6.4节所述:

级联层提供了一种结构化的方式来组织和平衡单个起源中的问题。单个级联层内的规则级联在一起,不与层外的样式规则交错。

开发者可以创建层来表现元素默认值、第三方库、主题、组件、覆盖和其他样式问题,并且能够以显式方式重新排序层级,而无需更改每个层内的选择器或特异性,或依赖源顺序来解决跨层的冲突。

单纯看官方定义和概括可能比较晦涩,下面我们会结合案例来说清楚。

1.2 级联层为了解决什么问题?

简而言之:级联层的出现就是为了使 CSS 开发者可以更简单直接地控制级联。

我们来假设日常开发中的一个场景,从场景去理解级联层在解决什么问题。

如下图:

我们原来的'display'文案是红色,当我们引入了一个第三方组件库,第三方库中有以下样式。

/* 开发者样式 */
  .item {
    color: red;
  }
 
/* 第三方库 */
  #app .item {
    color: green;
    border: 5px solid green;
    font-size: 1.3em;
    padding: 0.5em;
    width: 120px;
  }

就会导致'display'文案变成绿色。

我们想要将'display'文案的颜色由绿色改成红色一般的手段是增加选择器特异性(优先级)。比如在开发页面中对开发者样式进行修改:

/* 开发者样式 */
  #app div.item {
    color: red;
  }
 /* 第三方库 */
  #app .item {
    color: green;
    border: 5px solid green;
    font-size: 1.3em;
    padding: 0.5em;
    width: 120px;
  }

或者借助级联中出场顺序对优先级的影响在用户页面中重写

 /* 第三方库 */
  #app .item {
    color: green;
    border: 5px solid green;
    font-size: 1.3em;
    padding: 0.5em;
    width: 120px;
  }
 /* 开发者样式 */
  #app .item {
    color: red;
  }

 效果如下:

再举个例子:

比如有可能第三方组件写了

a { color: blue; }

那项目开发中由于引入这个第三方组件 就会导致样式污染,因为第三方库的样式往往都在项目设置的通用样式比如common.css后加载。

如果后面想在代码中覆盖某些属性,使用高特异性选择器的语句就可能会导致问题。然后因为有问题就会选择更高特异性的择器的语句或使用!important,这会使代码变得冗长也可能会带来副作用。低特异性选择器的语句很容易被后面出现在代码中的语句覆盖。在自己的代码之后加载第三方 CSS 时特别会出现这种问题。

所以级联层就是为了解决以上场景出现的,级联层在级联中的的位置是在内联样式和选择器特异性之间。当有些css声明就是设置要低优先级且不受选择器特异性影响那么使用级联层再合适不过。

运用级联层解决第一个日常开发场景痛点的css代码如下:

/* 排序层 */
@layer reset, lib;
/* 通用样式 */
@layer reset {
  #app .item {
    color: black;
    width: 100px;
    padding: 1em;
  }
}
/* 第三方库样式 */
/*我们将第三方库的样式全部放到lib层*/
/*这里一般使用@import导入的方式*/
/*为了示例简单我们简化了操作*/

@layer lib {
  #app .item {
    color: green;
    border: 5px solid green;
    font-size: 1.3em;
    width: 130px;
  }
}
/* 开发者样式 */
.item {
  color: red;
}

为了知道为什么上面的css代码能解决冲突问题,更好地理解级联层的作用,理解一些现象背后的根因,了解级联层和级联的关系,我们继续往下看。

二、理解级联层的前提——级联(cascade)

2.1 什么是级联?

CSS中有两个重要的基础规则,一个是继承,一个是级联。

继承

指的是类似 color,font-family,font-size,line-height 等属性父元素设置后,子元素会继承的特性。

级联

可以简单理解为是CSS 用来解决要应用于元素的具体样式的算法。也就是基于一些优先级排序输出给给定元素上属性值一个级联值。级联值是级联的结果。

2.2 当前级联的排序标准

我们参看Cascading and Inheritance Level 5(13 January 2022) 中6.1节,

相比于Cascading and Inheritance Level 4(14 January 2016) 中的定义有明显变化。

最重要的变化就是增加了级联层。由此级联排序变成:

  1. 起源和重要性(Origin and Importance)

  2. 上下文(Context)

  3. 样式属性(Element-Attached Styles)

  4. 层(Layers)

  5. 特异性(Specificity)

  6. 出场顺序(又名源代码顺序)(Order of Appearance)

浏览器在确定最终元素样式呈现的时候,会依据这些准则按照优先权从高到低排序,并且会一个一个的检查,直到确定最终样式。

2.3 级联起源(Cascading Origins)

2.3.1 三个核心起源

css中每个样式规则有三个核心起源,它决定了它进入级联的位置,理解起源优先级是理解级联的关键。

  • 用户代理来源(浏览器内置样式)

  • 用户来源(浏览器的用户设置 )

  • 作者来源(Web开发者)

2.3.2 起源的优先级

Css声明的起源取决于它来自哪里,重要性在于它是否用!important声明。

各种起源的优先级按降序排列:

  1. 过渡

  2. 重要的用户代理

  3. 重要用户

  4. 重要作者

  5. 动画

  6. 普通作者

  7. 普通用户

  8. 普通用户代理

越靠前来源的声明优先级越高。过渡和动画我们可以暂时忽略。

2.4 熟悉又陌生的 !important

通常作为开发者,!important会被我们视为一种增加特异性的方法,用以覆盖内联样式或特异性较高的选择器。

但是!important设计出来的初衷是作为整体级联中的一个特性,来平衡开发者、用户设置和浏览器内置之间对css优先级的影响能力。

默认情况下三者的优先级是:作者来源> 用户来源>用户代理来源(可以参看上文起源优先级中6-8的排序)。但是当css声明添加!important之后会使它们的优先顺序颠倒(参看上文起源优先级中2-4的排序)。

如果站在浏览器和用户的角度看!important提供了在必要时重获优先级控制权的能力,而非只是简单的增加特异性。

举个例子:

浏览器默认样式表包含我们开发者无法覆盖的重要样式。

浏览器对具有'hidden'类型的input输入框设置了默认的展示属性并且将其声明为重要。

input[type=hidden i] { display: none !important; }

看下面两张图例:

第一张可以看出我们对具有'hidden'类型的input输入框的展示属性设置成了显示并且声明为重要

第二张是样式最终计算结果:隐藏

从上面的浏览器表现可以看到我们作为开发者在作者样式表中设置的规则没能覆盖用户代理样式表中的相同规则。

这验证了上面说的:在级联中!important会颠倒三大核心起源默认优先顺序

验证的过程中还发现了一个chrome控制台这边的bug,看上面的第一张图例:没生效的规则不划删除线,生效的反而划删除线了。

再看一个官方文档的例子加强一下理解:

图片来源:w3.org

font-size的值最终是‘12pt ’

因为作者样式表中添加!important的规则优先权高于用户样式表中普通规则。

text-indent的值最终是‘1em’

因为虽然两个样式表都标注了!important,但是标注!important用户声明优先级大于标注!important作者声明。

2.5 一张图带你理解级联

下图可以帮助我们直观的理解级联以及级联层在级联中的位置:

 图片来源: css-tricks

我们会发现平时操作最多的选择器特异性(selector specificity)只是级联中的一小部分。也轻松地理解了为什么内联样式优先级天然高。同时我们会发现!important在级联中有特殊地位。他穿插在级联规则的各个阶段并能颠倒优先级。

三、级联层(CSS@layer) 使用探索

3.1 @layer 是什么?

我们来看MDN上的定义:

The @layer CSS at-rule is used to declare a cascade layer and can also be used to define the order of precedence in case of multiple cascade layers.

也就是说 @layer 这个at-rule(AT规则) 用于声明级联层(cascade layer),也能用于定义多个级联层的优先级。

At-rules 是什么?

At-rules是指导 CSS 如何表现的CSS 语句。它们以 at 符号 ' @' ( U+0040 COMMERCIAL AT) 开头,后跟一个标识符,包括下一个分号 ' ;' ( U+003B SEMICOLON) 或下一个CSS 块之前的所有内容。

我们开发常见的at-rule有@charset、@media、@font-face 、@keyframes 等。

3.2 @layer的句法规则

@layer的句法如下:

@layer layer-name {rules}
@layer layer-name;
@layer layer-name, layer-name, layer-name;
@layer {rules}

3.3 如何创建级联层

可以通过多种方式创建级联层。

第一种方法是:创建命名的级联层,其中包含该层的 CSS 规则,如下所示:

@layer green {
  .item {
    color: green;
    border: 5px solid green;
    font-size: 1.3em;
    padding: 0.5em;
    width: 120px;
  }
}
 
@layer special {
  .item {
    color: rebeccapurple;
  }
}

第二种方法是:创建一个命名的级联层而不分配任何样式。这可以是单层,如下所示:

@layer green;

可以一次定义多个层,如下:

@layer green, special

一次定义多个层有什么好处呢?

因为声明层的初始顺序决定了层的优先级。与声明一样,如果在多个层中找到声明,最后定义的层声明将最终生效。看下面代码:

@layer green,special;
 
@layer green {
  #app .item {
    color: green;
    border: 5px solid green;
    font-size: 1.3em;
    padding: 0.5em;
    width: 120px;
  }
}
@layer special {
  .item {
    color: rebeccapurple;
  }
}

效果如下图:

special层中item样式规则将被应用即使它的特异性低于 green层中的规则。这是因为一旦层顺序定义完成,就会忽略选择器特异性

同样也会忽略出现的顺序:

我们声明层名称并设置它们的顺序后,可以通过重新声明名称来将 CSS 规则添加到图层。然后将样式附加到层,并且层顺序不会更改。比如如下代码虽然@layer green重新声明了并在文件后方但是由于顺序一开始已经设置所以字体颜色还是紫色:

@layer green,special;
 
@layer special {
  .item {
    color: rebeccapurple;
  }
}
 
@layer green {
  .item {
    color: green;
    border: 5px solid green;
    font-size: 1.3em;
    padding: 0.5em;
    width: 120px;
  }
}

效果如下:

忽略选择器特异性和代码出现顺序可以让我们创建更简单的 CSS 选择器,并使代码优雅,因为不必确保选择器具有足够高的特异性来覆盖其他css规则,只需要确保它出现在后面的层中。

第三种方法是:创建一个没有名称的级联层。例如:

@layer {
  .item {
    color: black;
  }
}

这将创建一个匿名级联层,该层功能与命名层相同。但是使用匿名层有如下缺点:

  1. 可读性较差:匿名层没有名称,会导致样式表不易阅读和理解。特别是在大型项目中,可能会出现样式不断增加,难以跟踪和管理的问题。

  2. 难以扩展:如果稍后想要更改特定样式或组合,也会很难找到特定的代码块。

  3. 不可复用性:匿名层中的样式不能在其他地方重复使用或引用。这样会使样式表更难以管理和维护。

平时我们尽量避免使用匿名层。但当我们是样式库的作者,并想将某些css代码不被使用者修改可以借助匿名层做到这一点

第四种方法是:使用@import。CSS 原生支持 @import 导入其他 CSS 文件。

@import url(index.css) layer(index);

同时,也支持匿名引入,例如:

@import url(index.css) layer;

我们在使用@import时候需要放在除@charset之外的样式规则前,否则无法导入。

可能的第五种方式仍在讨论中:通过元素上的属性。请参阅[css-cascade] Provide an attribute for assigning ato a cascade layer #5853。

3.4 层的嵌套规则

图层可以嵌套。例如:

@layer base {
  p { max-width: 70ch; }
}
 
@layer framework {
  @layer base {
    p { margin-block: 0.75em; }
  }
 
  @layer theme {
    p { color: #222; }
  }
}

生成的层可以表示为一棵树:

1.base

  • framework

  • base

2.theme

或可以用扁平列表表示

  1. base

  2. framework.base

  3. framework.theme

要将样式附加到嵌套层,您需要使用以下全名来引用它:

@layer framework {
  @layer default {
     p { margin-block: 0.75em; }
  }
 
  @layer theme {
    p { color: #222; }
  }
}
 
@layer framework.theme {
  /* 这些样式会被添加到framework层里面的theme层 */
  blockquote { color: rebeccapurple; }
}

看效果:

3.5 层的排序规则

级联层按照它们声明的顺序排序。第一层优先级最低,最后一层优先级最高。但是,未分层的样式具有最高优先级:

/* 未分层 */a { color: green; }
@layer layer-1 { a { color: red; } }
@layer layer-2 { a { color: orange; } }
@layer layer-3 { a { color: yellow; } }

优先级顺序如下:

  1. 未分层样式

  2. layer-3

  3. layer-2

  4. layer-1

看下图示例:

层可以在一个地方被定义图层(以建立图层顺序),然后在任何地方添加样式

/* 定义在一个地方 */
@layer my-layer;
/* 其他样式*/
...
/* 在某个地方添加样式 */
@layer my-layer { a { color: red; } }

3.6 加上!important之后的排序规则

/* 未分层 */ a { color: green !important; }
@layer layer-1 { a { color: red !important; } }
@layer layer-2 { a { color: orange !important; } }
@layer layer-3 { a { color: yellow !important; } }

任何加上重要声明的样式都以相反的顺序应用

优先级顺序如下:

  1. !important layer-1

  2. !important layer-2

  3. !important layer-3

  4. !important 未分层样式

看下图示例:

这里我们看到对应规则在chrome浏览器的显示是正确的。但是在开发者控制台中的样式一栏规则显示有问题。应该是chrome浏览器开发者控制台的bug。

3.7 嵌套层的排序规则

@layer layer-1 { a { color: red; } }
@layer layer-2 { a { color: orange; } }
@layer layer-3 {
  @layer sub-layer-1 { a { color: yellow; } }
  @layer sub-layer-2 { a { color: green; } }
  /* 未嵌套 */ a { color: blue; }
}
/* 未分层 样式 */ a { color: black; }

优先级顺序如下:

  1. 未分层 样式

  2. layer-3

    -layer-3 未嵌套

    -layer-3 sub-layer-2

    -layer-3 sub-layer-1

  3. layer-2

  4. layer-1

3.8 媒体查询对层排序的影响

以下层顺序将取决于匹配的媒体条件

例如:

@media (min-width: 600px) {
   @layer layout {
     .item {
       font-size: x-large;
     }
   }
 }
 
@media (prefers-color-scheme: dark) {
  @layer theme {
     .item {
        color: red;
     }
   }
}

如果两个媒体查询的规则中匹配一个那么对应的级联层生效。如果两者都匹配,那么图层顺序将为layout, theme都生效。如果两个都不匹配则不定义层。下图是两者都匹配的场景。

四、现在就能使用级联层吗?

4.1 目前浏览器支持程度

 图片来源:developer.mozilla.org

目前所有现代浏览器均已经支持 @layer 规则。所有浏览器厂商都支持的特性未来一定比较实用。

4.2 W3C 鼓励可以作为日常使用

SS 的标准化流程由 W3C Cascading Style Sheets Working Group (CSSWG)——W3C层叠样式列表小组以及独立CSS专家组成。W3C 本身并不制定标准,而是作为一个论坛式的平台,接收来自小组成员的提交,并通过会议来商讨制定标准,所有的提交以及讨论都是公开透明的,可以在 W3C 网站上看到会议的记录,可以简单分为4个大阶段:

  • 工作草案( WD )

  • 候选人推荐( CR )

  • 提议的建议( PR )

  • W3C 推荐( REC )

下图可以帮助理解:

 图片来源:w3.org

W3C 通过状态码表示规范的成熟度。成熟度从低到高排序如下图。

 图片来源:w3.org

再看下图:包含layer概念的标准讨论已经到达CR阶段。

 图片来源:w3.org

W3C 鼓励从 CR阶段的标准 开始可以作为日常使用。

五、总结

最后,我们回到通过级联层如何解决“引入了一个第三方组件库导致样式覆盖“的问题上。

css代码如下:

/* 排序层 */
@layer reset, lib;
/* 通用样式 */
@layer reset {
  #app .item {
    color: black;
    width: 100px;
    padding: 1em;
  }
}
/* 第三方库样式 */
/*我们将第三方库的样式全部放到lib层,这里一般使用@import导入的方式,为了示例简单我们简化了操作*/
@layer lib {
  #app .item {
    color: green;
    border: 5px solid green;
    font-size: 1.3em;
    width: 130px;
  }
}
/* 开发者样式 */
.item {
  color: red;
}

我们将第三方库的样式全部放到lib层,将需要重置的一些样式放到reset层,自己开发的样式不放入层中(当然你也可以放入到一层然后排序在最后)。由此我们实现了样式的分层解决了第三方组件库导致样式覆盖的问题,而且做到开发者样式简单不冗长。

效果如下:

级联层(CSS@layer)已经历概念提出到到浏览器全面支持的阶段。也许在不久的将来大家都会普遍使用它,期望本文能给大家带来一定帮助。

参考资料:

  1. CSS Cascading and Inheritance Level 5

  2. A Complete Guide to CSS Cascade Layers

  3. The Future of CSS: Cascade Layers (CSS @layer)

  4. CSS必学基础:理解CSS中的级联规则

  5. 详解日后定会大规模使用的CSS @layer 规则

  6. W3C Process Document

  7. Cascade Layers Explainer

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/582715.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

选择交换机主要看哪些参数指标

交换机有几个性能指标您一定要知道哦,和海翎光电的小编一起温故而知新。 网络构成方式:接入层交换机、汇聚层交换机、核心层交换机 OST模型:第二层交换机、第三层交换机、第四层交换机……第七层交换机 交换机的可管理性:可管理…

电商分析必懂的指标体系,引流、转化、留存,一文带你搞懂

今天,我就来讲讲电商到底该重点关注哪些指标,又该拿这些指标来进行怎么样的分析。 一般来说,在运营模块,需要重点关注的是新用户的引流和转化,以及老用户的活跃、留存、回购、流失。 01 引流 简单来说,引…

【现实生活实际应用】【公交车换乘算法——算法用在公交车】【单源最短路-如何根据图意构建图,最重要】最优乘车【sstream输入】

问题出现了 其实我们构图的时候, 我们已经知道1 - 3 - 5 那么我们直接让1 连到 3 和 5 表示直达 如果出现另一路 4 7 3 6 则3最终连接的是 5 和 6 从1开始,先走到了 3 和 5 然后bfs宽搜到3(此时就表示换乘了,因为1直达的已经都遍历…

JavaEE进阶5/25(Spring 注解)

1.五大类注解详解(重点 1.Controller 控制器,用于业务逻辑层,来控制用户的行为。它用来检查用户参数的有效性。 当用户的参数有效的话会继续分发到服务层。controller可以理解为程序的安保系统 2.Service 服务层。归属服务层,调用…

【JavaSE】Java基础语法(二十九):Map集合

文章目录 1. Map集合概述和特点2. Map集合的基本功能3. Map集合的获取功能【应用】4. Map集合的遍历(方式1)5. Map集合的遍历(方式2)6. map四种遍历方式 1. Map集合概述和特点 Map集合概述 interface Map<K,V> K&#xff1a;键的类型&#xff1b;V&#xff1a;值的类型…

MySQL — 视图、存储过程、触发器

文章目录 视图/存储过程/存储函数/触发器一、视图1.1 语法1.1.1 创建视图1.1.2 查询1.1.3 修改1.1.4 删除1.1.5 对数据的操作 1.2 检查选项1.2.1 cascaded1.2.2 local 1.3 视图的更新1.4 视图的作用1.5 案例1.5.1 案例11.5.2 案例2 二、存储过程2.1 介绍2.2 基本语法2.3 变量2.…

【保姆级】拯救“爆红”C盘,轻松清出30G

目录 第一步 ​第二步 第三步 第四步 ​第五步&#xff08;可选&#xff09; 打开一个程序&#xff0c;发现等它启动好了咖啡都凉叻。。 访问个文件&#xff0c;都要转个圈圈。。不、转好几个圈圈⭕️⭕️⭕️⭕️⭕️⭕️⭕️ 更新、安装新软件时&#xff0c;提示“安装…

分布式网络通信框架(十二)——zookeeper简介与安装

简介 zookeeper&#xff08;后文简称zk&#xff09;提供功能有&#xff1a;服务注册中心、全局服务命名、以及分布式锁。 RPC服务会被发布到不同的服务器上&#xff0c;本项目zk的作用就是找到某一个RPC服务在哪一个服务器上&#xff0c;提供服务注册发现功能。 zk的数据如何…

Linux-0.11 入口函数main.c详解

Linux-0.11 入口函数main.c详解 模块简介 main.c大部分代码主要是对内核进行初始化&#xff0c;而main.c开始&#xff0c;就都是c语言编写的内核了。 函数详解 time_init static void time_init(void)该函数读取CMOS时钟信息作为系统的开机时间。 struct tm time;do {time…

携手高通,移远通信以全栈式车载产品实力重新定义汽车

5月25日至26日&#xff0c;2023高通汽车技术与合作峰会在苏州成功举办。 移远通信作为高通重要的长期战略合作伙伴&#xff0c;受邀参加此次峰会&#xff0c;并现场展示了支持5G/4G、C-V2X、算力、UWB、Wi-Fi、高精定位等领先技术的多款车规级模组、天线等产品&#xff0c;更有…

Three.js——六、模型对象/材质

模型对象/材质 三维向量 Vector3 与模型位置 该类表示的是一个三维向量&#xff08;3D vector&#xff09;。 一个三维向量表示的是一个有顺序的、三个为一组的数字组合&#xff08;标记为 x、y 和 z&#xff09;&#xff0c; 可被用来表示很多事物&#xff0c;例如&#xff…

Flutter(七)功能型组件

1.导航返回拦截&#xff08;WillPopScope&#xff09; 需求&#xff1a;再按一次退出应用 用户在1秒内点击两次返回按钮时&#xff0c;则退出&#xff1b;如果间隔超过1秒则不退出 import package:flutter/material.dart;class WillPopScopeTestRoute extends StatefulWidget…

建筑行业数字化转型,工程管理系统已成建筑行业转型的利器

建筑工程项目管理的困境 专业工种多、工作环境复杂&#xff0c;工期长&#xff0c;且整体工业化标准化程度较低。 进度难管控、项目沟通协作不畅、项目执行过程不透明、项目成本管控难、项目盈亏情况不清、项目难共享等。 什么是工程项目管理 工程项目管理指的是对工程项目…

茶润童心 以茶明礼

中国是茶的故乡&#xff0c;也是茶文化的发源地&#xff0c;茶文化也是中国文化的一部分。5月27日下午&#xff0c;8位武汉公益小天使来到中茶恩施硒茶全国运营中心开展少儿茶艺活动。 开场的自我介绍&#xff0c;公益小天使逐个进行自我介绍&#xff0c;喊着“好名字”互相加…

软件测试的一些关键点

软件测试的一些关键点 随着互联网的快速发展&#xff0c;软件已经成为了我们生活和工作中不可或缺的一部分。在软件开发过程中&#xff0c;一项重要的工作就是软件测试。软件测试是指对软件产品或系统进行验证和验证的过程。在软件测试中&#xff0c;需要注意以下关键点。 首先…

[转]Github进行fork后如何与原仓库同步

问题场景&#xff1a; 新公司要求所有的代码提交都要先通过自己的库提交到主repo上去&#xff0c;所以先在gitlab网页上fork出一个自己的库&#xff0c;在本地修改完代码后提交到远程自己库上&#xff0c;然后在gitlab网页上发起一个merge request请求&#xff0c;然后等待主r…

面试:webpack常用loader和plugin

Webpack简介 Webpack 是一个用于现代 JavaScript 应用程序的 静态模块打包工具。当 webpack 处理应用程序时&#xff0c;它会在内部从一个或多个入口点构建一个 依赖图(dependency graph)&#xff0c;然后将你项目中所需的每一个模块组合成一个或多个 bundles&#xff0c;它们均…

如何选择专业的低代码开发平台?为企业数字化转型保驾护航

在当今快节奏的商业环境中&#xff0c;软件开发已经成为任何组织的关键方面。然而&#xff0c;由于市场上有无数的软件开发平台&#xff0c;选择合适的平台可能是一项艰巨的任务。对于任何想要创建满足其业务需求的高质量应用程序的组织来说&#xff0c;选择正确的软件开发平台…

英国卡迪夫大学学生使用ChatGPT写论文拿到一等成绩

近日&#xff0c;BBC报道了一则新闻&#xff1a; 卡迪夫大学一名学生在期末考试中使用ChatGPT撰写了一篇论文&#xff0c;并获得了一等成绩&#xff0c;要知道这是英国大学中最高等级的成绩&#xff0c;而他的另一篇论文没有使用ChatGPT&#xff0c;只获得了二等一的成绩。 此…

1.6. 数组

数组是一种数据结构&#xff0c;用于存储相同类型的多个元素。在 Java 中&#xff0c;数组是一个对象&#xff0c;它具有一定数量的连续内存空间。数组中的每个元素都有一个索引&#xff0c;用于访问和操作元素。 1.6.1. 数组的声明与初始化 在 Java 中&#xff0c;可以使用以…