Scala第七章节
Scala第七章节
scala总目录
章节目标
- 掌握继承和抽象类相关知识点
- 掌握匿名内部类的用法
- 了解类型转换的内容
- 掌握动物类案例
1. 继承
1.1 概述
实际开发中, 我们发现好多类中的内容是相似的(例如: 相似的属性和行为), 每次写很麻烦. 于是我们可以把这些相似的内容提取出来单独的放到一个类中(父类), 然后让那多个类(子类)和这个类(父类)产生一个关系, 从而实现子类可以访问父类的内容, 这个关系就叫: 继承.
因为scala语言是支持面向对象编程的,我们也可以使用scala来实现继承,通过继承来减少重复代码。
1.2 语法
- scala中使用extends关键字来实现继承
- 可以在子类中定义父类中没有的字段和方法,或者重写父类的方法
- 类和单例对象都可以有父类
语法
class/object A类 extends B类 { ..
}
叫法
- 上述格式中, A类称之为: 子类, 派生类.
- B类称之为: 父类, 超类, 基类.
1.3 类继承
需求
已知学生类(Student)和老师类(Teacher), 他们都有姓名和年龄(属性), 都要吃饭(行为), 请用所学, 模拟该需求.
- 方式一: 非继承版.
object ClassDemo01 {//1. 定义老师类.class Teacher{var name = ""var age = 0def eat() = println("老师喝牛肉汤!...")}//2. 定义学生类.class Student{var name = ""var age = 0def eat() = println("学生吃牛肉!...")}//main方法, 程序的主入口def main(args: Array[String]): Unit = {//3. 测试老师类.//3.1 创建对象.val t = new Teacher//3.2 给属性赋值t.name = "刘老师"t.age = 32//3.3 打印属性值.println(t.name, t.age)//3.4 调用方法t.eat()println("-" * 15)//4. 测试学生类.val s = new Students.name = "张三"s.age = 21println(s.name, s.age)s.eat()}
}
- 方式二: 继承版
object ClassDemo02 {//1. 定义人类.class Person {var name = ""var age = 0def eat() = println("人要吃饭!...")}//2. 定义老师类.class Teacher extends Person//3. 定义学生类.class Student extends Persondef main(args: Array[String]): Unit = {//4. 测试老师类.val t = new Teachert.name = "刘老师"t.age = 32println(t.name, t.age)t.eat()println("-" * 15)//5. 测试学生类.val s = new Students.name = "张三"s.age = 23println(s.name, s.age)s.eat()}
}
1.4 单例对象继承
在Scala中, 单例对象也是可以继承类的.
需求
定义Person类(成员变量: 姓名, 成员方法: sayHello()), 定义单例对象Student继承自Person, 然后测试.
object ClassDemo03 {//1. 定义Person类.class Person {var name = ""def sayHello() = println("Hello, Scala!..")}//2. 定义单例对象Student, 继承Person.object Student extends Person//main方法, 程序的主入口def main(args: Array[String]): Unit = {//3. 测试Student中的成员.Student.name = "张三"println(Student.name)Student.sayHello()}
}
1.5 方法重写
1.5.1 概述
子类中出现和父类一模一样的方法时, 称为方法重写. Scala代码中可以在子类中使用override来重写父类的成员,也可以使用super来引用父类的成员.
1.5.2 注意事项
-
子类要重写父类中的某一个方法,该方法必须要使用override关键字来修饰
-
可以使用override来重写一个val字段.
注意: 父类用var修饰的变量, 子类不能重写.
-
使用super关键字来访问父类的成员方法
1.5.3 示例
需求
定义Person类, 属性(姓名, 年龄), 有一个sayHello()方法.
然后定义Student类继承Person类, 重写Person类中的字段和方法, 并测试.
参考代码
object ClassDemo04 {//1. 定义父类Person.class Person {var name = "张三"val age = 23def sayHello() = println("Hello, Person!...")}//2. 定义子类Student, 继承Person.class Student extends Person{//override var name = "李四" //这样写会报错, 子类不能重写父类用var修饰的变量.override val age = 24override def sayHello() = {//通过super调用父类的成员.super.sayHello()println("Hello, Student!...")}}//程序的入口.def main(args: Array[String]): Unit = {//3. 创建学生类型的对象, 然后测试.val s = new Studentprintln(s.name, s.age)s.sayHello()}
}
2. 类型判断
有时候,我们设计的程序,要根据变量的类型来执行对应的逻辑, 如下图:
在scala中,如何来进行类型判断呢?
有两种方式:
- isInstanceOf
- getClass/classOf
2.1 isInstanceOf, asInstanceOf
概述
- isInstanceOf: 判断对象是否为指定类的对象
- asInstanceOf: 将对象转换为指定类型
格式
// 判断对象是否为指定类型
val trueOrFalse:Boolean = 对象.isInstanceOf[类型]// 将对象转换为指定类型
val 变量 = 对象.asInstanceOf[类型]
示例代码:
val trueOrFalse = p.isInstanceOf[Student]
val s = p.asInstanceOf[Student]
2.2 案例
需求
- 定义一个Person类
- 定义一个Student类继承自Person类, 该类有一个sayHello()方法.
- 创建一个Student类对象, 并指定它的类型为Person类型
- 判断该对象是否为Student类型,如果是,将其转换为Student类型并调用sayHello()方法.
参考代码
object ClassDemo05 {//1. 定义一个Person类.class Person//2. 定义一个Student类, 继承Person.class Student extends Person {def sayHello() = println("Hello, Scala!...")}//main方法, 作为程序的主入口def main(args: Array[String]): Unit = {//3. 通过多态的形式创建Student类型的对象.val p: Person = new Student//s.sayHello() //这样写会报错, 因为多态的弊端是: 父类引用不能直接访问子类的特有成员.//4. 判断其是否是Student类型的对象, 如果是, 将其转成Student类型的对象.if (p.isInstanceOf[Student]) {val s = p.asInstanceOf[Student]//5. 调用Student#sayHello()方法s.sayHello()}}
}
2.3 getClass和classOf
isInstanceOf 只能判断对象是否为指定类以及其子类的对象,而不能精确的判断出: 对象就是指定类的对象。如果要求精确地判断出对象的类型就是指定的数据类型,那么就只能使用 getClass 和 classOf 来实现.
用法
- p.getClass可以精确获取对象的类型
- classOf[类名]可以精确获取数据类型
- 使用==操作符可以直接比较类型
示例
示例说明
- 定义一个Person类
- 定义一个Student类继承自Person类
- 创建一个Student类对象,并指定它的类型为Person类型
- 测试使用isInstance判断该对象是否为Person类型
- 测试使用getClass/classOf判断该对象是否为Person类型
- 测试使用getClass/classOf判断该对象是否为Student类型
参考代码
object ClassDemo06 {//1. 定义一个Person类.class Person//2. 定义一个Student类, 继承自Person类.class Student extends Persondef main(args: Array[String]): Unit = {//3. 创建Student类型的对象, 指定其类型为Person.val p:Person = new Student//4. 通过isInstanceOf关键字判断其是否是Person类型的对象.println(p.isInstanceOf[Person]) //true, //5. 通过isInstanceOf关键字判断其是否是Person类型的对象.println(p.isInstanceOf[Student]) //true//6. 通过getClass, ClassOf判断其是否是Person类型的对象.println(p.getClass == classOf[Person]) //false//7. 通过getClass, ClassOf判断其是否是Student类型的对象.println(p.getClass == classOf[Student]) //true}
}
3. 抽象类
scala语言是支持抽象类的, , 通过abstract关键字来实现.
3.1 定义
如果类中有抽象字段或者抽象方法, 那么该类就应该是一个抽象类.
- 抽象字段: 没有初始化值的变量就是抽象字段.
- 抽象方法: 没有方法体的方法就是一个抽象方法.
3.2 格式
// 定义抽象类
abstract class 抽象类名 {// 定义抽象字段val/var 抽象字段名:类型// 定义抽象方法def 方法名(参数:参数类型,参数:参数类型...):返回类型
}
3.3 抽象方法案例
需求
- 设计4个类,表示上述图中的继承关系
- 每一个形状都有自己求面积的方法,但是不同的形状计算面积的方法不同
步骤
- 创建一个Shape抽象类,添加一个area抽象方法,用于计算面积
- 创建一个Square正方形类,继承自Shape,它有一个边长的主构造器,并实现计算面积方法
- 创建一个长方形类,继承自Shape,它有一个长、宽的主构造器,实现计算面积方法
- 创建一个圆形类,继承自Shape,它有一个半径的主构造器,并实现计算面积方法
- 编写main方法,分别创建正方形、长方形、圆形对象,并打印它们的面积
参考代码
// 创建形状抽象类
abstract class Shape {def area:Double
}// 创建正方形类
class Square(var edge:Double /*边长*/) extends Shape {// 实现父类计算面积的方法override def area: Double = edge * edge
}// 创建长方形类
class Rectangle(var length:Double /*长*/, var width:Double /*宽*/) extends Shape {override def area: Double = length * width
}// 创建圆形类
class Circle(var radius:Double /*半径*/) extends Shape {override def area: Double = Math.PI * radius * radius
}object ClassDemo07 {def main(args: Array[String]): Unit = {val s1:Shape = new Square(2)val s2:Shape = new Rectangle(2,3)val s3:Shape = new Circle(2)println(s1.area)println(s2.area)println(s3.area)}
}
3.4 抽象字段
在scala的抽象类中,不仅可以定义抽象方法, 也可以定义抽象字段。如果一个成员变量是没有初始化,我们就认为它是抽象的。
语法
abstract class 抽象类 {val/var 抽象字段:类型
}
示例
示例说明
- 创建一个Person抽象类,它有一个String抽象字段occupation
- 创建一个Student类,继承自Person类,重写occupation字段,初始化为学生
- 创建一个Teacher类,继承自Person类,重写occupation字段,初始化为老师
- 添加main方法,分别创建Student/Teacher的实例,然后分别打印occupation
参考代码
object ClassDemo08 {//1. 定义抽象类Person, 有一个抽象字段occupation(职业)abstract class Person {val occupation:String}//2. 定义Student类继承Person, 重写抽象字段occupation.class Student extends Person{override val occupation: String = "学生"}//3. 定义Teacher类继承Person, 重写抽象字段occupation.class Teacher extends Person{override val occupation: String = "老师"}//main方法, 作为程序的主入口def main(args: Array[String]): Unit = {//4. 创建Student类的对象, 打印occupation的值.val s = new Studentprintln(s.occupation)//5. 创建Teacher类的对象, 打印occupation的值.val t = new Teacherprintln(t.occupation)}
}
4. 匿名内部类
匿名内部类是继承了类的匿名的子类对象,它可以直接用来创建实例对象。Spark的源代码中大量使用到匿名内部类。学完这个内容, 对我们查看Spark的底层源码非常有帮助.
4.1 语法
new 类名() {//重写类中所有的抽象内容
}
注意: 上述格式中, 如果的类的主构造器参数列表为空, 则小括号可以省略不写.
4.2 使用场景
- 当对对象方法(成员方法)仅调用一次的时候.
- 可以作为方法的参数进行传递.
4.3 示例
需求
- 创建一个Person抽象类,并添加一个sayHello抽象方法
- 定义一个show()方法, 该方法需要传入一个Person类型的对象, 然后调用Person类中的sayHello()方法.
- 添加main方法,通过匿名内部类的方式来创建Person类的子类对象, 调用Person类的sayHello()方法.
- 调用show()方法.
参考代码
object ClassDemo09 {//1. 定义Person类, 里边有一个抽象方法: sayHello()abstract class Person{def sayHello()}//2. 定义一个show()方法, 该方法需要传入一个Person类型的对象.def show(p:Person) = p.sayHello()//main方法是程序的主入口def main(args: Array[String]): Unit = {//3. 通过匿名内部类创建Person的子类对象, 并调用sayHello()方法.new Person {override def sayHello(): Unit = println("Hello, Scala, 当对成员方法仅调用一次的时候.")}.sayHello()//4. 演示: 匿名内部类可以作为方法的参数进行传递.val p = new Person {override def sayHello(): Unit = println("Hello, Scala, 可以作为方法的实际参数进行传递")}show(p)}
}
5. 案例: 动物类
5.1 需求
已知有猫类和狗类, 它们都有姓名和年龄, 都会跑步, 而且仅仅是跑步, 没有什么不同. 它们都有吃饭的功能, 不同的是猫吃鱼, 狗吃肉. 而且猫类独有自己的抓老鼠功能, 狗类独有自己的看家功能, 请用所学模拟该需求.
5.2 目的
- 考察
继承, 抽象类, 类型转换
这些知识点.
5.3 步骤
- 定义抽象动物类(Animal), 属性: 姓名, 年龄, 行为: 跑步, 吃饭.
- 定义猫类(Cat)继承自动物类, 重写吃饭的方法, 并定义该类独有的抓老鼠的方法.
- 定义狗类(Dog)继承自动物类, 重写吃饭的方法, 并定义该类独有的看家的方法.
5.4 参考代码
object ClassDemo10 {//1. 定义抽象动物类(Animal), 属性: 姓名, 年龄, 行为: 跑步, 吃饭.abstract class Animal{//1.1 属性var name = ""var age = 0//1.2 行为def run() = println("动物会跑步!...")//吃饭的方法.def eat():Unit}//2. 定义猫类(Cat)继承自动物类, 重写吃饭的方法, 并定义该类独有的抓老鼠的方法.class Cat extends Animal {//2.1 重写父类的抽象方法override def eat(): Unit = println("猫吃鱼")//2.2 定义自己的独有方法def catchMouse() = println("猫会抓老鼠")}//3. 定义狗类(Dog)继承自动物类, 重写吃饭的方法, 并定义该类独有的看家的方法.class Dog extends Animal {//3.1 重写父类的抽象方法override def eat(): Unit = println("狗吃肉")//3.2 定义自己的独有方法def lookHome() = println("狗会看家")}//main方法, 作为程序的入口def main(args: Array[String]): Unit = {//4. 测试猫类.//4.1 创建猫类对象.val c = new Cat//4.2 给成员变量赋值.c.name = "汤姆"c.age = 13//4.3 打印成员变量值println(c.name, c.age)//4.4 调用方法.c.eat()//4.5 调用猫类的独有功能: 抓老鼠if (c.isInstanceOf[Cat]) {val cat = c.asInstanceOf[Cat]cat.catchMouse()} else if(c.isInstanceOf[Dog]) {val dog = c.asInstanceOf[Dog]dog.lookHome()} else{println("您传入的不是猫类, 也不是狗类对象")}//5. 测试狗类, 自己完成.}
}
= println(“狗会看家”)
}
//main方法, 作为程序的入口
def main(args: Array[String]): Unit = {
//4. 测试猫类.
//4.1 创建猫类对象.
val c = new Cat
//4.2 给成员变量赋值.
c.name = “汤姆”
c.age = 13
//4.3 打印成员变量值
println(c.name, c.age)
//4.4 调用方法.
c.eat()
//4.5 调用猫类的独有功能: 抓老鼠
if (c.isInstanceOf[Cat]) {
val cat = c.asInstanceOf[Cat]
cat.catchMouse()
} else if(c.isInstanceOf[Dog]) {
val dog = c.asInstanceOf[Dog]
dog.lookHome()
} else{
println(“您传入的不是猫类, 也不是狗类对象”)
}
//5. 测试狗类, 自己完成.
}
}
相关文章:
Scala第七章节
Scala第七章节 scala总目录 章节目标 掌握继承和抽象类相关知识点掌握匿名内部类的用法了解类型转换的内容掌握动物类案例 1. 继承 1.1 概述 实际开发中, 我们发现好多类中的内容是相似的(例如: 相似的属性和行为), 每次写很麻烦. 于是我们可以把这些相似的内容提取出来单…...
C语言进程的相关操作
C语言进程的相关操作 进程简介 每个进程都有一个非负整数形式到的唯一编号,即PID(Process Identification,进程标识)PID在任何时刻都是唯一的,但是可以重用,当进程终止并被回收以后,其PID就可…...
数据结构学习系列之链式栈
链式栈:即:栈的链式存储结构;分析:为了提高程序的运算效率,应采用头插法和头删法;进栈: int push_link_stack(stack_t *link_stack,int data) {if(NULL link_stack){printf("入参合理性检…...
too many session files in /var/tmp
Linux中Too many open files 问题分析和解决_e929: too many viminfo temp files-CSDN博客...
【7.0】打开未知来源安装应用
默认打开未知来源安装应用 frameworks\base\packages\SettingsProvider\res\values\defaults.xml <bool name"def_install_non_market_apps">false</bool>...
安装ipfs-swarm-key-gen
安装ipfs-swarm-key-gen Linux安装go解释器安装ipfs-swarm-key-gen Linux安装go解释器 https://blog.csdn.net/omaidb/article/details/133180749 安装ipfs-swarm-key-gen # 编译ipfs-swarm-key-gen二进制文件 go get -u github.com/Kubuxu/go-ipfs-swarm-key-gen/ipfs-swarm…...
BASH shell脚本篇5——文件处理
这篇文章介绍下BASH shell中的文件处理。之前有介绍过shell的其它命令,请参考: BASH shell脚本篇1——基本命令 BASH shell脚本篇2——条件命令 BASH shell脚本篇3——字符串处理 BASH shell脚本篇4——函数 在Bash Shell脚本中,可以使用…...
ElementUI之首页导航及左侧菜单(模拟实现)
目录 编辑 前言 一、mockjs简介 1. 什么是mockjs 2. mockjs的用途 3. 运用mockjs的优势 二、安装与配置mockjs 1. 安装mockjs 2. 引入mockjs 2.1 dev.env.js 2.2 prod.env.js 2.3 main.js 三、mockjs的使用 1. 将资源中的mock文件夹复制到src目录下 2. 点击登…...
Java开源工具库使用之Lombok
文章目录 前言一、常用注解1.1 AllArgsConstructor/NoArgsConstructor/RequiredArgsConstructor1.2 Builder1.3 Data1.4 EqualsAndHashCode1.5 Getter/Setter1.6 Slf4j/Log4j/Log4j2/Log1.7 ToString 二、踩坑2.1 Getter/Setter 方法名不一样2.2 Builder 不会生成无参构造方法2…...
uboot启动流程涉及reset函数
一. uboot启动流程中函数 之前了解了uboot链接脚本文件 u-boot.lds。 从 u-boot.lds 中我们已经知道了入口点是 arch/arm/lib/vectors.S 文件中的 _start。 本文了解 一下,uboot启动过程中涉及的 reset 函数。本文继上一篇文章学习,地址如下ÿ…...
端口被占用怎么解决
第一步:WinR 打开命令提示符,输入netstat -ano|findstr 端口号 找到占用端口的进程 第二步: 杀死使用该端口的进程,输入taskkill /t /f /im 进程号( !!!注意是进程号,不…...
python reportlab 生成多页pdf
多页 from reportlab.pdfgen import canvas from reportlab.platypus import (SimpleDocTemplate, Paragraph, PageBreak, Image, Spacer, Table, TableStyle) from reportlab.lib.enums import TA_LEFT, TA_RIGHT, TA_CENTER, TA_JUSTIFY from reportlab.lib.styles import P…...
word 多级目录的问题
一、多级标题自动编号 --> 制表符 -> 空格 网址: 【Word技巧】2 标题自动编号——将多级列表链接到样式 - YouTube 二、多级列表 --> 正规形式编号 网址:Word 教学 - 定框架:文档格式与多级标题! - YouTube 三、目…...
python使用mitmproxy和mitmdump抓包之拦截和修改包(四)
我认为mitmproxy最强大的地方,就是mitmdump可以结合python代理,灵活拦截和处理数据包。 首先,mitmdump的路径如下:(使用pip3 install mitmproxy安装的情况,参考我的文章python使用mitmproxy和mitmdump抓包…...
邓俊辉《数据结构》→ “2.6.5 二分查找(版本A)”之“成功查找长度”递推式推导
【问题描述】 邓俊辉的《数据结构(C语言版)(第3版)》(ISBN:9787302330646)中,开始于第48页的“2.6.5 二分查找(版本A)”内容在第50页详述了“成功查找长度”的…...
Linux文件查找,别名,用户组综合练习
1.文件查看: 查看/etc/passwd文件的第5行 [rootserver ~]# head -5 /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologi…...
【MATLAB第77期】基于MATLAB代理模型算法的降维/特征排序/数据处理回归/分类问题MATLAB代码实现【更新中】
【MATLAB第77期】基于MATLAB代理模型算法的降维/特征排序/数据处理回归/分类问题MATLAB代码实现 本文介绍基于libsvm代理模型算法的特征排序方法合集,包括: 1.基于每个特征预测精度进行排序(libsvm代理模型) 2.基于相关系数corr的…...
第三章 图标辅助元素的定制
第三章 图标辅助元素的定制 1.认识图表常用的辅助元素 图表的辅助元素是指除了根据数据绘制的图形之外的元素,常用的辅助元素包括坐标轴、标题、图例、网格、参考线、参考区域、注释文本和表格,它们都可以对图形进行补充说明。 上图中图表常用辅…...
【前端】ECMAScript6从入门到进阶
【前端】ECMAScript6从入门到进阶 1.ES6简介及环境搭建 1.1.ECMAScript 6简介 (1)ECMAScript 6是什么 ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在2015年6月正式发布了。它的目标ÿ…...
Android Shape设置背景
设置背景时,经常这样 android:background“drawable/xxx” 。如果是纯色图片,可以考虑用 shape 替代。 shape 相比图片,减少资源占用,缩减APK体积。 开始使用。 <?xml version"1.0" encoding"utf-8"?…...
什么是GraphQL?它与传统的REST API有什么不同?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 什么是GraphQL?⭐ 与传统的REST API 的不同⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣…...
如何定时备份使用Docker构建的MySQL容器中的数据库
👨🏻💻 热爱摄影的程序员 👨🏻🎨 喜欢编码的设计师 🧕🏻 擅长设计的剪辑师 🧑🏻🏫 一位高冷无情的编码爱好者 大家好,我是 DevO…...
Java【手撕链表】LeetCode 143. “重排链表“, 图文详解思路分析 + 代码
文章目录 前言一、两数相加1, 题目2, 思路分析2,1 找到中间结点2.2, 逆序后半段链表2.3, 合并两个链表 3, 代码 前言 各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你: 📕 JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管…...
C语言 cortex-A7核 按键中断 实验【重点】
一、KEY1 include/key.h #ifndef __KEY_H__ #define __KEY_H__#include "stm32mp1xx_rcc.h" #include "stm32mp1xx_gpio.h" #include "stm32mp1xx_exti.h" #include "stm32mp1xx_gic.h"//RCC/GPIO章节初始化 void hal_rcc_gpio_init…...
freertos中函数调用和启动第一个任务(栈相关!!!!!!)
本内容仅就一些较难理解的点讲解,请结合其它文章实用 在函数调用时,m3的处理器使用r0-r3共四个寄存器传参,其余的使用栈传参。 但是,如果传入的参数是全局变量,则不需传参,因为全局变量在函数内部是可见的…...
【PHP】如何关闭buffer实时输出内容到前端
前言 默认情况下,我们在PHP里使用echo等函数输出的内容,是不会马上发送给前端的,原因是有 buffer 的存在,buffer又分两处,一处是PHP本身的buffer,另一处是Nginx的buffer。只有当buffer满了之后,…...
Scala第二章节
Scala第二章节 scala总目录 章节目标 掌握变量, 字符串的定义和使用掌握数据类型的划分和数据类型转换的内容掌握键盘录入功能理解Scala中的常量, 标识符相关内容 1. 输出语句和分号 1.1 输出语句 方式一: 换行输出 格式: println(里边写你要打印到控制台的数据);方式二…...
Spring修炼之路(2)依赖注入(DI)
一、概念 依赖注入(Dependency Injection,DI)。 测试pojo类 : Address.java 依赖 : 指Bean对象的创建依赖于容器 . Bean对象的依赖资源 . 注入 : 指Bean对象所依赖的资源 , 由容器来设置和装配 . 二、 注入方式 2.1构造器注入 我们在之前的案例已经…...
编写Android.mk / Android.bp 引用三方 jar 包,aar包,so 库
一.前言 在Android10之后,所有项目工程中,官方推荐使用Android.bp去编译构建,以前使用Android.mk构建的项目随着版本迭代升级,慢慢需要变更为Android.bp, 两者的语法都需要去了解并熟练使用。 笔者之前写过Android.mk的…...
【kylin】【ubuntu】搭建本地源
文章目录 一、制作一个本地源仓库制作ubuntu本地仓库制作kylin本地源 二、制作内网源服务器ubuntu系统kylin系统 三、使用内网源ubuntukylin 一、制作一个本地源仓库 制作ubuntu本地仓库 首先需要构建一个本地仓库,用来存放软件包 mkdir -p /path/to/localname/pac…...
数据分析师工资/适合seo的建站系统
2019独角兽企业重金招聘Python工程师标准>>> 微信破解,解密?How To Decrypt WeChat EnMicroMsg.db Database? https://www.2cto.com/article/201507/414509.html 如何备份微信的聊天记录? https://www.zhihu.com/question/199242…...
网页设计实训内容/seo营销推广公司
转载于:https://www.cnblogs.com/jasonlixuetao/p/5557845.html...
如何判断网站做的关键词/宁德市区哪里好玩
此功能是通过shell32.dll中一个索引号为60的API函数调用,显示"关闭Windows"对话窗口实现的。具体方法为IDC_SHUTDOWNCOMPUTER按钮添加BN_CLICKED消息处理函数:void CControlDlg::OnShutdowncomputer() { HINSTANCE hInstLoadLibrary("…...
淘宝客做网站怎么做/哈尔滨seo优化软件
后面两张success plot分别是按照threshold和auc排序 各tracker说明: Year2015: 【CF2】 实验结果比论文中的结果好,原因是我运行的是作者后期又更新过的代码,作者添加了仿DSST的尺度更新,而在原论文中实现上ÿ…...
网站销售怎么做/百度热搜榜排行
阅读本文大概需要 3 分钟,挑书可能需要很多分钟。六一八来了,现在各大平台都开始促销了,作为一名程序员,除了自己买一些大件和帮女朋友疯狂抢购,最好的选择就是买书好好学习技术了。关注我的朋友可能很多都是学习 Java…...
丹阳网站推广/免费建站模板
题目 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/maximum-length-of-subarray-with-positive-product 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 给你一个整数数组 num…...