做一个营销型网站需要多少钱购买型网站建设

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

做一个营销型网站需要多少钱,购买型网站建设,精准营销管理,长春网站建设托管Hello word 前言#xff1a;上次学习安卓#xff0c;学了Java开发#xff0c;简单的搭了几个安卓界面。这次要学习Kotlin语言#xff0c;然后开发安卓#xff0c;趁着还年轻#xff0c;学点新东西#xff0c;坚持~ 未来的你会感谢现在努力的你~ 主要学习资料#xff1a…Hello word 前言上次学习安卓学了Java开发简单的搭了几个安卓界面。这次要学习Kotlin语言然后开发安卓趁着还年轻学点新东西坚持~ 未来的你会感谢现在努力的你~ 主要学习资料 《第一行代码Android 第三版》菜鸟教程android官网-kotlinKotlin 官方文档 中文版2018年黑马安卓开发视频教程幕课网课件 那么开始吧~ 开始-Kotlin语言-安卓开发学习 首先是搭建环境在一通操作过后在android studio上成功安装行了kotlin 经典的hello word eclipse环境搭建结果 参数 又是一个绕不开的话题 kotlin中 使用val修饰的变量是不可变的(value) 使用var修饰的变量是可变的variable 可变的 tips: 优先使用val来声明一个变量而当val没有办法满足你的需求时再使用var 小数类型的默认是Double var a 3.1415f/3.1415F表示Float类型 小数点6位以内用Float类型 小数点大于6位用Double类型 for循环 kotlin也有swift中的开区间、闭区间的概念 四种类型[)(] 注意所谓 “全开区间” 或者是 “左开右闭” 的区间可以用其他两种方式代替 var nums 1..10for (num in nums){print(\(num, )}println()var nums2 1 until 10for (num in nums2){print(\)num, )}运行结果 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, step n隔几个打印1个 for (num in 1..20 step 2){print(\(num, )}运行结果1, 3, 5, 7, 9, 11, 13, 15, 17, 19, reversed()翻转打印 var nums2 1 until 10for (num in nums2.reversed()){print(\)num, )}运行结果9, 8, 7, 6, 5, 4, 3, 2, 1, 数据容器 容器是用于存放数据的载体。容器分为数组、集合 使用arrayOf创建数组 var array: ArrayAny arrayOf(1, 2, 2, 3.11)kotlin中的Any类型等价于其他开发语言中的object类型 使用arrayOfNulls创建数组 创建一个指定大小的、所有元素都为空的数组但必须指定集合中的元素类型 var array2 arrayOfNullsString(5) var array2 arrayOfNullsString(2)array2[0] 333for (temp in array2){println(temp)}运行结果 333 null 动态创建数组 用接受数组大小以及一个方法参数的Array构造方法用作参数的方法能够返回给定索引的每个元素初始值 //数组的大小4//遍历数组i。取出每一个i做i*i的操作结果放入数组var array3 Array(4){i - (i*i)}array3.forEach { println(it) }根据不同类型创建特定类型的数组 指定类型 //指定个数var array4 IntArray(2)array4[0] 1array4[1] 99array4.forEach { println(it) }指定类型指定个数且每个元素一样 //创建一个长度为5的数组里面每个元素都是100var array5 IntArray(5){100}array5.forEach { println(it) }指定类型指定个数且每个元素可按规则自定义 var array6 IntArray(5){it*2}array6.forEach { println(it) }数组的几种for-in循环遍历 var array6 IntArray(5){it*2}//最简单的for (item in array6){println(item)}//使用indices取indexfor(index in array6.indices){println(array6[\({index}] \){array6[index]})}//使用withIndex取出index和itemfor((index, item) in array6.withIndex()){println(array6[\({index}] \){item})}数组创建的时候需要指定个数而且创建完成后不能更改数字个数不能添加、删除元素只能查询、更改元素值 这明显是个不可变数组难度没有可变数组吗还是说可变数组使用集合表示 Kotlin集合 可变集合的大小可以动态改变 List是一个有序集合元素可重复Set是一组无重复元素的集合无序Map是一组键值对字典 可变集合、不可变集合 在可变的列表中有两个方法推荐使用带mutable的字如其意 例子创建一个可变集合做增、删操作 var array mutableListOfString()//增加元素array.add(123)array.add(333)//在index的位置增加元素array.add(1, 2)var array2 mutableListOfString()array2.add(1)array2.add(3)//增加一个数组里面的内容array.addAll(array2)array.forEach { println(it) }//根据下标index移除元素array.removeAt(0)//根据value移除元素array.remove(333)array.forEach { println(it) }listOf()创建集合的时候必须指定元素类型、必须指定初始化数据 例子创建一个不可变集合做增、删操作 使用listOf创建一个list 使用witIndex()获取index的值然后使用(x, y)两个参数接收 fun main(args: ArrayString){var array listOfString(1, 2, 4, 9)for ((index, item) in array.withIndex()){println(\(index \)item)} 运行结果 0 1 1 2 2 4 3 9 例子创建一个map //导入TreeMap包 import java.util.TreeMapfun main(args: ArrayString){//创建一个mapvar map2 TreeMapString, String()//赋值map2[good] 好map2[bad] 坏map2[study] 学习println(map2[bad]) }readLine() readLine()获取键盘输入的字获取后是String?类型的 函数 函数的格式 kotlin: func 函数名(参数名 参数类型): 返回值类型{函数体 }oc:

  • (返回值类型)函数名(参数类型: 参数名) {函数体 }只是组合方式不一样 函数的四要素函数名、参数、返回值类型、函数体都有 函数的简略写法 fun sum(a: Int, b: Int): Int{return ab } //如果函数体里面只有一条语句而且该语句有返回值则可以去掉{}并省略return直接使用 fun sum2(a: Int, b: Int): Int ab在kotlin中函数和参数(变量)一样都是一等公民 那个也可以将函数表达式赋值给一个变量 ///等号右边称为函数表达式var i {a: Int, b: Int - ab}println(i(3, 8))还有另外一种写法 //var j:后面表面是一种类型j是一个函数类型两个入参一个出参//后面是一个函数表达式var j:(Int, Int)-Int {x, y - xy }println(j(1, 8))也就是函数也可以充当函数里面的参数或者返回值 函数的分类 函数通过声明位置的不同分为 普通类的方法对象方法静态类的方法类方法companion object伴生类的方法 companion同伴伴侣 普通方法 class Person {fun test(){println(普通方法)} }调用的时候先创建对象才能调用 Person().test() 静态类方法 使用objec创建的类称为静态类 不需要构建对象可以通过类名直接访问静态方法 object NumUtil {fun test(){println(这是一个静态方法)} }调用NumUtil.test() 伴生类方法 如何在一个普通类里面直接通过类调用方法呢 可以将方法放在companion object{}里面即可 class Person {companion object{fun test2(){println(这是一个伴生类方法)}} }调用Person.test2() 方法的参数 默认参数具名参数可变数量的参数 默认参数 方法参数可以有默认值当省略相应的参数时使用默认值 fun main(args: ArrayString){read(1,2)read(start 2) }fun read(offset: Int 0, start: Int){println(offset\({offset}, start\){start}) }运行结果 offset1, start2 offset0, start2 offset: Int 0就是默认值0 当不写默认值的时候要指定后面的参数start 而这种在调用函数的时候指定参数名的方法就是具名参数 具名参数指定具体名称的参数 举个例子默认参数与具名参数 val PI 3.14ffun main(args: ArrayString){//要写3.14f,3.0f而不是3.14,3var temp circleArea(3.14f, 3.0f)//调用的时候明确写出radius的方式就是具名参数var temp2 circleArea(radius 3.0f)println(temp)println(temp2) }//圆的面积 //默认Pi的值是PI //通过在类型的后面添加 符号来设置参数的默认值。 fun circleArea(Pi: Float PI, radius: Float): Float{return Pi*radius*2 }如果最后一个参数是方法那么它既可以作为具名参数在括号内传入也可以在括号外传入 举个例子 fun main(args: ArrayString){//作为具名参数在括号内read1(1,2, action {//最后一句可以省略return123})//放在括号外read1(start 3){321} }//最后一个参数是方法 //action参数名 //()-String没有参数有返回值(String)的函数类型 fun read1(offset: Int 0, start: Int, action: ()-String){//函数()代表执行函数var temp action()println(offset\({offset}, start\){start}, action\({temp}) }可变数量的参数Vararg vararg可变参数 方法的参数通常是最后一个可以使用vararg修饰标记 fun main(args: ArrayString){varargFun(1, 100)varargFun(1, 3, 3,4,8) }//使用vararg修饰 fun varargFun(a: Int, vararg v:Int){//v参数是一个数组println(v.forEach { println(it) }) }一个函数最多只能有一个可变参数如果可变参数不是最后一个那么可变参数后面的所有参数都要用具名参数传值 Lambda表达式 Lambda表达式理解为一种语法糖 Lambda表达式里面有一个it it不是关键字 在高阶方法中如果Lambda表达式只有一个参数那么可以使用it来使用此参数 异常捕获try-catch 举个计算器 fun main(args: ArrayString){println(请输入第一个数字)var a readLine()while (a null || a?.count() 0){println(不能输入空值请重新输入数字)a readLine()}println(请输入第二个数字)var b readLine()while (b null || b?.count()0){println(不能输入空值请重新输入数字)b readLine()}try {var num1 a!!.toInt()var num2 b!!.toInt()var result sum(num1, num2)println(\)num1 \(num2 \)result)}catch (error: java.lang.Exception){println(error)} }fun sum(a: Int, b: Int):Int{return ab }递归 举个例子计算n的阶层 5的阶层 5 * 4 * 3 * 2 * 1 120 fun main(args: ArrayString){println(jieCeng(5)) }fun jieCeng(a: Int):Int{//结束条件if (a 1) return 1//递归计算return a * jieCeng(a-1) }尾递归计算 fun main(args: ArrayString){var result 0println(add(100, result)) }tailrec fun add(a: Int, result: Int):Int{println(计算机第\({a}次计算 result\){result})//结束条件if (a 0) return 1//递归计算return add(a-1, result a) }继承 如果想继承某个父类则父类class前需要加open允许被继承如果想重写父类的某个方法则子类在同名方法前加overrid且父类在方法前加open允许被重写 接口和抽象类 接口是事物的能力接口用的时候接口名即可抽象类是事物的本质抽象类用的时候抽象类() 使abstract定义的类被称为抽象类里面的方法不需要实现 代理和委托 A委托B去做某事情 B代理A去做某事情 使用by 类名A()就可以实现类名A里面的方法 open class Father: IWashBowl by Son(){/*override fun wash() {println(我是爸爸洗完一次10元)} /}//或者这样调用 open class Father: IWashBowl by Son(){override fun wash() {println(我是爸爸我收了妈妈的10元)Son().wash()println(我是爸爸我不洗碗但是赚了9元)} }单例 创建类的时候不使用class修饰而且使用object修饰则只有一份 印章类sealed sealed:封闭的、密封的 sealed class更在意类型枚举更在意数据 //跟enum类似只有指定有限的类 sealed class Son {//记得加()class XXL(): Son()class XXM(): Son()fun sayHello(){println(hello)} }fun main(args: ArrayString){//记得加()才是对象var son1:Son Son.XXL()var son2:Son Son.XXM()var son3:Son Son.XXM()var house listOfSon(son1, son2, son3)for (v in house){if(v is Son.XXM){v.sayHello()}} } 函数式编程 fun main(args: ArrayString){var names listOfString(tom, locy, jack)//forEach函数names.forEach(action haha)//闭包匿名函数names.forEach{a - println(a)}//闭包names.forEach{//默认参数itprintln(it)} }//函数作为参数前面使用var 参数名 //后面的函数名去掉 var haha fun (name: String):Unit{println(name) } Kotlin高阶函数 一个函数被用作参数或者返回值则称为高阶函数 maxBy/minBy 找出数组array里面age最大的item array.maxBy{a.age} 找出数组array里面height最小的item array.minBy{a.height} 返回的是item对象 var item: Object array.maxBy{it.age}filter 过滤找到特定条件的对象集合 好几个条件并列执行 var newArray array.filter{(it.age18) and (it.height168) and (it.age25) }map 把原数组某个属性映射成新的集合 比如把人群中的名字列出来放入新的集合中 var newArray oldArray.map{\({it.name} : \){it.age} }结果{name1: 18, name2: 30, name3: 19} any 是否有满足某个条件的对象 返回的是一个boolean值 var temp: Boolean array.any{it.age 18 }count 统计符合满足条件对象的个数 var count: Int array.count{it.age18 }find 查找符合条件的对象并返回第一个 var item: Object array.finc{it.address北京 }groupBy 按照特征把对象分为不同的组 var result: Array array.groupBy{it.address }按照地址把原来的数组分别组成新的数组 DSL 领域特定语言 扩展函数中缀表达式 函数使用infix修饰后.的操作可以换成空格的操作 泛型 在java中常见的泛型有泛型类、泛型接口、泛型方法、泛型属性 在kotlin中常见的泛型有泛型接口/类、泛型字段、泛型方法、泛型约束、泛型中的out与in 泛型接口/类 举个例子使用泛型定义一个接口 fun main(args: ArrayString){DrinkApple().drink(喝苹果汁) }//接口T泛型 interface DrinkT{//不需要函数体fun drink(t: T) }//定义一个类DrinkApple实现Drink接口 class DrinkApple: DrinkString{//使用override重写override fun drink(t: String) {println(t)} }泛型类 fun main(args: ArrayString){BlueColor(蓝色).printColor()BlueColor(红色).printColor2() }//使用abstract修饰一个类类名为Color abstract class ColorT(var t: T){//如果不实现函数则也加abstractabstract fun printColor()//或者不加abstract直接实现函数fun printColor2(){println(printColor2)} }class BlueColor(var color: String): ColorString(color){override fun printColor() {println(\({color})} } 泛型参数 fun main(args: ArrayString){var box1 BoxString(123)println(\){box1.value}) }///(BoxT)是一个整体且不能省略T省略的话后面的T不识别 class BoxT(t: T){var value t }泛型方法 这个。。。。方法也是泛型 类型参数要放在方法名的前面 fun main(args: ArrayString){//Kotlin中双冒号操作符:表示把一个方法当做一个参数传递到另一个方法中进行使用通俗的来讲就是引用一个方法。fromJson({}, String::class.java) }//在函数名前加T fun T fromJson(json: String, tClass: ClassT): T?{var t: T? tClass.newInstance()return t } 泛型约束 就是对泛型进行约束约束泛型是哪种类型的子类 //规定泛型必须是JSONObject类型或者其子类类型 fun T: JSONObject fromJson(json: String, tClass: ClassT): T?{var t: T? tClass.newInstance()return t } 当泛型前后不一致的时候需要借助out/in 扩展Extensions 扩展的好处提高编码效率减少代码量 扩展某个类一个新的功能而无需继承该类 扩展一个方法 fun main(args: ArrayString){Jump().test()Jump().test2() }//正常创建一个类 class Jump{fun test(){println(test)} }//扩展一个类的方法只需要在类后面加.即可 fun Jump.test2(){println(test2) }Jump类里面多了一个test2()方法 使用场景当引用的第三方框架想增加新的方法就可以使用扩展 扩展属性 fun main(args: ArrayString){var android androidprintln(\({android.lastChar}) }//普通定义变量 var a: Char //get() this.get(length - 1)左边是get放右边是实现 val String.lastChar:Char get() this.get(length - 1)Kotlin中常用的扩展 提供的扩展函数 letrunapply let let: 作用域区域、避免判空 fun main(args: ArrayString){testLet(sss)testLet(null) }//String代表可能为空 fun testLet(str: String?){//当str为空的话不执行后面的函数str?.let {var str2 androidprintln(str2 it)}//let函数外面不能访问str2 // str2 }run run函数只接收一个lambda函数参数以闭包形式返回返回值为最后一行的值或者指定的return的表达式 在run函数中可以直接访问实例的公有属性和方法 fun main(args: ArrayString){//调用函数入参是Jump()var temp testRun(Jump())println(temp) }//创建一个类 class Jump{var a: Int 10fun test(){} }//函数 fun testRun(jump: Jump): String{jump.run {jump.test()//直接访问方法test()println(jump.a)//直接访问属性println(a)//最后一行被作为返回值return 1111} }apply 调用某个对象的apply函数在函数范围内可以调用该对象的任意方法并返回该对象 作业做一个计算器 package com.example.learnKotlinfun main(args: ArrayString){while (true){println(请输入你的表达式)var inputString: String? readln()try {inputString?.let {calculate(inputString)println(是否还继续(y/n))var inputString2: String? readln()inputString2?.let {if (it.equals(n)){System.exit(-1)}}}}catch (ex: java.lang.Exception){ex.printStackTrace()}} }fun calculate(inputString: String){if(inputString.contains()){//trim()去掉空格//split()分割var nums inputString.trim().split()var result nums[0].toFloat() nums[1].toFloat()println(\){nums[0]}\({nums[1]}\){result})}else if(inputString.contains(-)){var nums inputString.trim().split(-)var result nums[0].toFloat() - nums[1].toFloat()println(\({nums[0]}-\){nums[1]}${result})}else if(inputString.contains()){var nums inputString.trim().split(*)var result nums[0].toFloat() * nums[1].toFloat()println(\({nums[0]}*\){nums[1]}\({result})}else if(inputString.contains(/)){var nums inputString.trim().split(/)var result nums[0].toFloat() / nums[1].toFloat()println(\){nums[0]}/\({nums[1]}\){result})}else{println(输入错误)} } 测试数据 请输入你的表达式 80 输入错误 是否还继续(y/n) y 请输入你的表达式 8 * 8 8 * 864.0 是否还继续(y/n) 请输入你的表达式 9-000 9-0009.0