初学kotlin:kotlin与Java的区别
1.入口函数的区别:输入输出的区别kotlin中输出用print(ln),并且一个语句完了之后不用加分号
kotlin中变量没有类型,用val与var它会自动推断类型
val为不可变变量,相当于常量 ;var为可变变量
指针常量值指针指向的对象不能变,但对象的内容能变
//指针常量与常量指针与c语言中类似,常量指针与指针常量相反
2.kotlin中连接字符串用$符号 如果要更改输出的变量的值,需要加一个括号
3.数组的定义
Java中不可变数组的定义原则:必须要直接或间接明确元素有多少个
kotlin中用Array eg:val nums=arrayOf(1,2,.....)
4.输出数组元素
Java中 eg:in nums[] for(int num: nums){System.out.println(num));
kotlin :for(i in 1..5){print(i)}//此时会打印出1,2,3,4,5
若想要跳格输出eg: for(i int 1..6 step 2){print(i)}//此时结果为 1,3,5
若不想要某个数如for(i int 1 until 5){print(i}此时不会输出5
若想要遍历数组元素for(num in nums){print(num)} 【nums为一个数组】 //这是for-each 方法,不关注索引
如想要反序则for(i in 5 down to 1)
若想要同时取出索引值和元素则for((i,num) in nums.withIndex()){println("i-num")
kotlin 用readLine 变量说明类型 eg:val a:Int=20 这里的20是Int类对象的一个值 【至于这个变量为什么能进行加减乘除这些运算,是因为In类有相应的方法,其他类也是如此】 包装类
kotlin中不支持强制类型转换,但是类有相应的方法
可选类型:String?表示有值或没值null
!!强制表示肯定有值
address?.length 表示:1.如果有值,直接访问对象的length方法
2.如果没有值,后面的方法不执行
内存中存储数据
堆
堆的特点:堆的内存由谁创建的就由谁释放
用new 方法产生的对象放在堆里
栈
临时变量作用域结束后由系统自己释放
栈的特点:First in ,Last out【FULO】先进后出
Java和kotlin是跨平台的高级语言
解析器能够将高级语言转换为JVM虚拟机能够识别的语言 即.class 文件,字节码文件
将文件转换为字节码文件右击文件?open in > terminal>
硬盘和内存的区别
如果要运行一个文件,就会把硬盘里的文件加载到内存中如果内存不够,会放到缓存中,如果缓存不够,放到二级缓存以此类推
栈帧可以理解为方法
eg:public class Testperson {
public int dosomething(){
int a=1; int b=2; int c=(a+b)*5; System.out.println(Thread.currentThread());//输出当前线程 return c; }
public static void main(String args){
Testperson testperson=new Testperson(); int result=testperson.dosomething(); System.out.println(result); }
}
访问权限:
public 任意位置都可访问:同一个包中、当前类的子类、同一个文件、同一个模块
private 当前类可以访问,其他位置不能访问
protected 当前类、子类能访问,同一个包能访问,外部包、外部模块不能访问
default 与protected类似
Java中类创建后并不会立即占据内存
Animal a1=new Animal() 经历的过程(仅仅是一个例子):
1.当用new方法创建对象时,在方法区寻找类的信息
2.如果没有这个类,类加载器将当前这个类的字节码文件加载到内存中 【这个类在内存中的形式是什么? 是类对象(类对象是虚的,但是它占据内存)】
3.在堆中申请内存空间
4.当前的创建的对象的地址会放在操作数栈中
5.在当前线程栈->方法栈帧->局部变量区申请内存空间给a1
6.从操作栈中弹出顶部操作数(即4中创建的对象的地址)赋值给a1
构造方法:为什么要有构造方法?
1.默认的无参构造方法
类本身不知道如何创建自己的对象,对象本身是由Object(){}来创建,再由当前这个类来初始化这个对象
2.重载的有参方法
(1)为了方便初始化值(2)在创建对象的同时给予某些需要的数据(时机)
如何巧妙使用private来私有化构造方法
给外部提供一个单例对象(整个程序运行中这个类只有一个对象)
1.私有化构造方法->外部无法创建这个类的对象
private Animal(){}
2.提供一个静态成员属性->静态变量,只会初始化一次
private static Animal instance=new Animal();
3.给外部提供一个静态方法->获取这个对象
//注:这里没有考虑内存消耗和线程安全
public static Animal getInstance(){return instance }
加上static这个方法就变成了类方法,如果没有static就是普通方法,需要创建一个对象去调用
4.外部获取这个对象
Animal.getInstance();
系统类库中一般以instance、shared、default开头的方法通常提供单例对象
kotlin(方法是函数,但Java中叫方法而不叫函数)
构造函数
1.主构造函数
当没有修饰符修饰构造函数或没有参数时,可以省略;反之必须要写constructer()class Person constructor(){}
2.次构造函数
constructer(name String):this(){]
注:a.次构造函数必须直接调用主构造函数
b.如果有父类,必须调用父类的构造函数
//次构造函数必须继承主构造函数
open class Father3 constructor(name: String)
class Person8 constructor (name:String):Father3(name){
constructor(name:String,age:Int):this(name)
}
kotlin 实现单例(不完善版本)
class Person9 private construtor(){
companion object{//companion 这个相当于Java中的static
private val defaultInstance=Person9()
fun getInstance():Person9{
return defaultInstance
}
}
}
注:java中的顶级类是Object类,kotlin中是Any类
kotlin 声明属性的方式1
//形式参数
//临时定义一个变量保存外部传递过来的值
//注意:aName和aAge是临时的,只能在两种情况下可以使用
//1. 声明变量时 变量的初始值是外部通过主构造函数传递过来
class L3Person constructor(aName:String,aAge:Int){
var name:String = aName
var age:Int = aAge
}
//2. 初始化块中调用
class L3Person constructor(aName:String,aAge:Int){
var name:String = ""
var age:Int = 0
//主构造函数调用之后 如果有声明 就会调用init初始化块
init {
name = aName
age = aAge
}
}
声明属性的方式2
//在主构造函数中直接声明属性 用val var
//需要在创建对象时给初始值的属性才放到主构造函数中
class L3Person constructor(
private var aName:String,
val aAge:Int
){
var score = 98.5
}
方法声明
//无参 无返回值的函数
//kotlin
fun test():Unit{}
//Java
public void test(){}
//有参 无返回值的函数
//kotlin
fun test1(a:Int,b:Int):Unit{}
//java
public void test1(int a,int b){}
//有参 有返回值的函数
//kotlin
fun test2(a:Int,b:Int):Int{
return a + b
}
//java
public int test3(int a,int b){
return a + b;
}
//如果函数实现只有一行 可以省略{}
fun test3(a:Int, b:Int):Int = a+b
//如果函数实现只有一行 可以省略{}
//返回值类型也可以省略
fun test4(a:Int, b:Int) = a+b
Java如果方法是void类型的,它是没有返回值的,但如果方法的实现即函数体里有return,此时这个return没有返回值,它的作用是能够退出当前这个模块
主构造函数里声明val/var表示是类的属性
kotlin中返回值为空用Unit表示
最后在这里想要浅说一下:
写程序有几个阶段:
1.在文本编辑器或IDE中编写代码
2.预编译.e
3.汇编:把高级语言转化为汇编语言(汇编语言介于高级语言和机器语言之间).s
4.编译:把汇编文件转化为二进制语言.o
5.链接:把所有.o文件连接成可执行文件.exe、.dmg
6.运行:得到对应的结果