Android筑基——Kotlin by 关键字详解
1.前言
Kotlin 中的 by
关键字在 Java 中是没有的,这使我对它感到非常陌生。
Kotlin 中为什么要新增 by
关键字呢?by
关键字在 Kotlin 中是如何使用的?
本文会介绍 by
关键字的使用分类,具体的示例,Kotlin 内置的 by
使用,希望能够帮助到大家。
2.正文
by
关键字的使用分为两种:类委托和委托属性。
2.1 类委托
现在有一个需求,统计向一个 HashSet
尝试添加元素的尝试次数,该怎么实现?
2.1.1 使用继承方式实现
简单,继承一个 HashSet
,创建一个变量,负责统计尝试添加元素的个数,代码如下:
class CountingSet1<T>: HashSet<T>() {var objectAdded = 0override fun add(element: T): Boolean {objectAdded++return super.add(element)}override fun addAll(elements: Collection<T>): Boolean {// 因为 super.addAll 内部调用了 add 方法,所以这里不必统计添加个数了。return super.addAll(elements)}
}fun main() {val cset = CountingSet1<Int>()cset.add(1)cset.addAll(listOf(2, 2, 3))println("${cset.objectAdded} objects were added, ${cset.size} remain")
}
/*
打印如下:
4 objects were added, 3 remain
*/
需求是满足了。
但是这样的实现,CountingSet1
和 HashSet
的具体实现是高度耦合的,也就是说,CountingSet1
严重依赖于 HashSet
类的实现细节。
这有什么问题吗?
当基类的实现被修改或者新的方法被添加进去时,可能改变之前进行继承时的类行为,从而导致子类的行为不符合预期。
当某个类是 final
类时,它是不可以被继承的,这时就不能采用继承的方式来复用它的代码了。
那我们该怎么办呢?
想一下,我们新建的类无非是想复用 HashSet
的功能,前面我们是采用继承的方式,除了采用继承的方式之外,我们还可以采用组合的方式。
实际上,在 《Java编程思想》中有写道:
由于继承在面向对象程序设计中如此重要,所以它经常被高度强调,于是程序员新手就会有这样的印象:处处都应该使用继承。这会导致难以使用并过分复杂的设计。实际上,在建立新类时,应该优先考虑组合,因为它更加简单灵活。如果采用这种方式,设计会变得更加清晰。
2.1.2 使用组合方式实现
使用组合方式实现如下:
class CountingSet2<T> : MutableSet<T> {private val innerSet = HashSet<T>()var objectAdded = 0override fun add(element: T): Boolean {objectAdded++return innerSet.add(element)}override fun addAll(elements: Collection<T>): Boolean {objectAdded += elements.sizereturn innerSet.addAll(elements)}override fun clear() {innerSet.clear()}override fun iterator(): MutableIterator<T> {return innerSet.iterator()}override fun remove(element: T): Boolean {return innerSet.remove(element)}override fun removeAll(elements: Collection<T>): Boolean {return innerSet.removeAll(elements)}override fun retainAll(elements: Collection<T>): Boolean {return innerSet.retainAll(elements)}override val size: Intget() = innerSet.sizeoverride fun contains(element: T): Boolean {return innerSet.contains(element)}override fun containsAll(elements: Collection<T>): Boolean {return innerSet.containsAll(elements)}override fun isEmpty(): Boolean {return innerSet.isEmpty()}
}fun main() {val cset = CountingSet2<Int>()cset.add(1)cset.addAll(listOf(2, 2, 3))println("${cset.objectAdded} objects were added, ${cset.size} remain")
}
/*
打印如下:
4 objects were added, 3 remain
*/
同样实现了需求。
可以看到,CountingSet2
实现了 MutableSet
接口,具体的实现是委托给了 innerSet
来完成的。
这有什么好处呢?
CountingSet2
与 HashSet
不再耦合了,它们都实现了 MutableSet
接口。
这种方式从代码设计上看确实好,但是却需要非常多的模板代码,这点很烦人啊。
2.1.3 使用类委托实现
现在就该 Kotlin 的类委托出场了,它可以解决需要写非常多的模板代码的问题。
class CountingSet3<T>(val innerSet: MutableSet<T> = HashSet<T>()
) : MutableSet<T> by innerSet {var objectAdded = 0override fun add(element: T): Boolean {objectAdded++return innerSet.add(element)}override fun addAll(elements: Collection<T>): Boolean {objectAdded += elements.sizereturn innerSet.addAll(elements)}
}fun main() {val cset = CountingSet3<Int>()cset.add(1)cset.addAll(listOf(2, 2, 3))println("${cset.objectAdded} objects were added, ${cset.size} remain")
}
/*
打印如下:
4 objects were added, 3 remain
*/
完美实现了需求。
Kotlin 是如何帮我们减少了模板代码了呢?
使用 Android Studio 的 Tools -> Kotlin -> Show Kotlin Bytecode,再点击 Decompile 按钮,查看对应的 Java 代码:
public final class CountingSet3 implements Set, KMutableSet {private int objectAdded;@NotNullprivate final Set innerSet;public final int getObjectAdded() {return this.objectAdded;}public final void setObjectAdded(int var1) {this.objectAdded = var1;}public boolean add(Object element) {int var10001 = this.objectAdded++;return this.innerSet.add(element);}public boolean addAll(@NotNull Collection elements) {Intrinsics.checkNotNullParameter(elements, "elements");this.objectAdded += elements.size();return this.innerSet.addAll(elements);}@NotNullpublic final Set getInnerSet() {return this.innerSet;}public CountingSet3(@NotNull Set innerSet) {Intrinsics.checkNotNullParameter(innerSet, "innerSet");super();this.innerSet = innerSet;}// $FF: synthetic methodpublic CountingSet3(Set var1, int var2, DefaultConstructorMarker var3) {if ((var2 & 1) != 0) {var1 = (Set)(new HashSet());}this(var1);}public CountingSet3() {this((Set)null, 1, (DefaultConstructorMarker)null);}public int getSize() {return this.innerSet.size();}// $FF: bridge methodpublic final int size() {return this.getSize();}public void clear() {this.innerSet.clear();}public boolean contains(Object element) {return this.innerSet.contains(element);}public boolean containsAll(@NotNull Collection elements) {Intrinsics.checkNotNullParameter(elements, "elements");return this.innerSet.containsAll(elements);}public boolean isEmpty() {return this.innerSet.isEmpty();}@NotNullpublic Iterator iterator() {return this.innerSet.iterator();}public boolean remove(Object element) {return this.innerSet.remove(element);}public boolean removeAll(@NotNull Collection elements) {Intrinsics.checkNotNullParameter(elements, "elements");return this.innerSet.removeAll(elements);}public boolean retainAll(@NotNull Collection elements) {Intrinsics.checkNotNullParameter(elements, "elements");return this.innerSet.retainAll(elements);}public Object[] toArray() {return CollectionToArray.toArray(this);}public Object[] toArray(Object[] var1) {return CollectionToArray.toArray(this, var1);}
}
这不就是 CountingSet2
的代码吗?
原来 Kotlin 的编译器默默地帮我们生成了这些模板代码,而仅仅要求我们通过声明并初始化一个 HashSet
类型的成员变量,并在类声明后添加 by innerSet
:
class CountingSet3<T>(val innerSet: MutableSet<T> = HashSet<T>()
) : MutableSet<T> by innerSet {
需要注意的是,
CountingSet3
必须实现一个接口,而不能继承于一个类;innerSet
的类型必须是CountingSet3
所实现接口的子类型;- 可以直接在
by
创建委托对象,如下所示:
但是,这样的话,在class CountingSet4<T>( ) : MutableSet<T> by HashSet<T>() { }
CountingSet4
类中无法获取到委托对象的引用了。
Kotlin 的类委托虽然看起来很简洁,但是它自身又有一些限制:类必须实现一个接口,委托类必须是类所实现接口的子类型。这是需要注意的。
同时,我们在实际开发中,要尽力去使用这种委托的思想,来使代码解耦,使代码更加清晰。这一点,比掌握 Kotlin 的类委托更加重要。
2.2 委托属性
委托属性是一个依赖于约定的功能,也是Kotlin 中最独特和最强大的功能之一。
本部分我们仍然是从一个小例子开始,展示一下委托属性的使用,作用;然后,会说明委托属性的一些特点以及其他使用。
需求:现在有一个简单的 Person
类:
class Person2 {var name: String = ""var lastname: String = ""
}
需要对 name
和 lastname
赋值时,做一些格式化工作:首字母大写其余字母小写,并统计格式化操作的次数,再获取 name
和 lastname
值的时候,把它们的值的长度拼接在值得后面返回。
2.2.1 仅仅完成需求的代码
这不难,代码实现如下:
class Person2 {var name: String = ""set(value) {field = value.lowercase().replaceFirstChar { it.uppercase() }updateCount++}get() {return field + "-" + field.length}var lastname: String = ""set(value) {field = value.lowercase().replaceFirstChar { it.uppercase() }updateCount++}get() {return field + "-" + field.length}var updateCount = 0
}fun main() {val person2 = Person2()person2.name = "peter"person2.lastname = "wang"println("name=${person2.name}")println("lastname=${person2.lastname}")println("updateCount=${person2.updateCount}")
}
/*
打印日志:
name=Peter-5
lastname=Wang-4
updateCount=2
*/
ps:这里面使用 Kotlin 中的支持字段 field
,需要学习可以查看笔者的这篇文章:Kotlin 的 Backing Fields 和 Backing Properties。
OK,查看日志,可以看到需求实现了。
2.2.2 抽取重复代码为方法
但是,这里面有着重复的代码,并且如果其他类也需要这样的格式化操作,这些代码也不可以复用。
为了提供代码复用性,我们可以把代码抽取出来,放在一个方法里面。代码实现如下:
class Person3 {var name: String = ""set(value) {field = format(value)}get() {return getter(field)}var lastname: String = ""set(value) {field = format(value)}get() {return getter(field)}var updateCount = 0fun format(value: String): String {updateCount++return value.lowercase().replaceFirstChar { it.uppercase() }}fun getter(value: String): String {return value + "-" + value.length}
}fun main() {val person = Person3()person.name = "peter"person.lastname = "wang"println("name=${person.name}")println("lastname=${person.lastname}")println("updateCount=${person.updateCount}")
}
/*
name=Peter-5
lastname=Wang-4
updateCount=2
*/
查看日志打印,这样做可以实现需求。
2.2.3 使用类来封装重复代码
现在需求又来了,有一个 Student
类:
class Student {var name: String = ""var address: String = ""
}
也需要对属性做同样的格式化操作并统计进行格式化操作的次数,在获取值的时候把长度拼接在后面。
这时,我们可以使用面向对象的思想来解决,把 format
方法和 getter
方法封装在一个类里面:
class Delegate {fun format(thisRef: Any, value: String): String {if (thisRef is Person4) {thisRef.updateCount++} else if (thisRef is Student2) {thisRef.updateCount++}return value.lowercase().replaceFirstChar { it.uppercase() }}fun getter(value: String): String {return value + "-" + value.length}
}
Person
类修改如下:
class Person4 {private val delegate = Delegate()var name: String = ""set(value) {field = delegate.format(this, value)}get() {return delegate.getter(field)}var lastname: String = ""set(value) {field = delegate.format(this, value)}get() {return delegate.getter(field)}var updateCount = 0
}
Student
类修改如下:
class Student2 {private val delegate = Delegate()var name: String = ""set(value) {field = delegate.format(this, value)}get() {return delegate.getter(field)}var address: String = ""set(value) {field = delegate.format(this, value)}get() {return delegate.getter(field)}var updateCount = 0
}
2.2.4 把值的存储委托给委托类处理
既然 getter 和 setter 方法都委托给 Delegate
类来实现,我们何不把值也交给 Delegate
类来存储呢?
如果把 name
和 lastname
的值存在 Delegate
里面的话,它们就不可以共用一个 Delegate
对象了。
然后,Delegate
类两个方法的作用就是设置和获取值,所以方法也需要改一下。对吧?
修改 Delegate
类为:
class Delegate2 {var formattedString: String = ""fun setValue(thisRef: Any, value: String) {if (thisRef is Person5) {thisRef.updateCount++} else if (thisRef is Student2) {thisRef.updateCount++}formattedString = value.lowercase().replaceFirstChar { it.uppercase() }}fun getValue(): String {return formattedString + "-" + formattedString.length}
}
修改 Person
类为:
class Person5 {private val nameDelegate = Delegate2()private val lastnameDelegate = Delegate2()var name: Stringset(value) {nameDelegate.setValue(this, value)}get() {return nameDelegate.getValue()}var lastname: Stringset(value) {lastnameDelegate.setValue(this, value)}get() {return lastnameDelegate.getValue()}var updateCount = 0
}
/*
打印日志:
name=Peter-5
lastname=Wang-4
updateCount=2
*/
到这里,需要强调的是,Person5
里的 name
和 lastname
不具有存储值的功能了,它们是自定义了 setter 和 getter 的属性。
2.2.5 使用 Kotlin 的委托属性来简化代码
对于上面的代码实现,我们仍然感到有些累赘,不简洁。
Kotlin 的委托属性可以帮我们解决这些烦恼。
委托属性的基本语法是这样的:
class Foo {var p: Type by Delegate()
}
等价于
class Foo {private val delegate = Delegate()var p: Typeset(value: Type) = delegate.setValue(this, ..., value)get() = delegate.getValue(this, ...)
}
属性 p
将它的访问器逻辑委托给 Delegate
这个辅助对象来处理。
by
关键字的作用是对它后面的表达式求值来获取这个对象,在这里就是获取到了 Delegate
对象。
编译器会创建一个隐藏的辅助属性,并使用委托对象的实例对它进行初始化,在这里就是把 Delegate
对象赋值给了 delegate
属性。
那么,Kotlin 是如何知道把属性 p
的 setter 逻辑委托给辅助对象 delegate
的哪个方法,把属性 p
的 getter 逻辑委托给辅助对象 delegate
的哪个方法呢?
这里就要说到约定的概念了,委托类必须具有 getValue
和 setValue
方法(如果是可变属性的话),定义在 ReadWriteProperty
接口里:
public fun interface ReadOnlyProperty<in T, out V> {public operator fun getValue(thisRef: T, property: KProperty<*>): V
}
public interface ReadWriteProperty<in T, V> : ReadOnlyProperty<T, V> {public override operator fun getValue(thisRef: T, property: KProperty<*>): Vpublic operator fun setValue(thisRef: T, property: KProperty<*>, value: V)
}
当对 Foo
对象的 p
属性赋值时,会调用 Delegate
对象的 setValue
方法,设置对应的值;
当获取 Foo
对象的 p
的值时,会调用 Delegate
对象的 getValue
方法,获取对应的值。
修改委托类为:
class Delegate3 : ReadWriteProperty<Any, String> {var formattedString = ""override fun getValue(thisRef: Any, property: KProperty<*>): String {return formattedString + "-" + formattedString.length}override fun setValue(thisRef: Any, property: KProperty<*>, value: String) {if (thisRef is Person6) {thisRef.updateCount++}formattedString = value.lowercase().replaceFirstChar { it.uppercase() }}
}
修改 Person
类为:
class Person6 {var name: String by Delegate3()var lastname: String by Delegate3()var updateCount = 0
}fun main() {val person = Person6()person.name = "peter"person.lastname = "wang"println("name=${person.name}")println("lastname=${person.lastname}")println("updateCount=${person.updateCount}")
}
/*
打印如下:
name=Peter-5
lastname=Wang-4
updateCount=2
*/
OK,完美符合需求。
使用 Android Studio 的 Tools -> Kotlin -> Show Kotlin Bytecode,再点击 Decompile 按钮,查看 Delegate3
和 Person6
对应的 Java 代码:
public final class Delegate3 implements ReadWriteProperty {@NotNullprivate String formattedString = "";@NotNullpublic final String getFormattedString() {return this.formattedString;}public final void setFormattedString(@NotNull String var1) {this.formattedString = var1;}@NotNullpublic String getValue(@NotNull Object thisRef, @NotNull KProperty property) {return this.formattedString + "-" + this.formattedString.length();}// $FF: synthetic method// $FF: bridge methodpublic Object getValue(Object var1, KProperty var2) {return this.getValue(var1, var2);}public void setValue(@NotNull Object thisRef, @NotNull KProperty property, @NotNull String value) {if (thisRef instanceof Person6) {((Person6)thisRef).setUpdateCount(((Person6)thisRef).getUpdateCount() + 1);}Delegate3 var10000 = this;boolean var5 = false;String var10001 = value.toLowerCase(Locale.ROOT);Intrinsics.checkNotNullExpressionValue(var10001, "(this as java.lang.Strin….toLowerCase(Locale.ROOT)");String var4 = var10001;var5 = false;CharSequence var6 = (CharSequence)var4;boolean var7 = false;if (var6.length() > 0) {StringBuilder var20 = new StringBuilder();char it = var4.charAt(0);StringBuilder var15 = var20;int var9 = false;boolean var11 = false;String var12 = String.valueOf(it);boolean var13 = false;if (var12 == null) {throw new NullPointerException("null cannot be cast to non-null type java.lang.String");}String var19 = var12.toUpperCase(Locale.ROOT);Intrinsics.checkNotNullExpressionValue(var19, "(this as java.lang.Strin….toUpperCase(Locale.ROOT)");String var16 = var19;var10000 = this;var20 = var15.append(var16.toString());byte var17 = 1;boolean var18 = false;if (var4 == null) {throw new NullPointerException("null cannot be cast to non-null type java.lang.String");}String var10002 = var4.substring(var17);Intrinsics.checkNotNullExpressionValue(var10002, "(this as java.lang.String).substring(startIndex)");var10001 = var20.append(var10002).toString();} else {var10001 = var4;}var10000.formattedString = var10001;}// $FF: synthetic method// $FF: bridge methodpublic void setValue(Object var1, KProperty var2, Object var3) {this.setValue(var1, var2, (String)var3);}
}
public final class Person6 {// $FF: synthetic fieldstatic final KProperty[] $$delegatedProperties = new KProperty[]{(KProperty)Reflection.mutableProperty1(new MutablePropertyReference1Impl(Person6.class, "name", "getName()Ljava/lang/String;", 0)), (KProperty)Reflection.mutableProperty1(new MutablePropertyReference1Impl(Person6.class, "lastname", "getLastname()Ljava/lang/String;", 0))};@NotNullprivate final Delegate3 name$delegate = new Delegate3();@NotNullprivate final Delegate3 lastname$delegate = new Delegate3();private int updateCount;@NotNullpublic final String getName() {return this.name$delegate.getValue(this, $$delegatedProperties[0]);}public final void setName(@NotNull String var1) {this.name$delegate.setValue(this, $$delegatedProperties[0], var1);}@NotNullpublic final String getLastname() {return this.lastname$delegate.getValue(this, $$delegatedProperties[1]);}public final void setLastname(@NotNull String var1) {this.lastname$delegate.setValue(this, $$delegatedProperties[1], var1);}public final int getUpdateCount() {return this.updateCount;}public final void setUpdateCount(int var1) {this.updateCount = var1;}
}
可以看到,这和我们在 2.2.4 中写的大致是一样的。
thisRef
就是发起委托的对象。
值得注意的是,在 Person6.java
中创建了一个 $$delegatedProperties
对象,它是一个 KProperty
类型的数组,它的元素封装了类,属性名,getter 方法签名等信息,也会传递给委托类,这是用来做什么的?
本例子中我们确实用不到这些信息。KProperty
主要是用来封装属性的元信息,提供给委托类使用,比如在委托类的 setValue
方法中通知属性发生变化时,就会用到 KProperty
里的属性名信息了。
2.2.6 对委托属性约定的再认识
虽然 Kotlin 提供了 ReadWriteProperty
和 ReadOnlyProperty
封装了约定的方法给我们使用,但是当我们定义委托类时并不是一定要实现 Kotlin 提供的接口。
实际上,只要保持委托类里的 setValue
和 getValue
方法与约定的 setValue
方法和 getValue
方法一致就可以了。
修改委托类为:
class Delegate4 {var formattedString = ""// 注意这里的 operator 不可以省略operator fun getValue(thisRef: Any, property: KProperty<*>): String {return formattedString + "-" + formattedString.length}// 注意这里的 operator 不可以省略operator fun setValue(thisRef: Any, property: KProperty<*>, value: String) {if (thisRef is Person7) {thisRef.updateCount++}formattedString = value.lowercase().replaceFirstChar { it.uppercase() }}
}
修改 Person
类为:
class Person7 {var name: String by Delegate4()var lastname: String by Delegate4()var updateCount = 0
}fun main() {val person = Person7()person.name = "peter"person.lastname = "wang"println("name=${person.name}")println("lastname=${person.lastname}")println("updateCount=${person.updateCount}")
}
约定方法可以使用扩展函数来实现:
比如,Delegate
类不符合委托属性的约定方法,代码如下:
class Delegate5 {var formattedString = ""fun get(): String {return formattedString + "-" + formattedString.length}fun set(thisRef: Any, value: String) {if (thisRef is Person8) {thisRef.updateCount++}formattedString = value.lowercase().replaceFirstChar { it.uppercase() }}
}
这时可以使用扩展函数来实现约定方法,新建 Delegate5Extension.kt
:
operator fun Delegate5.setValue(thisRef: Any, property: KProperty<*>, value: String) =set(thisRef, value)operator fun Delegate5.getValue(thisRef: Any, property: KProperty<*>) = get()
修改 Person
类为:
class Person8 {var name: String by Delegate5()var lastname: String by Delegate5()var updateCount = 0
}fun main() {val person = Person8()person.name = "peter"person.lastname = "wang"println("name=${person.name}")println("lastname=${person.lastname}")println("updateCount=${person.updateCount}")
}
/*
打印日志:
name=Peter-5
lastname=Wang-4
updateCount=2
*/
2.3 Kotlin 内置的委托
2.3.1 lazy() 函数
lazy()
函数用于实现属性的惰性初始化,即只有在第一次访问属性时,才对它进行初始化。
class Person(name: String) {val emails: List<String> by lazy { loadEmailsByName(name) }private fun loadEmailsByName(name: String): List<String> {println("loadEmailsByName called")return listOf("Email1", "Email2", "Email3")}
}fun main() {val p = Person("Peter")println(p.emails)println(p.emails)
}
/*
打印日志:
loadEmailsByName called
[Email1, Email2, Email3]
[Email1, Email2, Email3]
*/
可以看到,两次访问 emails
属性,只有第一次调用了 loadEmailsByName
方法。
如果把访问 emails
属性的代码注释掉,会看到没有任何打印,说明 emails
属性确实是惰性初始化的。
为什么 lazy()
函数可以放在 by 后面用于获取委托对象呢?
这是因为 Lazy.kt
中定义了符合约定的扩展函数:
public inline operator fun <T> Lazy<T>.getValue(thisRef: Any?, property: KProperty<*>): T = value
2.3.2 Delegates.notNull()
Delegates.notNull()
用于实现属性的延迟初始化,和 lateinit
类似。
它们的区别是:
notNull
会给每个属性额外创建一个对象,而lateinit
不会;notNull
可以用于基本数据类型的延迟初始化,而lateinit
不可以。
class Person4 {val fullname: String by Delegates.notNull<String>()lateinit var fullname2: String// lateinit var age: Intcompanion object {lateinit var list: MutableList<String>val l : List<String> by Delegates.notNull<List<String>>()}
}
3.最后
本文比较详细地介绍了 Kotlin 为什么要出现 by
关键字,以及它的两种用法。通过小的例子一步一步引出 by
关键字的使用。
需要说明的是,本文对于 by
关键字的委托属性的用法的实际应用并没有一一说明,这部分需要查看 Delegated properties-Kotlin官方文档。
另外,本文没有把委托属性在属性值变化监听的应用例子写在文章里,主要考虑到大家对 PropertyChangeSupport
这个接口比较陌生,不太适合做基本实例说明。不过,这个例子在本文提供的代码中是包含的。需要说明的是,Kotlin 的内置的 Delegates.observable
和 Delegates.vetoable
就是对属性值变化监听或者否决的代码封装。
代码在这里。
文章的参考部分是不可多得的学习资料。大家也可以看看。
4.参考
- Delegation-Kotlin官方文档
- Delegated properties-Kotlin官方文档
- Delegating Delegates to Kotlin-AndroidDevelopersBlog
出自谷歌技术推广工程师,使用的例子比较贴切。 - Built-in Delegates-AndroidDevelopersBlog
出自谷歌技术推广工程师,使用的例子比较贴切。 - Built-in Delegates-MAD Skills
出自谷歌技术推广工程师,这是视频版。 - [译]带你揭开Kotlin中属性代理和懒加载语法糖衣
对 lazy 进行的详细地说明。 - Kotlin “By” Class Delegation: Favor Composition Over Inheritance
作者详细地说明了类委托,介绍了组合优于继承,并举出 Android 中的 AppCompatDelegate 的例子,Guava 开源库中集合中使用组合代替继承的例子。 - Kotlin ‘By’ Property Delegation: Create Reusable Code
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- Hive实战系列调优之工作常用到的参数
1.开启并行执行 set hive.exec.paralleltrue; 2.设置Map和Reduce的个数 --Map数量相关的参数 set mapred.max.split.size; --一个split的最大值,即每个map处理文件的最大值 set mapred.min.split.size.per.node; --一个节点上split的最小值 set mapred.min.s…...
2024/4/27 11:11:41 - Wireshark分析ping操作
ping操作属于icmp协议,所以打开wireshark,在过滤器指定过滤icmp协议的数据 打开cmd,在命令行输入ping www.baidu.com wireshark的显示结果如下 以最后两帧为例,时间差为33.746131-33.7144570.031674,与cmd中的30ms对应 整个报文如…...
2024/4/21 4:43:02 - 把字符串里的空格换成%
把字符串里的空格换成 % 开始想到的是遍历字符串A,然后放入一个字符串放B里然后打印出来 放入的字符串B为可变字符串,用StringBuffer或者StringBuilder,这里我们用StringBuilder StringBuilder B new StringBuilder();放入的时候是一个一个放…...
2024/4/18 0:47:11 - 【动态规划】线性dp之子序列模型
子序列模型最长上升子序列二分优化 lower_bound()输出路径最长公共子序列输出路径最长公共上升子序列输出路径输出字典序最小路径最长上升子序列 void solve(){scanf("%d",&n);for(int i1;i<n;i)scanf("%d",&a[i]);for(int i1;i<n;i){dp[i]…...
2024/4/15 16:00:05 - 计算机网络知识点(二) 物理层
目录 第二章 物理层 2.1 数据通信的理论基础 2.1.1 概念 2.1.2 计算信道的最大数据传输速率 2.2 传导性传输介质 2.3 公共电话交换网络 2.3.1 本地回路 2.3.2 多路复用 2.3.3 交换技术 第二章 物理层 2.1 数据通信的理论基础 2.1.1 概念 1. 带宽(band…...
2024/4/18 12:16:07 - 团体程序设计天梯赛(L2-019 悄悄关注 (25 分))
题目: 思路分析: 一个模拟题! 二个cmp 一个是数字大小!一个是string的大小! 代码实现: const int MAX10010; struct node{string s;double val;int is; }e[MAX]; bool cmp(node a,node b){return a.val>…...
2024/4/15 16:00:05 - Pycharm运行按钮是灰色怎么办
如果你的Pycharm右上角的运行按钮是灰色,如何让它变绿呢? 只需要在你的代码界面右键,选择“ Run run ”即可; (或者直接快捷键,CtrlshiftF10),进行初始化,就成功了。...
2024/4/23 4:17:08 - JavaScript浏览器对象模型(1)
1.什么是Bom 2.Dom和Bom不同区别 3.Bom的构成...
2024/4/15 15:59:45 - 记不住git命令?好办,用批处理
作为一名编程爱好者,经常要用到代码管理、版本控制的工具——git,而git命令涉及到的语法参数又比较多,如果不小心用错了,还有可能导致辛辛苦苦编好的代码一瞬间付之东流。为了避免这种情况的发生,同时减轻记忆负担&…...
2024/4/16 10:41:41 - LeetCode笔记:Weekly Contest 265
LeetCode笔记:Weekly Contest 265 1. 题目一 1. 解题思路2. 代码实现 2. 题目二 1. 解题思路2. 代码实现 3. 题目三 1. 解题思路2. 代码实现 4. 题目四 1. 题目一 给出题目一的试题链接如下: 2057. Smallest Index With Equal Value 1. 解题思路 这…...
2024/4/19 1:48:46 - Cesium加载GeoServer的WMS/WMTS服务(含源代码)
1.在项目中需要用Cesium加载GeoServer已经发布好的WMS与WMTS服务,现将其详细的实现过程记录。 2.对于WMS服务的加载,实现过程相对较简单,通过addImageryProvider()方法即可加载。 var wmsImageryProvider new Cesium.WebMapServiceImagery…...
2024/4/23 0:46:17 - Web Componets 实践报告,原生组件开发
前言 相信作为一名前端开发,无论是使用vue还是react、augular,大家对于组件和组件化开发一定不会陌生,甚至颇有道行,但说起原生组件开发,可能许多朋友就挠头了,还有这个操作么?就好像经常用谷歌…...
2024/4/15 16:00:00 - 建筑施工企业电工岗位安全教育培训 (附下载)
摘要: 公众号:安全生产星球...
2024/4/29 21:54:42 - Hadoop启动后jps查询后没有namedata,datanode进程
我的namedata进程突然之间没有的原因:是因为我之前没有停止hadoopd的集群又重新启动hadoopde集群 还有其他原因也会导致比如:1.直接关闭虚拟机,也没有停止hadoop 集群 2.格式化namenode之前,没有删除data里面的数据和日志&#x…...
2024/4/15 16:00:56 - <Leetcode>算法初步(回顾)
虽然没做多少题目,做的题目也是最简单的,但是第一次我还是收获很大的。 突然觉得在知乎上看到的一句话很有道理:”如果在大一开始下定决心选择计算机,每天弄懂一道leetcode题目,到了大三大四的时候,就会觉…...
2024/4/19 18:04:44 - 利用正则将JSON串中的key替换为大/小写
使用的是Fastjson,需求RT 上代码 public static void main(String[] args) {JSONObject jsonObject JSON.parseObject("{}");jsonObject.put("abc", "asd");jsonObject.put("efg", "");jsonObject.put("…...
2024/4/15 16:00:56 - 基于法理层面的安全生产责任制思考 (附下载)
摘要: 公众号:安全生产星球...
2024/4/15 16:00:31 - ”21天养成好习惯“第一期——8
一.关于 c语言中的注释 二. 关于while的循环语句 代码如下 运行结果如下...
2024/4/18 9:46:06 - Python(输入输出)
目录 一、输入 二、输出 三、格式化输出 一、输入 input(promptNone,/) 默认值是None从标准输入(键盘)读取一个字符串;如果给了提示字符串,将被打印到标准输出。 肯定有返回值,…...
2024/4/30 14:21:17 - Prometheus监控实战系列二: 安装部署
Prometheus支持多种操作系统,例如Linux、Windows和Max OSX等。在产品官网上提供了独立的二进制文件进行下载,可下载对应的tar包并在相应系统的服务器上进行安装部署。 当然,做为与容器有着紧密联系的监控系统,Promethesu也可以很…...
2024/4/18 17:03:23
最新文章
- Linux下软硬链接和动静态库制作详解
目录 前言 软硬链接 概念 软链接的创建 硬链接的创建 软硬链接的本质区别 理解软链接 理解硬链接 小结 动静态库 概念 动静态库的制作 静态库的制作 动态库的制作 前言 本文涉及到inode和地址空间等相关概念,不知道的小伙伴可以先阅读以下两篇文章…...
2024/4/30 16:14:31 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - jenkins参数化构建
Jenkins 的参数化构建 Jenkins 是一个开源的持续集成和持续部署工具,它可以帮助开发者自动化构建、测试和部署软件项目。在本文中,我们将重点介绍如何使用 Jenkins 的参数化构建功能来创建更加灵活和可定制的项目。 参数化构建是 Jenkins 提供的一种强…...
2024/4/30 4:06:24 - 腾讯云轻量服务器流量不够用了会怎么样?
腾讯云轻量应用服务器是限制月流量的,如果当月流量不够用了,流量超额了怎么办?流量超额后,需要另外支付流量费,如果你的腾讯云账号余额,就会自动扣除对应的流量费,如果余额不足,轻量…...
2024/4/30 5:18:15 - K8S容器空间不足问题分析和解决
如上图,今天测试环境的K8S平台出现了一个问题,其中的一个容器报错:Free disk space below threshold. Available: 3223552 bytes (threshold: 10485760B),意思服务器硬盘空间不够了。这个问题怎么产生的,又怎么解决的呢…...
2024/4/29 9:05:31 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/4/29 23:16:47 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/4/29 6:03:24 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/4/29 2:29:43 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/4/29 14:21:50 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/4/27 17:58:04 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/4/27 14:22:49 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/4/28 1:28:33 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/4/30 9:43:09 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/4/27 17:59:30 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/4/25 18:39:16 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/4/28 1:34:08 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/4/26 19:03:37 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/4/29 20:46:55 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/4/25 18:39:14 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/4/26 23:04:58 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/4/27 23:24:42 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/4/28 5:48:52 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/4/30 9:42:22 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/4/30 9:43:22 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/4/30 9:42:49 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57