Kotlin 基础学习笔记第七章——运算符重载及其他约定

发布时间:2022-12-03 学习 JAVA ANDROID

        如你所知,java在标准库中有一些与特定的类相关联的语言特性。例如,实现java.lang.Iterable接口的对象可以在for循环中使用;实现了java.lang.AutoCloseable接口的对象可以在try-with-resource语句中使用。

一、重载算术运算符

        1、重载二元运算符        

         注意,如何使用operator关键字来声明plus函数。用于重载运算符的所有函数都需要用该关键字来标记,用来表示你打算把这个函数作为相应的约定的实现,并且不是碰巧地定义一个同名函数。

        在使用了operator修饰符声明了plus函数之后,你就可以直接使用+号来求和了。事实上,这里它调用的是plus函数。

        除了把这个运算符声明为一个成员函数外,也可以把它定义为一个扩展函数。

        和其他一些语言相比,在kotlin中不管是定义还是使用重载运算符都更为简单,因为你不能定义自己的运算符。kotlin限定了你能重载哪些运算符,以及您需要在你的类中定义的对应名字的函数。         

         自定义类型的运算符,基本上和标准数字类型的运算符有着相同的优先级。例如,如果是a + b * c,乘法将始终在添加之前执行,即使你已经自己定义了这些运算符。        

        当你在定义一个运算符的时候,不要求两个运算数是相同的类型。例如,让我们定义一个运算符,它允许你用一个数字来缩放一个点,可以用它在不同坐标系之间做转换。

         注意,kotlin中运算符不会自动支持交换性(交换运算符的左右两边)。如果希望用户能够使用1.5 * p以外,还能使用p * 1.5,你需要为它定义一个单独的运算符:operator fun Double.times(p: Point): Point。

        运算符函数的返回类型也可以不同于任一运算数的类型。        注意,和普通的函数一样,可以重载operator函数:可以定义多个同名的,但是参数类型不同的方法。

 2、重载复合赋值运算符

        通常情况下,当你在定义像plus这样的运算符函数时,kotlin不止支持+号运算,也支持+=。像+=、-=等这些运算符被称为复合赋值运算符。

        在一些情况下,定义+=运算可以修改使用它的变量所引用的对象,但不会重新分配引用。将一个元素添加到可变集合,就是一个很好的例子:

    如果你定义了一个返回值为Unit,名为plusAssign的函数,kotlin将会在用到+=运算符的地方调用它。其他二元算术符也有命名相似的对应函数:如minusAssign、TimesAssign等。

        kotlin标准库为可变集合定义了plusAssign函数。

         当你在代码中用到了+=的时候,理论上plus和plusAssign都可能被调用。如果在这种情况下,两个函数都有定义且适用,编译器会报错。一种可行的解决办法是:替换运算符的使用为普通函数调用。另一个办法是,使用val替代var,这样plusAssign运算符就不再适用。但一般来说,最好一致地设计出新的类:尽量不要同时给一个类添加plus和plusAssign运算。如果像前面的一个示例中的Point,这个类是不可变的,那么就应该只提供返回一个新值(如plus)的运算。如果一个类是可变的,比如构建器,那么只需要提供plusAssign和类似的运算就够了。

         kotlin标准库支持集合的这两种方法。+和-运算符总是返回一个新的集合。+=和-=运算符用于可变集合时,始终在一个地方修改它们:而它们用于只读集合时,会返回一个修改过的副本(这意味着只有当引用只读集合的变量被声明为var的时候,才能使用+=和-=)。作为它们的运算符,可以使用单个元素,也可以使用元素类型一致的其他集合。

        最后来看看集合的二元运算符是如何实现的。

/**
 * Returns a list containing all elements of the original collection and then the given [element].
 */
public operator fun <T> Collection<T>.plus(element: T): List<T> {
    val result = ArrayList<T>(size + 1)
    result.addAll(this)
    result.add(element)
    return result
}
/**
 * Adds the specified [element] to this mutable collection.
 */
@kotlin.internal.InlineOnly
public inline operator fun <T> MutableCollection<in T>.plusAssign(element: T) {
    this.add(element)
}

        2、重载一元运算符        

         用于重载一元运算符的函数,没有任何参数。

        可重载的一元算法的运算符包括:

 二、重载比较运算符

        与算术运算符一样,在kotlin中,可以对任何对象使用比较运算符(==、!=、>、<等),而不仅仅限于基本数据类型。不用像java那样调用equals或compareTo函数,可以直接使用比较运算符。

        1、等号运算符:equals

        如果在kotlin中使用==运算符,它将被转换成equals方法的调用。这只是我们要讨论的约定原则中的一个。

        使用!=运算符也会被转换成equals函数的调用,明显的差异在于,它们的结果是相反的。注意,和所有其他运算符不同的是,==和!=可以用于可空运算数,因为这些运算符事实上会检查运算数是否为null。比如a==b会检查a是否为非空,如果不是,就调用a.equals(b);否则,只有两个参数都是空引用,结果才是true。

         对于Point类,因为已经被标记为数据类,equals的实现将会由编译器自动生成。但如果要手动实现,那么代码可以是这样的。

        这里使用了恒等运算符===来检查参数与调用了equals的对象是否相同。恒等运算符与java中的==运算符是完全相同的:检查两个参数是否是同一个对象的引用(如果是基本数据类型,检查它们是否是相同的值)。 在实现了equals方法之后,通常会使用这个运算符来优化调用代码。注意,===运算符不能被重载。

        equals函数之所以被标记为override,那是因为与其他约定不同的是,这个方法的实现是在Any类中定义的(kotlin中的所有对象都支持等式比较)。这也解释了为什么你不需要将它标记为operatpor:  因为Any的基本方法就已经标记了,而且函数的operator修饰符也适用于所有实现或重写它的方法。还要注意,equals不能实现为扩展函数,因为继承自Any类的实现始终优先于扩展函数。

        这个例子显式使用!=运算符也会转换为euqals方法的调用。编译器会自动对返回值取反,因此你不需要再做别的事情,就可以正常运行。

        来看看Any中equals的定义:

public open class Any {

    public open operator fun equals(other: Any?): Boolean
}

        2、排序运算符

        在java中,类可以实现Comparable接口,以便在比较值的算法中使用。Kotlin也支持相同的Comparable接口。但是接口中定义的compareTo方法可以按约定调用,比较运算符(<、>、<=、>=)的使用将被转换为compareTo。

 

        在这种情况下,可以实现Comparable接口,这样Person对象不仅可以在kotlin代码中用来比较,还可以被java函数(比如用于对集合进行排序的功能)进行比较。与equals一样,operator修饰符已经被用在了基类的接口中,因此重写该接口时无须再重复。

        要注意如何使用kotlin标准库中的compareValueBy函数来简洁地实现compareTo方法。这个函数接受用来计算比较值的一系列回调,按顺序依次调用回调方法,两两一组分别做比较,并返回结果。如果值不同,则返回比较结果;如果它们相同,则继续调用下一个;如果没有更多回调来调用,则返回0。这些回调函数可以像lambda一样传递,或者像这里做的一样,作为属性引用传递。

         注意,尽管自己直接实现字段的比较会运行的更快一点,然而这样会包含更多的代码。一般情况下,更推荐使用简洁的写法,不用过早地担心性能问题,除非你知道这个实现将会被频繁调用。

        所有java中实现了Comparable接口的类,都可以在kotliin中使用简洁的运算符语法,不用再增加扩展函数。

三、集合与区间的约定

        1、通过下标来访问元素:get和set

        在kotlin中,可以用类似java中数组的方式来访问map中的元素——使用方括号:

        val value = map[key]

        也可以使用同样的运算符来改变一个可变map的元素:

        mutableMap[key] = newValue;

        来看看它是如何工作的。在kotlin中,下标运算符是一个约定。使用下标运算符读取元素会被转换为get运算符方法的调用,并且写入元素将调用set。Map和MutableMap的接口已经定义这些方法。

public interface Map<K, out V> {
    /**
     * Returns the value corresponding to the given [key], or `null` if such a key is not present in the map.
     */
    public operator fun get(key: K): V?

}

        可以使用方括号来引用点的坐标:p[0]访问X坐标,p[1]访问Y坐标。下面是它的实现和调用:

         你只需要定义一个名为get的函数,并标记operator。之后,像p[1]这样的表达式,其中p具有类型Point,将被转换为get方法的调用。

         注意,get的参数可以是任何类型,而不只是Int。例如,当你对map使用下标运算符时,参数类型是键的类型,它可以是任意类型。还可以定义具有多个参数的get方法。例如,如果要实现一个类来表示二维数组或矩阵,你可以定义一个方法,例如operator fun get(rowIndex:Int, colIndex: Int),然后调用matrix[row, col]。

        我们也可以用类似的方式定义一个函数,这样就可以使用方括号语法更改给定下标处的值。   我们来定义另一个类来表示一个可变的点。

     这个例子也很简单:只需要定义一个名为set的函数,就可以在赋值语句中使用下标运算符。set的最后一个参数用来接收赋值语句中(等号)右边的值,其他参数作为方括号内的下标,例如下图所示:

         2、in 的约定

        集合支持的另一个运算符是in运算符,用来检查某个对象是否属于集合。相应的函数叫做contains。我们来实现一下,使用in运算符来检查点是否属于一个矩阵。

        in右边的对象将会调用contains函数,in左边的对象将会作为函数入参。 在Rectangle.contains的实现中,我们用到了标准库中的until函数,来构建一个开区间,然后使用运算符in来检查某个点是否属于这个区间。

 3、rangeTo的约定

        要创建一个区间,请使用..语法:举个例子,1..10代表所有从1到10的数字。..运算符也是kotlin中的一个约定:..运算符是调用rangeTo函数的一个简洁方法。

         rangeTo函数返回一个区间。你可以为自己的类定义这个运算符。但是,如果该类实现了Comparable接口,那么就不需要了:你可以通过kotlin标准库创建一个任意可比较元素的区间,这个库定义了可以用于任何可比较元素的rangeTo函数:

/**
 * Creates a range from this [Comparable] value to the specified [that] value.
 *
 * This value needs to be smaller than [that] value, otherwise the returned range will be empty.
 * @sample samples.ranges.Ranges.rangeFromComparable
 */
public operator fun <T : Comparable<T>> T.rangeTo(that: T): ClosedRange<T> = ComparableRange(this, that)

         4、在for循环中使用iterator的约定

        在kotlin中,for循环中也可以使用in运算符,和做区间检查一样。但是在这种情况下它的含义是不同的:它被用来执行迭代。这意味着一个诸如for(x in list) {...}将被转换成list.iterator()的调用,然后就像在java中一样,在它上面重复调用hasNext()和next()方法。

        请注意,在kotlin中,这也是一种约定,这意味着iterator方法可以被定义为扩展函数。这就解释了为什么可以遍历一个常规的java字符串:标准库已经为CharSequence定义了一个扩展函数iterator,而它是String的父类。

         可以为自己的类定义iterator方法。例如,可以这样定义方法来遍历日期。

         请注意如何在自定义区间类型上定义iterator方法:使用LocalDate作为类型参数。如上一小节所示,rangeTo库函数返回一个ClosedRange的实例,并且ClosedRange<LocalDate>的iterator扩展允许在for循环中使用区间的实例。

        四、解构声明和组件函数

         解构声明允许你展开单个复合值,并使用它来初始化多个单独的变量。

        解构声明也用到了约定的原理。要在解构声明中初始化每个变量,将调用名为componentN的函数,其中N是声明中的变量。换句话说,前面的例子可以被转换成下图:

         对于数据类,编译器为每个在主构造方法中声明的属性生成一个componentN函数。下面的例子现实了如何手动为非数据类声明这些功能:

        解构声明主要使用场景之一,是从一个函数返回多个值,这个非常有用。如果要这样做,可以定义一个数据类来保存返回所需的值,并将它作为函数的返回类型。 在调用函数后,可以用解构声明的方式,来轻松地展开它,使用其中的值。举个例子,让我们写一个简单的函数,来将一个文件名分割成名字和扩展名。

         如果你注意到componentN函数在数组和集合上也有定义,可以进一步改进这个代码。当你在处理已知大小的集合时,这是非常有用的。一个例子就是,用split来分割返回两个元素的列表。

        当然,不可能定义无限数量的componentN函数,这样这个语法就可以与任意数量的集合一起工作,但这也没用。标准库只允许使用此语法来访问一个对象的前五个元素。 

        让一个函数能返回多个值有更简单的方法,是使用标准库中的Pair和Triple类。在语义表达上这种方式会差一点,因为这些类也不知道它返回的对象包含什么,但因为不需要定义自己的类所以可以少些代码。

 

               

 

                

 

        

更多相关推荐


【Java篇】回顾二进制文件和字节流

发布时间:2022-11-22 算法 JAVASE基础知识 IO流 开发语言 JAVA
目录问题引入二进制方式读写文件的主要流回顾:InputStream/Outputstream回顾: FileInputStream/FileOutputStream问题引入        在Java中如何以二进制字节的方式处理文件?二进制方式读写文件的主要流        InputStream/Outputstream:        这是基类,是抽象类;        FileInputStr...

WPF中一个通用的BoolToXXX转换类

发布时间:2021-08-09 PYTHON JAVASCRIPT JAVA VUE JS
在WPF程序的数据绑定里面,经常会通过一个布尔类型的值来控制UI控件的状态,例如是否可见,是否最大化之类的。然而UI控件的各个状态属性的类型往往不是布尔类型,比如UIElement.Visibility的类型是Visibility枚举,Window.WindowState的类型是WindowState枚举。以前我为了将布尔类型的数据绑定到这些可依赖属性的时候,经常要写很多ValueConverte...

飞信发送短信

发布时间:2016-05-17 RUNTIME JAVA
Java代码  /*  * To change this license header, choose License Headers in Project Properties.  * To change this template file, choose Tools | Templates  * and open the template in the editor.  */  packag...

关于PCB板热设计的学习总结

发布时间:2022-10-07 学习 PCB工艺 PCB
背景: 电子设备在通电时所消耗的电能,除了有用功外,大部分都转化为热量散发。电子设备产生的热量使得内部的温度迅速上升,若不及时将该热量散发出去,设备会继续升温,器件就会因温度过高而失效,导致该设备的可靠性下降。在设计PCB时,应当充分考虑到设备散热的问题。PCB发热的因素: 导致PCB的温升的直接原因是电路功耗器件的存在,一般由以下几种因素导致:(1)器件选型不合理,器件功耗过大。(2)PCB布局...

Java线程面试题 Top 50 (转载)

发布时间:2016-09-18 JAVA
Java线程面试题Top50(转载)Java线程面试题Top50       原文链接:http://www.importnew.com/12773.html       本文由 ImportNew - 李广 翻译自 javarevisited。欢迎加入Java小组。转载请参见文章末尾的要求。  不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题。Java语言一个重要的特点就是内置了对并...

【转载】线程的基本概念

发布时间:2019-10-12 JAVA
线程的基本概念按照规划,从本篇开始我们开启『并发』系列内容的总结,从本篇的线程开始,到线程池,到几种并发集合源码的分析,我们一点点来,希望你也有耐心,因为并发这块知识是你职业生涯始终绕不过的坎,任何一个项目都或多或少的要涉及一些并发的处理。这一系列文章只能算是对并发这块基本理论知识的一个总结与介绍,想要成为并发高手,必然是需要通过大规模并发访问的线上场景应用,或许以后我有了相关经验了,再给你们做一...

二、Redis数据类型详解

发布时间:2022-10-09 JAVA 缓存中间件 开发语言 REDIS
目录0.概述1.redis特性 2.访问速度3.redis底层结构1.数据类型总述2.string数据结构2.1 基本命令2.2 应用场景  2.3底层数据结构2.4bitmap类型3. hash结构3.1 Hash常用操作3.2 应用场景 3.3优缺点3.4数据结构4. list数据结构 4.1 常用操作  4.2 应用场景  4.3数据结构5. set数据结构5.1 常用操作 5.2应用场景 ...

Android四大组件之Content Provider

发布时间:2016-04-23 ANDROID
内容提供器(ContentProvider)主要用于不同的应用程序之间实现数据共享的功能,它提供了一套完整的机制,允许一个程序访问另一个程序中的数据,同时还能保证被访数据的安全性。目前,使用内容提供器是Android实现跨程序共享数据的标准方式。一、访问其他程序中的数据对于每个应用程序要想访问其他程序的内容提供器共享的数据,就必须借助ContentResolve类,可以通过Context中的get...

STL的学习(1)string

发布时间:2022-11-20 C++ 学习 C++学习手册
STL的学习(1)string1、对STL的基本认知什么是STL​STL(standardtemplatelibaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。STL的版本STL的六大组件​STL的重要性​网上有句话说:“不懂STL,不要说你会C++”。STL是C++中的优秀作品,有了它的陪伴,许多底层的数据结构以及算法都不需...

URL编码及解码方式完成Cookie中文储存。

发布时间:2022-09-27 JAVA SERVLET
很多时候软件内置是不支持中文输入的。例如浏览器中的cookie不能存储中文,但是如果有这方面的需求,这个时候该如何解决呢?这个时候就可以采用URL编码首先创建两个servlet,分别命名为:Aservlet、Bservlet分别进行编解码 在AServlet中对中文进行URL编码:@WebServlet("/aServlet")publicclassAServletextendsHttpServl...

企业讲师培训

最近参加了企业讲师的培训课程,觉得非常有用,所以想记录下来。不过不是很全,能记得多少写多少吧。先从课程一词说起,在西方,课程(curriculum)一词来源于拉丁文“currere”,意为赛马的跑道(race-course)。那么课程也就是一圈一圈的冲刺,不断的学习与提高。当然很重要的一点就是课程一定要循序渐进由低到高的。低-&gt;中-&gt;高,这也是很多教育机构也好培训机构也好都是如此,我们...

app架构师,音视频时代你还不会NDK开发?含小米、腾讯、阿里

发布时间:2021-04-17 ANDROID 程序员
开头我属于半路出家型程序员。我的本科专业学的是新媒体,偏向营销策划类,但是我所在的学校只是一个普通的二本,这个专业在学校里还很年轻,发展并没有其他专业成熟,于是就导致课程内容不充实,学生多出来大把的时间。闲着没事的时候,我喜欢看一些科技前沿的文章,逛B站,无意间接触到了编程,入坑Android,开始了漫长的自学之路。一方面是出于兴趣,另一方面是因为被程序员优渥的薪资待遇所吸引,于是我一直都在向程序...

如何在生产环境中安装jdk+监控关键字错误日志脚本

发布时间:2022-11-22 JAVA LINUX LINUX基础 服务器
一、如何在生产环境中安装jdk1.1远程登录虚拟机进入终端1.2查看Linux系统是否有自带的jdk1、输入:java-version2、发现有输入:rpm-qa|grepjava检测jdk的安装包,(注意:rpm命令符没有时记得下载一个输入:apt-getinstall+命令名称)3、接着进行一个个删除包,输入:rpm-e--nodeps+包名4、最后再次:rpm-qa|grepjava检查是否...

IT新人最实用的职场建议

发布时间:2009-07-05 报表 语言 职场故事 编程 电信 JAVA 工作
    职场新人,尤其是IT新人,一旦社会角色从学业转为职业,那么新的人生便波澜壮阔的展开了,只是,是否每个人都会有足够的聪慧和细心?  1.作为职场新人,很容易放弃。这种放弃,作为刚毕业的新人,年纪轻轻,对于职业和未来不了解,一旦遇到挫折,首先想到的是放弃,放弃公司,放弃自己所从事的行业等等。  要知道世界上最容易的事情就是放弃,很多职场新人的想法就是,我还年轻,我不能浪费时间,我必须再去找更好...

2022最新整理新手零基础系统的自学网络安全

发布时间:2022-11-22 网络 网络安全 学习 安全 WEB安全
由于我这么多年来一直深耕于网络安全这个行业,所以后台经常收到大量的私信问我说该怎么入行,该怎么自学,所以今天就抽时间写了这样一篇文章第一步:计算机基础这第一步,其实跟网络安全关系都不太大,而是进入IT领域的任何一个人都要掌握的基础能力。下面五大课程,是大学老师当年教给我们不管你是什么技术方向最好都好好学的技术,如今看来,仍然不过时:计算机网络计算机组成原理操作系统算法与数据结构数据库这每一门课程其...

咖啡师Jeff的Java学习笔记

发布时间:2022-04-27 JAVA 后端
第一章安装本地开发环境-Windows11篇开篇以此系列文字,记录下一个咖啡师的编程学习之路。做咖啡我是专业的。一、安装本地开发环境-Windows11篇1.安装JDK下载JDKhttps://www.oracle.com/java/technologies/downloads/#java8JDK版本此次选择1.8下载完成以后,选择好安装位置,一直点击“下一步”,即可完成安装。2.配置环境变量完成...

Java泛型中的字母表示

发布时间:2022-11-20 JAVA JVM 开发语言
常用的泛型表示字母常用的泛型字母表示有?,T,K,V,E?表示不确定的Java类型T取词为type,表示一种具体的Java类型K取词为key,表示Java键值对中的键V取词为value,表示Java键值对中的值E取词为element,表示元素?和T在类型表示上的区别?表示的泛型参数不一定,即表示的类型不一定是相同的例如:publicintMyList(List&lt;?extendsNumber&...

elasticsearch的启动和关闭命令

1、启动elastic切换到elasticsearch安装目录的bin目录下,执行如下命令即可./elasticsearch-d注意:新版本的Es是不支持liunx的root用户启动的,若当前用户时root用户,需要切换到其他用户,切换用户的命令如下:su用户名2、启动可视化查询界面切换到可视化界面kibana的bin命令下,执行如下命令即可nohup./kibana&amp;3、关闭elasti...

Android强制设置横屏或竖屏

发布时间:2016-05-20 ANDROID
原文地址:点击打开链接在Activity的onCreate方法中的setContentView(myview)调用之前添加下面代码requestWindowFeature(Window.FEATURE_NO_TITLE);//隐藏标题getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.Layou...

Android禁止横屏竖屏切换

发布时间:2015-12-29 ANDROID
在AndroidManifest.xml中找到需要设置横竖屏切换的Activity在里面加入: android:screenOrientation="portrait" #禁止屏幕横竖切换,portrait为纵向,landscape为横向例如:&lt;activityandroid:name="com.example.welcome.WelcomeActivity"android:label="@...

树的三种遍历原理及实现

发布时间:2022-10-18 数据结构 算法 JAVA
树的三种遍历一棵树的三种遍历方式:先序遍历,中序遍历,后序遍历。前中后三种顺序其实指的是根的顺序。先序遍历:根节点、左子树、右子树中序遍历:左子树、根节点、右子树后序遍历:左子树、右子树、根节点所以就是说先中后的顺序都是指根节点,除了根节点之外都是先左子树后右子树举个例子:遍历结果:前序:FCADBEHGM中序:ACBDFHEMG后序:ABDCHMGEF代码实现:树结构构造代码:/***树结构*/...

使用Myeclipse时遇到的几个错误

发布时间:2012-08-27 JAVA 开发工具
ava.lang.UnsupportedClassVersionError:com/test/Add:Unsupportedmajor.min50\高版本编译,低版本运行,在项目右键properties-&gt;javaCompiler-&gt;选择对应的JDK版本UnabletolocatetheJavacCompilerin:C:\ProgramFiles\Java\jre7\..\lib\t...

软件设计模式之工厂模式(JAVA)

发布时间:2015-01-09 JAVA 设计模式
什么是工厂模式?工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。著名的Jive论坛,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见。因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如Aa=newA()工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑使用工厂模式,虽然这样做,可能多做一些工作,...

JavaWeb温习之HttpServletResquest对象

发布时间:2017-03-30 JAVA 测试 设计模式
  HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息。1.Request常用方法1.1获得客户机信息1getRequestURL方法返回客户端发出请求时的完整URL。2getRequestURI方法返回请求行中的资源名部分。3getQueryString...

JavaWeb温习之Session对象

发布时间:2017-03-30 JAVA WEB.XML
1.Session简单介绍  在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。2.Session和Cookie的主要区别...

「磨金石教育学员插画作业」什么是日系插画?

今天磨金石教育给大家分享一下学员们的日系插画作业。分享之前,我们先来了解一下,什么是日系插画。什么是日系插画?日系插画早在上个世纪就开始在全球流行了,且一直有不错的知名度,用户群体也比较深厚。日系插画最鲜明的一个特点就是比较平面化,其次适当夸张、风格唯美、配色明亮也是日系插画的特点。日系插画中会包含一些日本的传统图案和物件,民族特征比较鲜明。日系插画发展良久,收获了很多爱好者。日系画风插画有哪些共...

ActiveX and Com

发布时间:2007-01-24 C/C++ 开发工具 JAVA
一、ActiveX的由来ActiveX最初只不过是一个商标名称而已,它所涵盖的技术并不是各自孤立的,其中多数都与Internet和Web有一定的关联。更重要的是,ActiveX的整体技术是由Microsoft的COM(ComponentObjectModel,组件对象模型)构筑的。但不要误认为ActiveX是定义了所有包含基于COM的技术。COM与MicrosoftOffice和Windows以及...

软件工程学习(七)

发布时间:2022-11-02 学习 软件工程
   学习《软件工程》12.4、12.7、12.8节软件体系结构风格层次结构层次结构系统被分为若干层次,每一层之间通过接口互相调用和返回。下层构建向上层构建提供服务。客户机/服务器体系结构两层C/S体系结构(胖客户端结构)服务器只负责数据的管理用户机实现应用逻辑和用户的交互缺点:客户端负担过重,可扩展性不好分类:三层C/S结构 把应用系统分为:表示层、功能层、数据层,逻辑上相互独立。优点:1.降低...

计算机毕业设计校园垃圾分类智能管理系统

发布时间:2022-11-08 JAVA 开发语言
计算机毕业设计校园垃圾分类智能管理系统计算机毕业设计校园垃圾分类智能管理系统本源码技术栈:项目架构:B/S架构开发语言:Java语言开发软件:ideaeclipse前端技术:Layui、HTML、CSS、JS、JQuery等技术后端技术:JAVA运行环境:Win10、JDK1.8数据库:MySQL5.7/8.0源码地址:https://pan.baidu.com/s/1SbVg4MZ92YRU27...

《这就是软件工程师》读后感

发布时间:2022-10-29 学习
最近几周看了学长推荐的《这就是软件工程师》这本书,这本书也是很通俗易懂的简述了软件工程师,也介绍了从入门小白到行业大神,让我们看到了计算机的发展史,还有好多将要面对的问题,总之,如果以后还有看的时间,我会更加认真的读一遍!第一部分:行业地图主要是介绍了软件行业之前的状况,到目前可能也很适合。软件工程师不是只会搬砖的码农,而是一群简单务实的人,他们通常专注于自己喜欢的事情,很少关注外在的东西,So,...

存储过程学习

发布时间:2022-10-19 学习 SQL 数据库 MYSQL笔记
项目驱动型人才需求:查询未使用过的字段菜鸟教程:存储过程DELIMITER$$CREATEPROCEDUREinsert_avaliable_ispk()BEGIN --记录游标是否循环完DECLAREfinishedintDEFAULT0; --记录游标是否循环完DECLAREfinished2intDEFAULT0; --拼接后的字段值DECLAREfield_name_trueVARCHAR...

精通struts技术第3章(1) (转)

发布时间:2007-08-16 JAVA 测试 WEB.XML
精通struts技术第3章(1)(转)[@more@]第三章:开始学习strutsXML:namespaceprefix=ons="urn:schemas-microsoft-com:Office:office"/&gt; 在这一章,我们将开始学习Struts。在开始之前,我们必须先安装和配置Struts应用。我们将创建一个简单的应用来显示Struts是如何工作的。这一章我们将提供一个Struts...

精通struts技术第二章(5) (转)

发布时间:2007-08-17 JAVA
精通struts技术第二章(5)(转)[@more@]&lt;JSP:include&gt;XML:namespaceprefix=ons="urn:schemas-microsoft-com:Office:office"/&gt;用于在JSP中包含静态或动态的web组件。语法如下:表2.9描述了的属性:属性说明page要包含的资源的地址,基于URLflush指明是否缓冲。通过一个例子来对incl...

精通struts技术第二章(4) (转)

发布时间:2007-08-17 JAVA
精通struts技术第二章(4)(转)[@more@]标准ActionsXML:namespaceprefix=ons="urn:schemas-microsoft-com:Office:office"/&gt;JSP标准Actions是预先定义的标签。这标签很容易用来封装action。在JSP中有两种类型的标准action。第一种:JavaBean,第二种:由另外的标准action组成。Java...

java-net-php-python-s2sh教学管理平台hsg8229AGA2修改回复计算机毕业设计程序

发布时间:2022-11-15 开发语言 JAVA PHP
java-net-php-python-s2sh教学管理平台hsg8229AGA2修改回复计算机毕业设计程序java-net-php-python-s2sh教学管理平台hsg8229AGA2修改回复计算机毕业设计程序本源码技术栈:项目架构:B/S架构开发语言:Java语言开发软件:ideaeclipse前端技术:Layui、HTML、CSS、JS、JQuery等技术后端技术:JAVA运行环境:Wi...

用Java判断闰年

发布时间:2022-11-19 JAVA 开发语言
publicstaticbooleanisLeapYear(intyear){if((year%4==0&amp;&amp;year%100!=0)||(year%400=0)){returntrue;elsefalse;}}publicstaticvoidmain(String[]args){booleanflg=isLeapYear(1900)System.out.printf(flg);}...

Java基础 DAY15

发布时间:2022-10-08 JAVA JVM JAVA基础 数据结构
项目设计-程序框架图(分层模式=》当前软件比较复杂,需要模式管理)packagecom.houserent;importcom.houserent.view.HouseView;publicclassHouseRentApp{publicstaticvoidmain(String[]args){//创建HouseView对象,并且显示主菜单,是整个程序的入口byteb1=123;b1+=10000...

hdu 1200 To and Fro(简单模拟或DP)

发布时间:2015-03-15 JAVA PHP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1200ToandFroTimeLimit:2000/1000MS(Java/Others)    MemoryLimit:65536/32768K(Java/Others)TotalSubmission(s):5129    AcceptedSubmission(s):3550ProblemDescri...

如何在PADS里加入封装库

发布时间:2022-09-09 JAVA 前端 服务器
1,打开PADSLOGIC,打开左上角的“文件”,点击进入“库(L),”选择“管理库列表选项”,(为了不与先前的库混乱起来可以先全选所有的库然后删除,也可以不删除,随个人习惯)点击添加,找到放置库文件的路径然后将库文件PT文件添加进去,至此库文件添加成功。若想建立自己的封装库,可以选择“新建库(W)”,将新建库保存在自己的想要的位置,确定,然后再去到管理库列表将自己的库文件添加进去。       ...

[Java中级教程]第四讲 动画的制作-----转

发布时间:2007-07-18 CLASS IMPORT THREAD TIMER JAVA 任务
第四讲动画的制作■前言  在前一讲中我们讲述了如何利用低级API制作图表应用程序的方法。如果仅仅是图表内容的表示,那么在WEB上就可以用静止的页面表示。但是在手机应用程序中表示的话,就能让图表内容具有动感。这就是应用程序与WEB的区别,这也正是其优点所在。在本讲中我们将进一步讲述如何在手机应用程序中制作动画,并详细介绍其具体操作方法。■4-1动画  基本上,动画能够表现出文字、图形、图片等的描绘位...

Apache Shiro 反序列化漏洞(Shiro-550 CVE-2016-4437)

发布时间:2020-12-03 JAVA APACHE 开发语言 SERVLET
0x00漏洞描述ApacheShiro是一款开源安全框架,提供身份验证、授权、密码学和会话管理。Shiro框架直观、易用,同时也能提供健壮的安全性。ApacheShiro1.2.4及以前版本中,加密的用户信息序列化后存储在名为remember-me的Cookie中。攻击者可以使用Shiro的默认密钥伪造用户Cookie,触发Java反序列化漏洞,进而在目标机器上执行任意命令只要rememberMe...

工程伦理--3.3 传统理论及方法的局限性

发布时间:2022-10-22 工程伦理 学习 经验分享
2022–学习通工程伦理课后习题1【单选题】()在职业伦理章程中对理性的彰显与尊崇,极易导致工程师把遵守和服从某些有助于实现当前工程目标的规范看作是履行工程师职责和义务的最低要求。A、功利主义和契约论B、义务论和契约论C、功利主义和实用主义D、功利主义和义务论我的答案:D2【多选题】传统理论及方法的局限性越来越突出地表现为()。A、价值标准的多元化B、工具意义上的理性化C、规范解释的矛盾性D、道德...

第五次java作业

发布时间:2017-03-30 JAVA 第五次
publicclasshomework1{/***@paramargs*/publicstaticvoidmain(String[]args){//TODOAuto-generatedmethodstubStringstr1="耿丹计算机Java20170320";System.out.println(str1.substring(9,17));}}packageclasswork;publicc...

Java two dimensional array

发布时间:2017-12-29 JAVA TWO
twodimensionalarray拥有两个不同的内存地址int[][]a=newint[3][];a[0]=newint[2];a[1]=newint[3];a[2]=newint[4];a[1][2]=5;...