当前位置: 首页 > news >正文

Scala 02——Scala OOP

在这里插入图片描述
在这里插入图片描述

文章目录

  • Scala 02——Scala OOP
      • 前序
          • 1. 类的基本结构
          • 2. 普通类和数据类的区别
      • 继承
          • 1. extends
          • 2. override
      • 抽象类
          • 抽象类的特点
      • 单例对象
          • 1. 定义
          • 2. 场景
          • 3. 方法
            • 3.1 方法定义
            • 3.2 方法调用
      • 特质
          • 1. 抽象类和特质的区别
          • 2. 强制混入语法
          • 3. 静态混入和动态混入
      • 内部类
          • Java和Scala内部类的区别
          • 当类与对象存在伴生关系时,类的写法
            • 内部类定义在实例中(①):
            • 内部类定义在伴生对象中(②):
      • 样例类
      • 枚举
          • 定义
      • 泛型
          • 1. 定义
          • 2. 泛型边界
          • 3. 协变、逆变、不变
      • 包与包对象
          • 1. 命名规则:
          • 2. 包的作用
          • 3. 导包的不同方式
          • 4. 多级包的导包
          • 5. 包对象
            • 5.1 定义
            • 5.2 包对象的意义

Scala 02——Scala OOP

前序

为什么说Scala是纯粹的OOP?

  • 不支持基本类型,一切皆为对象:Byte,Int…

    • Scala会将基本类型视为对象,还是在JVM上运行,自动与Java的基本数据类型完成拆装箱的操作。
  • 不支持静态关键字:static

    • Java和Scala的静态概念的区别

      • Java
        • Java的静态成员:在Java中,静态成员(属性或方法)是指属于类本身而非类的实例的成员,静态成员可以在没有创建类的实例的情况下被访问。
      • Scala
        • Scala的静态类型系统:Scala被称为静态语言,与其属性和方法是否属于对象无关,是因为在Scala中,所有的类型检查都是在编译时完成的,而非运行时。
        • Scala的单例对象:为了提供类似于Java中静态成员的功能,Scala引入了单例对象。
    • 编译时检查和运行时检查的区别

      • 编译时检查:在程序运行之前发现错误【Java Mysql Scala…】
        • 类型检查
        • 语法检查
        • 结构检查
        • 访问规则检查
      • 运行时检查:在运行时检查,通常由执行环境执行(如虚拟机或解释器)【解释型语言 或 脚本…】
    • 静态和动态的区别

      • 静态是编译时检查,动态是运行时检查

      • expression = "3 * 7 + 2"
        result = eval(expression)
        print(result)  # 输出 23
        

        对于静态语言来说,expression的结果是一个内容是表达式的字符串。

        而对于动态语言来说(以Python的eval()函数为例),eval() 函数允许执行一个字符串形式的表达式,并返回表达式的结果。是因为在运行前没有进行类型检查,编译器视其为表达式而非文本。

  • 支持类型推断,类型预定,动静结合

    • 动静结合

    • 类型预定

      • 在运行时保留类型信息
    • 类型推断

      • 泛型编程中的不变、协变、逆变

        • 泛型类型

          • 定义

            1. 容器类

              • 列表,如List[T]
              • 集合,如Set[T]
              • 映射,如Map<K,V>
            2. 函数和方法

              def func[T](x:T):t = x
              
        • 不变

          • 定义

            泛型类型 G[A] 和泛型类型 G[B] 的关系与类型 A 和类型 B的关系无关

        • 协变

          • 定义

            如果类型 A 是类型 B 的子类型,泛型类型 G[A] 是泛型类型 G[B] 的子类型。

            假设我们有一个泛型类Container[+A],其中A是一个协变类型参数。如果DogAnimal的子类,那么Container[Dog]也应该被看作是Container[Animal]的子类型。这意味着你可以用Container[Dog]的实例去替换Container[Animal]的实例。

          class Animal
          class Dog extends Animalclass Container[+A]val dogs: Container[Dog] = new Container[Dog]
          val animals: Container[Animal] = dogs // 正确,因为Container是协变的
          
          • 适用场景

            作为输出,可以安全地从Container[Animal]中读取Animal类型的对象,不管容器实际包含的是Dog还是哪种Animal的子类型。

        • 逆变

          • 定义

            如果类型 A 是类型 B 的子类型,泛型类型 G[B] 是泛型类型 G[A] 的子类型。

            假设我们有一个泛型类Container[-A],其中A是一个逆变类型参数。如果DogAnimal的子类,那么Container[Animal]应该被看作是Container[Dog]的子类型。这意味着你可以用Container[Animal]的实例去替换Container[Dog]的实例。

            class Animal
            class Dog extends Animalclass Printer[-A] {def print(value: A): Unit = println(value)
            }val animalPrinter: Printer[Animal] = new Printer[Animal]
            val dogPrinter: Printer[Dog] = animalPrinter // 正确,因为Printer是逆变的
            
          • 适用场景

            方法是通用的,面向各种不同类型,可以用更宽泛的类型实例替代更具体的类型实例。

在这里插入图片描述

1. 类的基本结构

类的本质就是模板,我们根据以下代码模板学习Scala类的基本结构:

  • 主构造器(构造参数)
  • 属性
  • 方法
  • 辅助构造器
  • 重写方法
    • toString的重写接近于JSON的表达方式
// 主构造器:类自身
class Point(x:Int,y:Int){ // 没有构造方法,通过构造参数列表实现对象创建// 属性:必须赋初值,且赋的是主构造器的参数private var _x:Int = x // 私有属性的命名方式通常为`{_参数}`private var _y:Int = y// 方法def updatePoint(x:Int,y:Int): Unit = {_x = x_y = y}// 辅助构造器// 辅助构造器必须调用主构造器// 辅助构造器中有两个this,第一个this是辅助构造器的名称,第二个this是调用主构造器。def this() = this(-1,-1)// getter 和 setter 方法def getX=_xdef getY=_ydef setX(x:Int)={_x=x}def setY(y:Int)={_y=y}  // 重写方法override def toString: String = {s"(X:${_x},Y:${_y})"}
}
修饰符类(class)伴生对象(object)子类(subclass)同包(package)全局(world)
default(public)YYYYY
protectedYYYNN
privateYYNNN
2. 普通类和数据类的区别
  • 普通类:可以有主构造器,也可以有辅助构造器,可以有属性,可以有方法,可以有重写方法,可以有get、set方法

  • 数据类:只能有主构造器,不能有辅助构造器,只能有属性,不能有方法,不能有重写方法,不能有get、set方法

继承

1. extends
class ColorPoint(x:Int,y:Int,color:Boolean) extends Point(x:Int,y:Int) {var _color:Boolean = colorprivate def getColor = if(_color) "red" else "black"override def move(offsetX: Int, offsetY: Int): Unit = {_x += offsetX*2_y += offsetY*2println(s"$getColor point moved to {${_x},${_y}}")}override def toString: String = s"$getColor point ${super.toString}"
}val cp = new ColorPoint(0,0,true)
println(cp)
cp.move(12,25)
2. override

在重写方法时:

  • 子类重写父类抽象方法推荐添加override关键字
  • 子类重写父类非抽象方法必须添加override关键字

抽象类

abstract class Shape {// 抽象方法def draw()// 普通方法def show:Unit = println("this is Shape")
}
抽象类的特点
  • 可以有抽象方法(Scala中没有方法体即为没有=号及=号后面的部分)
  • 无法被实例化
  • 使用abstract关键字修饰

单例对象

1. 定义
  • 关键字:object

  • 单例对象用于管理共享资源或共通逻辑,封装静态工具方法,提供了便携创建其他实例的工厂方法

  • 可以直接通过单例对象名.属性或方法来访问,类同于Java的静态属性和方法

  • 采取惰性模式,第一次被访问时被创建

  • main方法必须定义在单例对象中,才能被JVM识别

  • 同名的类和单例对象形成绑定关系,并称之为伴生类和伴生对象

    • 伴生类和其伴生对象可以相互访问对方的私有成员(包括私有方法或私有变量)
object Util{var PI:Float = 3.14fvar count:Int = 0def resume:Unit = println("this is my resume.")
}// 调用
Util.resume
class Commodity(sku:String,price:Float) {private val _sku:String = skuprivate val _price:Float = pricedef getSKU:String={_sku}def getPrice:Float={discount(_price)}// 伴生类自由访问伴生对象中的所有变量def getSalePrice=discount(_price)override def toString:String={s"SKU:${_sku},PRICE:${_price}"}
}
object Commodity{// 商品折扣private var _discount:Float = 1.0f// 包裹def apply(sku:String,price:Float):Commodity = new Commodity(sku,price)// 拆解:伴生对象中可以自由访问伴生类中所有资源def unapply(arg:Commodity):(String,Float) = (arg.getSKU,arg.getPrice)// 自定义方法def setDiscount(discount:Float)=_discount=discountdef discount(price:Float)=price*_discount
}
2. 场景

工具类

3. 方法
3.1 方法定义

apply 方法

def apply(sku:String,price:Float):Commodity = new Commodity(sku,price)

unapply 方法

def unapply(arg:Commodity):(String,Float) = (arg.getSKU,arg.getPrice)
3.2 方法调用
object Person {// apply方法允许不使用new关键字就能创建Person实例def apply(name: String, age: Int): Person = new Person(name, age)// unapply方法支持模式匹配,提取Person对象的属性def unapply(p: Person): Option[(String, Int)] = {if (p != null)Some((p.name, p.age))elseNone}
}// 使用apply方法隐式创建Person对象
val alice = Person("Alice", 25)  // 实际调用 Person.apply("Alice", 25)// 使用模式匹配,其中unapply方法被隐式调用
alice match {case Person(n, a) if a >= 18 => println(s"$n is an adult, aged $a.")case Person(n, _) => println(s"$n is a minor.")
}

特质

1. 抽象类和特质的区别
  • 抽象类可以传构造参数,而特质不能传构造参数;抽象类可以有构造代码(抽象属性结合参数的构造),而特质没有构造代码。

  • 一个类可以继承多个特质但只能继承一个抽象类

  • 抽象类针对的是高复用性的功能,而特质更多是针对定制化的功能。

  • 抽象类可以提供方法的默认实现,减少了子类重复相同代码的需要。

2. 强制混入语法

定义:要求其子类必须重写这个特质的方法,并允许在基类中使用特质的方法

abstract class Animal(brand:String){var name:Stringval _type:String = branddef roar:Unitdef me = s"${_type}:$name"
}
trait ByFoot {def walk()def run()
}
trait ByFly{def fly()
}
trait BySwim{def swim()
}
class Cat(nickname:String) extends Animal("猫") with ByFoot {override var name: String = nicknameoverride def roar: Unit = println(me+"喵喵喵")override def walk: Unit = println(me+"悠闲地漫步")override def run: Unit = println(me+"正在快速跑")
}class Bird(nickname:String) extends Animal("鸟") with ByFly with ByFoot {override var name: String = nicknameoverride def roar: Unit = println(me+"叽叽叽")override def fly(): Unit = println(me+"正在飞")override def walk(): Unit = println(me+"正在闲逛")override def run(): Unit = println(me+"正在快速跑")
}class Fish() extends Animal("鱼"){self:BySwim=> // 等同于 this:BySwim=>override var name: String = _override def roar: Unit = ???
}
3. 静态混入和动态混入

静态混入和动态混入的核心区别:

  • 静态混入:在创建对象之前,就混入特质(该类事物的通用特征)
  • 动态混入:在创建对象之后,再混入特质(特殊事物的特殊特征)
// 静态混入
val bird = new Bird("小雀")
bird.run()
bird.fly()
bird.walk()
bird.roar// 动态混入
val fish3 = new Fish() with BySwim with ByFoot {override def swim(): Unit = ...override def walk(): Unit = ...override def run(): Unit = ...
}

内部类

Java和Scala内部类的区别
  • Java中内部类是【外部类的成员】
InClass ic = new OutClass.InClass()
  • Scala中内部类是【外部类对象的成员】
val oc = new OutClass();
val ic = new oc.InClass();
当类与对象存在伴生关系时,类的写法
class OutClass {// ①/*class InClass{override def toString: String = "InClass"}*/private val in:InClass = new InClassoverride def toString: String = s"OutClass{${in}}"
}
object OutClass{// ②/*class InClass{override def toString: String = "InClass"}*/
}
内部类定义在实例中(①):

这意味着InClassOutClass的一个具体实例关联。

val oc = new OutClass
println(oc)
val ic: oc.InClass = new oc.InClass()
内部类定义在伴生对象中(②):

这里的OutClass.InClass是一个整体,伴生对象能够通过伴生对象名称直接获取内部的属性或方法。

val oi: OutClass.InClass = new OutClass.InClass

样例类

/*描述【不可变值】的对象样例类构造参数默认声明为 val,自动生成 getter样例类的构造参数若声明为 var,自动生成 getter & setter样例类自动生成伴生对象样例类自动实现的其他方法:toString,copy,equals,hashCode样例类伴生对象实现的方法:apply, unapply(用于模式匹配)
*/
// 普通类的模式匹配案例
case class Student(name:String, age:Int)	// 构造参数默认 val
case class Point(var x:Int,var y:Int)		// var 需要显式声明

枚举

定义

单例对象通过继承Enumeration实现枚举创建,通常用于定义一个有限取值范围的常量。

class EnumTest {object WeekDay extends Enumeration {val MON = Value(0)val TUE = Value(1)val WEN = Value(2)val THU = Value(3)val FRI = Value(4)val SAT = Value(5)val SUN = Value(6)}val d = WeekDay.THUval info: String = d match {case WeekDay.MON => "Monday"case WeekDay.TUE => "Tuesday"case WeekDay.WEN => "Wednesday"case WeekDay.THU => "Thursday"case WeekDay.FRI => "Friday"case WeekDay.SAT => "Saturday"case WeekDay.SUN => "Sunday"}
}

泛型

1. 定义

类型参数化,主要用于集合。

不同于 Java 泛型被定义在 [] 中,Scala泛型更为自由

// 也可以定义在可变参数中
class MyArray[T](items:T*) {def join(sep:String) = items.mkString(sep)
}
2. 泛型边界
  • [T<:F] 表示 T 必须是F的子类

  • [T>:F] 表示 T 必须是F的父类

class F
class S extends Fclass Many[T<:F] (t:T){...
}
3. 协变、逆变、不变
  • 协变:[+T] 若A是B的子类,则 C[A]为C[B]的子类
  • 逆变:[-T] 若A是B的子类,则 C[B]为C[A]的子类
  • 不变:[T] 默认

包与包对象

1. 命名规则:

可以以字母数字下划线点开头,不能以数字开头

2. 包的作用
  • 命名空间管理:每个包提供了一个独立的命名空间
  • 作用域控制:包允许细粒度的访问控制
  • 逻辑分隔:将功能相似的类和对象放在同一个包中,使代码结构更清晰
3. 导包的不同方式
  • import导包语句可以出现在任何地方
  • import可以导入包、类、类成员
import com.kgc.Person				// 方便使用类 Person
import com.kgc._					 // 方便使用 com.kgc 包中的所有类
import com.kgc.Person._			// 方便使用类 Person 中的所有属性和方法
import com.kgc.{Person=>PS,Book}	// 只导入包中 Person和Book,并将Person重命名为PS
4. 多级包的导包
package cha03{import cha03.util.Sortsobject PackageTest {def main(args: Array[String]): Unit = {val array: Array[Int] = Array(3, 1, 5, 4, 2)Sorts.insertSort(array)array.foreach(println)}}
}package cha03.util{object Sorts{def insertSort(array: Array[Int]): Unit ={import scala.util.control.Breaks._for(i<- 1 until array.length){val t = array(i)var j = i-1breakable({while (j>=0){if(array(j)>t){array(j+1) = array(j)}else{break()}j-=1}})array(j+1) = t}}}
}
5. 包对象
5.1 定义

包中可以包含:类、对象、特质…

包对象中可以包含:除了类、对象、特质外,还可以包含变量和方法

5.2 包对象的意义

常用的函数、常量和类型可以在包对象中定义,这允许在相同包的任何地方访问这些共享资源。

package cha03.util{import java.util.Calendar// 包对象package object Constants{// 变量val PI:Float = 3.14f// 方法def getQuarter(month:Int)=(month-1)/3+1// 类class DataFormat(year:Int,month:Int,day:Int,hour:Int,minute:Int,second:Int,millis:Int){private var _year:Int = yearprivate var _month:Int = monthprivate var _day:Int = dayprivate var _hour:Int = hourprivate var _minute:Int = minuteprivate var _second:Int = secondprivate var _millis:Int = millisdef this(year:Int,month:Int,day:Int){this(year,month,day,0,0,0,0)}def stdYMD():String = s"${_year}-${_month}-${_day}"def stdFull():String = s"${_year}-${_month}-${_day} ${_hour}:${_minute}:${_second}.${_millis}"def timestamp():Long = {val cld = Calendar.getInstance()cld.set(_year,_month,_day,_hour,_minute,_second)cld.set(Calendar.MILLISECOND,555)cld.getTimeInMillis}}}object DataFormat{def apply(year: Int, month: Int, day: Int, hour: Int, minute: Int, second: Int, millis: Int): DataFormat = new DataFormat(year, month, day, hour, minute, second, millis)def apply(year: Int, month: Int, day: Int): DataFormat = new DataFormat(year, month, day)}
}

在这里插入图片描述

相关文章:

Scala 02——Scala OOP

文章目录 Scala 02——Scala OOP前序类1. 类的基本结构2. 普通类和数据类的区别 继承1. extends2. override 抽象类抽象类的特点 单例对象1. 定义2. 场景3. 方法3.1 方法定义3.2 方法调用 特质1. 抽象类和特质的区别2. 强制混入语法3. 静态混入和动态混入 内部类Java和Scala内部…...

FFmpeg: 自实现ijkplayer播放器--04消息队列设计

文章目录 播放器状态转换图播放器状态对应的消息&#xff1a; 消息对象消息队列消息队列api插入消息获取消息初始化消息插入消息加锁初始化消息设置消息参数消息队列初始化清空消息销毁消息启动消息队列终止消息队列删除消息 消息队列&#xff0c;用于发送&#xff0c;设置播放…...

Redis中的集群(四)

集群 槽指派 CLUSTER ADDSLOTS命令的实现 CLUSTER ADDSLOTS命令接受一个或多个槽作为参数&#xff0c;并将所有输入的槽指派给接收该命令的节点负责: CLUSTER ADDSLOTS <slot> [slot ...]CLUSTER ADDSLOTS命令的实现可以用以下伪代码来表示: def CLUSTER_ADDSLOTS(*…...

JookDB下载安装使用

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…...

百度OCR身份证识别C++离线SDKV3.0 C#对接

百度OCR身份证识别C离线SDKV3.0 C#对接 目录 说明 效果 问题 项目 代码 下载 说明 自己根据SDK封装了动态库&#xff0c;然后C#调用。 SDK 简介 本 SDK 适应于于 Windows 平台下的⾝份证识别系统,⽀持 C接⼜开发的 SDK,开发者可在VS2015 下⾯进⾏开发&#xff08;推荐…...

Web前端 Javascript笔记1

为什么学习 JavaScript? JavaScript 是 web 开发人员必须学习的 3 门语言中的一门&#xff1a; HTML 定义了网页的内容CSS 描述了网页的布局JavaScript 控制了网页的行为 JavaScript 是可插入 HTML 页面的编程代码。 JavaScript 插入 HTML 页面后&#xff0c;可由所有的现代浏…...

Git回滚版本并push到远端master

1、查看日志 git log 2、还原最近的版本 () --git reset --hard commit-id 如&#xff1a;git reset --hard d84da14bf2743683eca7a015f56114faaa344f42 3、覆盖分支版本 git push -f origin dev 回滚本地master完成后&#xff0c;将回滚后的代码push到远端master&#xf…...

MAC: 自己制作https的ssl证书(自己签发免费ssl证书)(OPENSSL生成SSL自签证书)

MAC: 自己制作https的ssl证书(自己签发免费ssl证书)(OPENSSL生成SSL自签证书) 前言 现在https大行其道, ssl又是必不可少的环节. 今天就教大家用开源工具openssl自己生成ssl证书的文件和私钥 环境 MAC电脑 openssl工具自行搜索安装 正文 1、终端执行命令 //生成rsa私钥&…...

mac配置Jmeter环境

mac配置Jmeter环境 一、安装jmeter二、Jmeter目录结构三、汉化Jmeter四、改变主题外观五、jmeter安装第三方插件六、jmeter基础入门案例 一、安装jmeter 第一步先自行配置好电脑的jdk环境 1、官网下载jar包 https://jmeter.apache.org/download_jmeter.cgi 2、解压到软件你自己…...

Linux虚拟化————KVM

1、安装kvm虚拟化套件 [rootbogon ~]# yum -y install virt* 2、启动服务 [rootbogon ~]# systemctl start libvirtd [rootbogon ~]# systemctl status libvirtd ● libvirtd.service - Virtualization daemonLoaded: loaded (/usr/lib/systemd/system/libvirtd.service; di…...

【b站李同学的Lee】Part 2 模块化开发 NodeJS+Gulp基础入门+实战

课程地址&#xff1a;【NodeJSGulp基础入门实战】 https://www.bilibili.com/video/BV1aE411n737/?share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 目录 4 Node.js模块化开发 4.1 JavaScript开发弊端 4.1.1 文件依赖 4.1.2 命名冲突 4.2 生活中的…...

AI大模型日报#0415:贾佳亚团队新作王炸、马斯克首款多模态大模型、ChatGPT to B

导读&#xff1a; 欢迎阅读《AI大模型日报》&#xff0c;内容基于Python爬虫和LLM自动生成。目前采用“文心一言”生成了每条资讯的摘要。标题: 融合ChatGPTDALLE3&#xff0c;贾佳亚团队新作开源&#xff1a;识图推理生图一站解决 摘要: 贾佳亚团队推出了多模态模型Mini-Gem…...

基于GRU实现评论文本情感分析

一、问题建模 在线评论的细粒度情感分析对于深刻理解商家和用户、挖掘用户情感等方面有至关重要的价值&#xff0c;并且在互联网行业有极其广泛的应用&#xff0c;主要用于个性化推荐、智能搜索、产品反馈、业务安全等。此博文&#xff0c;共包含6大类20个细粒度要素的情感倾…...

【C 数据结构】线性表

文章目录 【 1. 线性表 】【 2. 顺序存储结构、链式存储结构 】【 3. 前驱、后继 】 【 1. 线性表 】 线性表&#xff0c;全名为线性存储结构&#xff0c;线性表结构存储的数据往往是可以依次排列的&#xff08;不考虑数值大小顺序&#xff09;。 例如&#xff0c;存储类似 {1…...

C++初级----list(STL)

1、 list介绍 1.1、 list介绍 1.list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 1. list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向 其前一…...

web安全学习笔记(9)

记一下第十三课的内容。 准备工作&#xff1a;在根目录下创建template目录&#xff0c;将login.html放入其中&#xff0c;在该目录下新建一个reg.html。在根目录下创建一个function.php 一、函数声明与传参 PHP中的函数定义和其他语言基本上是相同的。我们编辑function.php …...

【Python-基础】字符串合集

字符串格式化 f # 例如: # f{train_path}/{f}: 将train_path字符串和f字符串结合 # f{root}.csv:将root字符串和.csv字符串结合判断字符串是否以…结尾 root.endswith(".csv") # True未待完续…...

Scala之List

列表 不可变列表(List) 在Scala中&#xff0c;通过List来定义不可变列表&#xff0c;需要注意的是&#xff0c;List本身是一个抽象类&#xff0c;所以并不能直接使用List来构建对象&#xff0c;需要使用它的伴生对象来构建 package com.fesco.listimport scala.::object ListD…...

Springboot+Vue项目-基于Java+MySQL的在线视频教育平台系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…...

Java IO流-字节流

简介 IO流的输入与输出&#xff0c;都在站在内存的角度来看的&#xff0c;因为毕竟是和内促你打交道的嘛&#xff01; 分类 IO流是可以根据方向&#xff0c;或者最小单位进行划分的 上述两两结合一下&#xff0c;就得到四种大的分类 IO流的继承体系 字节输入流InputStream 创建…...

第十五届蓝桥杯复盘python大学A组——试题B 召唤数学精灵

按照正常思路解决&#xff0c;由于累乘消耗大量时间&#xff0c;因此这不是一个明智的解决方案。 这段代码执行速度非常慢的原因在于它试图计算非常大的数的阶乘&#xff08;累乘&#xff09;&#xff0c;并且对于每一个i的值都执行这个计算。阶乘的增长是极其迅速的&#xff…...

网络通信——常见结构及强联网游戏和弱联网游戏区别

声明&#xff1a;本文为个人笔记&#xff0c;用于学习研究使用非商用&#xff0c;内容为个人研究及综合整理所得&#xff0c;若有违规&#xff0c;请联系&#xff0c;违规必改。 网络通信——常见结构及强联网游戏和弱联网游戏区别 文章目录 网络通信——常见结构及强联网游戏和…...

如何安装PyFluent

0.什么是PyFluent? 官方介绍如下&#xff1a; PyFluent 是 PyAnsys 生态系统的一部分&#xff0c; 允许您在所选的 Python 环境中结合使用 Fluent 与其他 PyAnsys 库和外部 Python 库一起使用。 PyFluent 实现了客户端-服务器体系结构。它使用谷歌遥控器 过程调用或 gRPC 接…...

Qt 2 QMapQHashQVector类实例

1. QMap // 1:QMap的使用// 创建一个QMap 实例 key 为 QString value 为 intQMap<QString,int> Grade;// 插入方式有两种插入方式// 1.map[key] valueGrade["语文"] 90;Grade["数学"] 120;// 2.map.insert(key,value);Grade.insert("英语&qu…...

使用Git将文件夹上传到Github以及使用Git LFS上传大文件

使用Git将文件夹上传到Github以及使用Git LFS上传大文件...

1.SCI各模块

1.学会“抄” 写论文&#xff0c;一定要学会“抄”&#xff01;这样才能事半功倍&#xff0c;尤其是对于初次写作的新手&#xff0c;否则写作过程一定会让你痛不欲生&#xff0c;而且写出来的东西就是一坨shi&#xff0c;不仅折磨自己&#xff0c;也折磨导师。 写论文与建大楼…...

记录shell编程中$1,$@等符号的含义

笔者最近老是遇到shell中的$相关的题目&#xff0c;于是打算写篇文章记录一下。考虑到并没有特别多需要解释的内容&#xff0c;所以并不会进行介绍&#xff0c;上图上表上代码&#xff0c;让机器说话&#xff0c;machine always right test.sh #/bin/bash echo $# $# echo …...

单链表的应用

文章目录 目录1. 单链表经典算法OJ题目1.1 [移除链表元素](https://leetcode.cn/problems/remove-linked-list-elements/description/)1.2 [链表的中间节点](https://leetcode.cn/problems/middle-of-the-linked-list/description/)1.3 [反转链表](https://leetcode.cn/problem…...

手机副业赚钱秘籍:让你的手机变成赚钱利器

当今社会&#xff0c;智能手机已然成为我们生活不可或缺的一部分。随着技术的飞速进步&#xff0c;手机不再仅仅是通讯工具&#xff0c;而是化身为生活伴侣与工作助手。在这个信息爆炸的时代&#xff0c;我们时常会被一种焦虑感所困扰&#xff1a;如何能让手机超越消磨时光的定…...

(二十七)Flask之数据库连接池DBUtils库

目录: 每篇前言:DBUtils库模式一(底层使用threading.local实现):模式二:Flask中使用方式一:直接将DBUtils初始化放到settings.py文件中方式二:从utils文件夹中导入脚本使用DBUtils代码demo:每篇前言: 🏆🏆作者介绍:【孤寒者】—CSDN全栈领域优质创作者、HDZ核心…...

.net网站开发实训代码/百度产品优化排名软件

最近工作中&#xff0c;要做个客户端提醒的小工具&#xff1b;winform程序自然少不了要读取和应用程序同一个目录的配置文件(不是exe.config文件)&#xff1b; 要读取当前应用程序所在目录我立马想到了System.Environment.CurrentDirectory 来获取当前工作目录。程序运行似乎一…...

没有网站如何做cpa/深圳app推广平台

疑难杂症 该画廊特效的特点就是前后元素有层级关系。 我想很多人应该看过或者用过这个插件carousel.js&#xff0c;网上也有相关的教程。不知道这个插件的原型是哪个&#xff0c;有知道的朋友可以告诉我。 该插件相对完美&#xff0c;但是实际在项目中使用时却发现了一个令人…...

建设银行个人网银没有弹出网站/管理系统

1.视频剪辑软件功能对比 从表格中可以看出&#xff0c;对于一般的家庭用户使用上手难度在业余级及其以下难度的视频剪辑软件时&#xff0c;其功能已经足够满足需求。而PR这样的专业视频剪辑软件&#xff0c;则更适合于影视行业的从业人员使用。 2.盈利模式及售价 iMovie是苹果自…...

海南爱心扶贫网站是哪个公司做的/sem专业培训公司

https://www.jianshu.com/p/19e851a3edba...

牛 网站建设/夫唯seo视频教程

目 录 摘 要 I Abstract II 第1章 绪论 1 1.1 选题及意义 1 1.2 邮箱发展现状 1 1.2.1开源邮件系统 2 1.2.2国外商业邮件系统 2 1.2.3国内商业邮件系统 2 1.3研究内容 4 第2章 相关技术的理论概述 5 2.1 JSPServlet技术优势 5 2.2Mysql数据库的介绍 6 2.3 tomcat服务器介绍 6 2…...

北京网站公司哪家好/怎样策划一个营销型网站

文章目录1 Tomcat请求响应2 HttpServletRequest基本功能2.1 HttpServletRequest的功能2.2 request获取请求头数据2.3 request获取请求相关的其它方法1 Tomcat请求响应 Web服务器收到客户端的http请求&#xff0c;会针对每一次请求&#xff0c;分别创建一个用于代表请求的reque…...