Kotlin一步一个脚印学习基础二

【 

15、控制流
{
/**
* 用来检查和运算各种条件和逻辑的组合,控制App的运行流向.
* 循环:for, while 及 循环控制
* if:二元判断
* when:细致化判断
*/
fun main(args: Array<String>) {
//for:依次操作一个序列(如集合类型)中的每一项,执行次数是可预测的
val numbers = arrayOf( 1 , 2 , 3 , 4)
for (number in numbers) {
// println(number)
}

//重复执行:for(a in 1..10){//操作}
for (a in 1.. 100) {
// println("重要的事情说100遍。。。。")
}

//while:循环执行一系列操作,直到条件不成立,适合执行次数未知的场合
//Q:1加到多少次,才能加到15050?
var number = 1
var times = 0
var total = 0
while (total < 15050) {
total += number ;
number += 1
times += 1
if (total == 5050) {
break // break 结束整个循环
}
}
println( "加到多少次才能达到要求: ${times } ")

//循环中的控制:continue 结束本次循环 , break 结束整个循环
for (number in numbers) {
if (number == 3) {
continue //continue 结束本次循环
}
// println(number)
}

//if:条件判断语句,整个语句本身是一个表达式(可用于简单的二元判断计算)
var a = 5
var b = 8
var result = if (a > b) "大于" else 3
println(result)

//when:可对某个变量的大小/范围/表达式/类类型进行判断:筛选判断,其中的条件都是互斥的
when (result) {
in 4.. 10 -> { //in:在范围内 !in:不在范围内
println( "0到10之间")
}
/* (9 - 6) -> {
println("值是3")
}*/
18 , 25 , 32 ->{
println( "值是18,25,32")
}
is Int ->{ //is:判断是某类型
println( "值是Int类型")
}
else -> { //以上条件不满足,执行此语句
println( "未知")
}
}
}
}

16、函数
{
/**
* 函数是有名字的一段代码块.
* 包含参数和返回值(可选),参数可以有moren4值.
*/
fun add(x: Int , y: Int = 0): Int {
return x + y
}

fun main(args: Array<String>) {
//F1函数名看文档
//调用时可打参数名,可读性更好(但调用Java函数无效)
// val b = add(x = 2,y = 3)
val b = add( 2 , 3)
println(b)
//可变参数调用
val sum = sum( 1 , 12 , 23 , 45 , 2 , 56)
println( "可变参数调用返回结果: ${sum } ")
var a = intArrayOf( 1 , 12 , 23 , 45 , 2 , 56 , 12 , 5 , 20)
println( "可变参数调用返回结果,参数为数组: ${ sum(*a) } ")
}

//可变参数修饰符vararg, 可以直接接收数组
fun sum( vararg x: Int): Int {
var total = 0
for (i in x){
total += i
}
return total
}
}

17、Lambda和高阶函数
{
/**
* 高阶函数:参数或返回值的类型是函数型
* 函数型:(参数) -> 返回值
* lambda:一种无名函数的简写 { (参数)-> 函数执行语句 }
* 其他语言称闭包,即有能力访问其自身范围外的变量
*/
fun main(args: Array<String>) {
//高阶函数:描叙任务的结果,而不是使用循环详细推算
//map:常用于对集合类型的元素类型整体转变
//其lambda中参数的约定名称为it
val a = arrayOf( 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12)
val b = a. map { "第 ${ it } " } //参数是一个函数,此处采用的是闭包
for (s in b) {
println(s)
}
//排序
// a.sortBy { }

//filter:对集合类型进行筛选
var sum = 0
/* val c = a.filter { it % 2 == 0 } //闭包可以访问自身范围外的变量
for (i in c) {
println("返回筛选后的元素:${i}")
}*/
a. filter { it % 2 == 0 }. forEach {
sum += it
println(sum)
}
//分组
// a.groupBy { }
}
}

18、面向对象编程简介
{
/**
* 面向对象编程
* 对某种事物进行抽象化,称为"建模(model)",就是提取生物的基因
* 一个建模称之为一个类(class),从而简化认知,找到规律
* 特征和属性:需氧/厌氧,寿命(多方因素影响) -- 变量(属性)
* 功能和行为:进食,奔跑,睡觉,卖萌 -- 函数(方法)
* 繁殖:继承和多态
*
* 要创建一个具体的生物,必须给予配置参数,即"实例化(instance)"
*/
}

19、类定义及构造器
{
/**
* 类定义及构造器
*/
//快捷定义:class 类名 constructor(属性列表){更多的属性和方法描述}
//构造器:用来设置类的新实例出厂配置
//类的定义,如果设置一个类能否被继承,要加open关键字修饰。
open class Chinese constructor( var sex: Boolean , var region: String) {

}

//类的继承,添加了默认属性
class Shanghainin(sex: Boolean , region: String = "sh") : Chinese(sex , region) {

}

//类的继承,无默认属性
class Sichuanwa(sex:Boolean ,region: String):Chinese(sex ,region) {

}

fun main(args: Array<String>) {
//实例化一个类
val xioayaoming = Shanghainin( true)
println( "xioayaoming-sex: ${xioayaoming. sex } --region: ${xioayaoming. region } ")

val xiaoguojinming = Sichuanwa( true, "四川")
println( "xiaoguojinming-sex: ${xiaoguojinming. sex } --region: ${xiaoguojinming. region } ")
}
}

20、普通属性和组合属性
{
/**
* 普通属性和组合属性
*/
//快捷定义:class 类名 constructor(属性列表){更多的属性和方法描述}
//构造器:用来设置类的新实例出厂配置
//类的定义,如果设置一个类能否被继承,要加open关键字修饰。
open class ChineseA constructor( var sex: Boolean , var region: String) {
//普通属性,与变量定义相似
var skin = "yellow"

//组合属性,由其他属性计算而来(get)
val avgLife : Double
get(){
when( this. region){
"sh"->{
return 82.4
}
"安徽"->{
return 77.8
}
else ->{
return 77.4
}
}
}

//组合属性反过来可以影响其他属性(set,可选),this代表实例
var avgSalary : Int
get() {
when ( this. region) {
"sh" -> {
return 4900
}
"ah"->{
return 3200
}
else -> {
return 3000
}
}
}
set(value) {
when (value) {
in 4500..Int. MAX_VALUE -> {
this. region = "sh"
}
in 2800.. 3500->{
this. region = "ah"
}
else -> {
this. region = "other region"
}
}
}
}
}

21、子类中的属性和属性覆盖
{
//类的继承,添加了默认属性
class ShanghaininB(sex: Boolean , region: String = "sh") : ChineseB(sex , region) {
var dialect = "我港吴侬软语" //子类中新增的属性
//属性覆盖,父类属性需加open,子类覆盖的属性前要加override
override var skinb = "shanghaiYellow"
}

//类的继承,无默认属性
class SichuanwaB(sex:Boolean ,region: String):ChineseB(sex ,region){
var dialect = "四川普通话" //子类中新增的属性
override var skinb = "sichuanYellow"
}
}

22、方法
{
/**
* 方法
*/
open class ChineseC constructor( var sex: Boolean , var region: String) {
//普通属性,与变量定义相似
open var skinb = "yellow"

//组合属性,由其他属性计算而来(get)
val avgLife: Double
get() {
when ( this. region) {
"sh" -> {
return 82.4
}
"安徽" -> {
return 77.8
}
else -> {
return 77.4
}
}
}

//组合属性反过来可以影响其他属性(set,可选),this代表实例
var avgSalary: Int
get() {
when ( this. region) {
"sh" -> {
return 4900
}
"ah" -> {
return 3200
}
else -> {
return 3000
}
}
}
set(value) {
when (value) {
in 4500..Int. MAX_VALUE -> {
this. region = "sh"
}
in 2800.. 3500 -> {
this. region = "ah"
}
else -> {
this. region = "other region"
}
}
}

//方法:厨艺
fun cook() {
val menu = arrayOf( "青椒炒肉丝" , "番茄炒蛋" , "紫菜蛋汤")
val desc = menu. reduce { s1 , s2 -> s1 + ","+ s2 }
println( "我会 ${desc } ")
}
}

//类的继承,添加了默认属性
class ShanghaininC(sex: Boolean , region: String = "sh") : ChineseC(sex , region) {
var dialect = "我港吴侬软语" //子类中新增的属性
//属性覆盖,父类属性需加open,子类覆盖的属性前要加override
override var skinb = "shanghaiYellow"
}

//类的继承,无默认属性
class SichuanwaC(sex: Boolean , region: String) : ChineseC(sex , region) {
var dialect = "四川普通话" //子类中新增的属性
override var skinb = "sichuanYellow"
}

fun main(args: Array<String>) {
//实例化一个类
val xioayaoming = ShanghaininC( true)
// println("xioayaoming-sex:${xioayaoming.sex}--region:${xioayaoming.region}")
xioayaoming. avgSalary = 3000
println(xioayaoming. region)
println(xioayaoming. dialect)
xioayaoming.cook() //调用方法
val xiaoguojinming = SichuanwaC( true, "四川")
// println("xiaoguojinming-sex:${xiaoguojinming.sex}--region:${xiaoguojinming.region}")
}
}

23、方法的覆盖和加成
{
/**
* 方法的覆盖和加成
*/
open class ChineseD constructor( var sex: Boolean , var region: String) {
//普通属性,与变量定义相似
open var skinb = "yellow"

//组合属性,由其他属性计算而来(get)
val avgLife: Double
get() {
when ( this. region) {
"sh" -> {
return 82.4
}
"安徽" -> {
return 77.8
}
else -> {
return 77.4
}
}
}

//组合属性反过来可以影响其他属性(set,可选),this代表实例
var avgSalary: Int
get() {
when ( this. region) {
"sh" -> {
return 4900
}
"ah" -> {
return 3200
}
else -> {
return 3000
}
}
}
set(value) {
when (value) {
in 4500..Int. MAX_VALUE -> {
this. region = "sh"
}
in 2800.. 3500 -> {
this. region = "ah"
}
else -> {
this. region = "other region"
}
}
}

//方法:厨艺
open fun cook() {
val menu = arrayOf( "青椒炒肉丝" , "番茄炒蛋" , "紫菜蛋汤")
val desc = menu. reduce { s1 , s2 -> s1 + "," + s2 }
println( "我会 ${desc } ")
}
}

//类的继承,添加了默认属性
class ShanghaininD(sex: Boolean , region: String = "sh") : ChineseD(sex , region) {
var dialect = "我港吴侬软语" //子类中新增的属性
//属性覆盖,父类属性需加open,子类覆盖的属性前要加override
override var skinb = "shanghaiYellow"
}

//类的继承,无默认属性
class SichuanwaD(sex: Boolean , region: String) : ChineseD(sex , region) {
var dialect = "四川普通话" //子类中新增的属性
override var skinb = "sichuanYellow"
//方法的覆盖,要加override并且父类方法加open修饰
override fun cook() { //加成,在父类原有的基础上有所发展,叫多态。
super.cook() //继承父类的方法
val menu = arrayOf( "麻婆豆腐" , "重庆毛血旺" , "诸葛烤鱼")
val desc = menu. reduce { s1 , s2 -> s1 + "," + s2 } //将数组合成字符串
println( "我还会 ${desc } ")
}
}

fun main(args: Array<String>) {
//实例化一个类
val xioayaoming = ShanghaininD( true)
// println("xioayaoming-sex:${xioayaoming.sex}--region:${xioayaoming.region}")
xioayaoming. avgSalary = 3000
println(xioayaoming. region)
println(xioayaoming. dialect)
xioayaoming.cook() //调用方法
val xiaoguojinming = SichuanwaD( true, "四川")
// println("xiaoguojinming-sex:${xiaoguojinming.sex}--region:${xiaoguojinming.region}")
xiaoguojinming.cook()
}
}

24、可见性修饰符
{
/**
* 可见性修饰符
* 设定类本身及其属性,方法,构造器
* 以及接口和对象的对外的访问权限,即"可见性"
*
* 举个例子:生物都有内脏,这个"内"其实就是私有属性
* private 私有:仅当前类可见,最小的可见性
* protected 保护:仅子类可见
* internal 内部:当前模块内可见
* public 公开:*默认,对外完全可见
*/
}

25、嵌套类
{
/**
* 嵌套类
*/
//新闻类
class News{
//默认地区
private var lang = "cn"

//新闻分类:嵌套类 与主类关系并不是十分紧密,只是一个形式上的合作,主从关系。
class Category{
var list = arrayOf( "推荐" , "娱乐" , "体育" , "科技" , "美女")
val listDesc = list. joinToString() //将数组转成一个逗号分隔的字符串
}

//内部类:新闻语种. 通常用于不直接对外的类,为主类服务的。
inner class Lang{
fun changeRegion(newRegion : String){
//内部类可以访问主类的属性
lang = newRegion
println( "现在可以查看 ${newRegion } 地区的新闻了!")
}
}
}

fun main(args: Array<String>) {
//显示中国地区的新闻列表. 使用嵌套类
println(News.Category(). listDesc)

//更改新闻地区,内部类的调用:内部类必须依赖主类的实例,再加上自身的实例才能使用。
News().Lang().changeRegion( "us")
}
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值