因为本人是一名移动开发工程师,也相信绝大多数学习kotlin这一语言的都是Android开发工程师,于是我们的首选开发工具当然是AS。我们开始用AS学习kotlin吧。
首先,我们新建一个project,记住选中include kotlin。
01.hello world
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
init()
}
private fun init(){
println("hello world")
}
}
找个真机,运行程序,Logcat控制台打印(Logcat搜索框输入:System.out过滤无效信息):
04-21 14:50:24.791 7455-7455/com.example.a86131.kotlin_01 I/System.out: hello world
从这几行代码,可以对比一下java和kotlin:
fun应该是用来声明一个方法,可以有private修饰符;
一个方法结束后不需要;间隔;
:表示继承
02.变量的声明和使用
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
init()
}
private fun init(){
//声明一个变量
var name = "张三"
println(name)
}
}
var用来声明一个变量,运行程序,Logcat控制台打印(Logcat搜索框输入:System.out过滤无效信息):
04-21 15:04:20.657 9684-9684/com.example.a86131.kotlin_01 I/System.out: 张三
一个注意点:
数据类型不可更换,否则编译不通过。
03.类型推断
我们看这个例子,为什么报错了呢?是因为这个kotlin可以类型推断,默认推断a的类型为Int,新的赋值超过了Int取值范围。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
init()
}
private fun init(){
var a:Int = 10
var j:Long = 999999999999
var t:String = "hello"
}
}
我们也可以显示声明变量类型。
注意:修饰常量不要用var,要用val,被修饰后不可被修改。
04.boolean判断
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
init()
}
private fun init(){
var i = 10
var j = 9;
println(i > j)
}
}
运行程序,控制台输出true。
05.函数详解
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
init()
}
private fun init(){
var c = plus(2,10)
println(c)
}
fun plus(a:Int,b:Int):Int{
return a+b;
}
}
相信大家都能看懂,控制台输出12,有一点声明一下plus括号里面是两个变量以及变量类型,最后:Int是返回值类型。
fun 函数名(参数:参数类型):返回值类型{
函数体
}
06.字符串模板
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
init()
}
private fun init(){
var s1 = tem("刘德华")
println(s1)
}
fun tem(s:String):String{
return "${s}好帅"
}
}
控制台打印“刘德华好帅”,${}可以替换里面的内容到字符串。
07.条件控制 if······else
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
init()
}
private fun init(){
var t = score(80)
println(t)
}
fun score(a:Int):String{
if (a > 90)
return "合格"
else
return "不合格"
}
}
跟java不同的是,{}可以写也可以不写。
08.字符串比较
记住一点:kotlin里面==等同于java中的equal。
09.when表达式
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
init()
}
private fun init(){
score(9)
}
fun score(a:Int){
when(a){
10 -> println("非常好")
9 -> println("很好")
8 -> println("良好")
}
}
}
类似于java中的switch。
10.一些语法
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
init()
}
private fun init(){
var nums = 1 .. 100
for (num in nums){
println(num)
}
}
}
1 .. 100表示1到100的闭区间,控制台可以看到1到100。
private fun init(){
var nums = 1 until 100
for (num in nums){
println(num)
}
}
1 util 100表示1到99。
11.List和Map
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
init()
}
private fun init(){
var list1 = listOf<String>("刘德华","郭富城","张学友","黎明")
for ((index,value) in list1.withIndex()){
println("$index $value")
}
}
}
日志打印:
04-21 16:35:10.515 18464-18464/? I/System.out: 0 刘德华
04-21 16:35:10.515 18464-18464/? I/System.out: 1 郭富城
04-21 16:35:10.515 18464-18464/? I/System.out: 2 张学友
04-21 16:35:10.515 18464-18464/? I/System.out: 3 黎明
for((index,value) in list.withIndex()){ //重点是 withIndex() 方法,
index 接收索引,value 接收对应的值
//DO STH
}
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
init()
}
private fun init(){
var map01 = TreeMap<String,String>()
map01["a"] = "boy"
map01["b"] = "girl"
println(map01["a"])
}
}
控制台打印boy。
12.函数的一些语法糖
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
init()
}
private fun init(){
var i = {a:Int,b:Int -> a+b}
var c = i(3,5)
println(c)
}
}
控制台输出8,表示声明一个函数i,参数a,b返回a+b。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
init()
}
private fun init(){
var j:(Int,Int)->Int={a,b->a+b}
var t = j(1,2)
println(t)
}
}
控制台输出3
13.默认参数和具名参数
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
init()
}
val Pi = 3.14f
private fun init(){
var j = getArea(r=10f)
println(j)
}
fun getArea(PI:Float=Pi,r:Float):Float
{
return PI*r*r;
}
}
上面这个例子是求圆的面积,PI是一个默认参数,r是一个具名参数。
14.异常处理
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
init()
}
private fun init(){
try {
var i = 10/0
}catch (e:Exception){
println(e)
}
}
}
日志打印:
System.out: java.lang.ArithmeticException: divide by zero
异常处理这一块和java基本一样
15.面向对象
Android Studio里面定义一个类(new kotlin File/Class 选择Class):
class Rect(var width:Float,var height:Float) {
fun area(a: Float,b: Float):Float = a*b
}
初始化对象,不需要new
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
init()
}
private fun init(){
var rect = Rect(5f,10f)
rect.area(5f,10f)
}
}
再来一个洗衣机的例子:
//定义成员变量和成员方法
class WashMachine(var brand: String, var size: Int) { //品牌,容量
fun openTheDoor() {
println("打开洗衣机的门")
}
fun closeTheDoor() {
println("关上洗衣机的门")
}
fun start() {
println("启动洗衣机洗衣服")
}
}
使用:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
init()
}
private fun init(){
var wash01 = WashMachine("海尔",8)
wash01.closeTheDoor()
wash01.openTheDoor()
wash01.start()
}
}
日志:
04-21 17:33:32.573 23491-23491/com.example.a86131.kotlin_01 I/System.out: 关上洗衣机的门
04-21 17:33:32.573 23491-23491/com.example.a86131.kotlin_01 I/System.out: 打开洗衣机的门
04-21 17:33:32.573 23491-23491/com.example.a86131.kotlin_01 I/System.out: 启动洗衣机洗衣服
16.封装
1>隐藏内部实现细节即为封装——Java系的程序员都知道!
2>私有关键字 :private —— 同Java。私有即是封装的一种体现
17.继承
在java中,继承的重要性不言而喻,比如我们安卓日常开发中需要先封装一个BaseActivity,然后让其他的Activity去继承,这样就大大优雅了代码,否则一些共同代码每个Activity都去写一遍,代码就显得极为臃肿,并且难以维护。
open class Father {
var a = "长得帅"
open fun hobby(){
println("钓鱼")
}
}
class Son : Father() {
override fun hobby() {
println("唱歌")
}
}
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
init()
}
private fun init(){
var son = Son()
son.hobby()
}
}
注意几点:
1.被继承的类要有open修饰
2.允许被继承的方法要用open修饰
3.重写父类方法要用override修饰
4.使用:,类比于java的extends
18.抽象类
abstract class Human(var name:String) {
abstract fun drink()
}
class Man(name:String) : Human(name) {
//必须重写
override fun drink() {
println("$name 喝酒")
}
}
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
init()
}
private fun init(){
var m = Man("james")
m.drink()
}
}
抽象类和方法不需要用 open 声明可以被继承/实现
19.多态
abstract class Human(var name:String) {
abstract fun fair()
}
class Man(name:String) : Human(name) {
override fun fair() {
println("$name 短头发")
}
}
class Woman(name: String):Human(name) {
override fun fair() {
println("$name 长头发")
}
}
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
init()
}
private fun init(){
var man = Man("james")
var woman = Woman("lily")
var list= listOf<Human>(man,woman) //定义集合
for (human in list){ //遍历集合
human.fair()
}
}
}
20.接口
interface IMan {
fun play()
}
class Man(name:String) : Human(name),IMan {
override fun fair() {
println("$name 短头发")
}
override fun play() {
println("$name 打篮球")
}
}
21.代理和委托
- 委托,把自己不干的事情交给别人做
- 代理,做别人委托的事情
- kotlin中接口代理关键字:by
我们举个例子:有一个工程,包工头(B)5000块以自己的名义包下了,委托给A来做,A代理了这个事情:
interface IWork {
fun makeMoney()
}
class A :IWork {
override fun makeMoney() {
println("1000元工资到手了")
}
}
class B:IWork by A() {
}
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
init()
}
private fun init(){
var b = B()
b.makeMoney()
}
}
控制台打印:
04-21 18:28:19.844 27203-27203/? I/System.out: 1000元工资到手了