环境: mac 安装 kotlin sudo brew install kotlin ide: idea 先测试java
public class allen {
public static void main(String[] args) {
System.out.println("fuck you java");
}
}
liuhailongdeAir:src liuhailong$ ls
allen.java
liuhailongdeAir:src liuhailong$ java allen.java
错误: 找不到或无法加载主类 allen.java
liuhailongdeAir:src liuhailong$ javac allen.java
liuhailongdeAir:src liuhailong$ ls
allen.class allen.java
liuhailongdeAir:src liuhailong$ java allen.class
错误: 找不到或无法加载主类 allen.class
liuhailongdeAir:src liuhailong$ java allen.
错误: 找不到或无法加载主类 allen.
liuhailongdeAir:src liuhailong$ java allen
1d 37 1d 37 c 13 15 10 10 26 d 2f 1b 10 40 40
3t3tMTVQQcNl1Q//
liuhailongdeAir:src liuhailong$ javac allen.java
liuhailongdeAir:src liuhailong$ java allen
fuck you java
liuhailongdeAir:src liuhailong$
kotlin编译: 第一种方式: (出错) kotlinc test.kt -include-runtime 或kotlinc test.kt -include-runtime -d allen java TestKt
fun main(args: Array<String>) {
println("fuck you kotlin");
}
liuhailongdeAir:src liuhailong$ ls
test.kt
liuhailongdeAir:src liuhailong$ kotlin test.kt -include-runtime
error: could not find or load main class test.kt
liuhailongdeAir:src liuhailong$ kotlinc test.kt -include-runtime
liuhailongdeAir:src liuhailong$ ls
META-INF TestKt.class test.kt
liuhailongdeAir:src liuhailong$ javap TestKt.class
Compiled from "test.kt"
public final class TestKt {
public static final void main(java.lang.String[]);
}
liuhailongdeAir:src liuhailong$ ls
META-INF TestKt.class test.kt
liuhailongdeAir:src liuhailong$ ls
META-INF TestKt.class test.kt
liuhailongdeAir:src liuhailong$ kotlinc test.kt -include-runtime
liuhailongdeAir:src liuhailong$ ls
META-INF TestKt.class test.kt
liuhailongdeAir:src liuhailong$ java TestKt.class
错误: 找不到或无法加载主类 TestKt.class
liuhailongdeAir:src liuhailong$ java TestKt
Exception in thread "main" java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics
at TestKt.main(test.kt)
Caused by: java.lang.ClassNotFoundException: kotlin.jvm.internal.Intrinsics
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 1 more
liuhailongdeAir:src liuhailong$ kotlinc test.kt -include-runtime
liuhailongdeAir:src liuhailong$ kotlinc test.kt -include-runtime -d allen
liuhailongdeAir:src liuhailong$ ls
META-INF TestKt.class allen test.kt
liuhailongdeAir:src liuhailong$ cd allen
liuhailongdeAir:allen liuhailong$ ls
META-INF TestKt.class
liuhailongdeAir:allen liuhailong$ java TestKt.class
错误: 找不到或无法加载主类 TestKt.class
liuhailongdeAir:allen liuhailong$ java TestKt
Exception in thread "main" java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics
at TestKt.main(test.kt)
Caused by: java.lang.ClassNotFoundException: kotlin.jvm.internal.Intrinsics
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:335)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 1 more
liuhailongdeAir:allen liuhailong$
第二种方式 kotlinc test.kt -include-runtime -d allen.jar java -jar allen.jar
liuhailongdeAir:allen liuhailong$ kotlinc test.kt -include-runtime -d allen.jar
error: source file or directory not found: test.kt
liuhailongdeAir:allen liuhailong$ cd ..
liuhailongdeAir:src liuhailong$ cd ..
liuhailongdeAir:testa liuhailong$ ls
out src testa.iml
liuhailongdeAir:testa liuhailong$ cd src/
liuhailongdeAir:src liuhailong$ kotlinc test.kt -include-runtime -d allen.jar
liuhailongdeAir:src liuhailong$ ls
META-INF TestKt.class allen allen.jar test.kt
liuhailongdeAir:src liuhailong$ java -jar allen.jar
fuck you kotlin
liuhailongdeAir:src liuhailong$
原因是他自动生成一个类,还有很多依赖项(同时自动改名 ) 解压 jar 包 查看 class 文件
liuhailongdeAir:IdeaProjects liuhailong$ ls
testa testjava testkotlin
liuhailongdeAir:IdeaProjects liuhailong$ cd testa
liuhailongdeAir:testa liuhailong$ ls
out src testa.iml
liuhailongdeAir:testa liuhailong$ cd src/
liuhailongdeAir:src liuhailong$ ls
META-INF allen test.kt
TestKt.class allen.jar
liuhailongdeAir:src liuhailong$ javap TestKt.class
Compiled from "test.kt"
public final class TestKt {
public static final void main(java.lang.String[]);
}
liuhailongdeAir:src liuhailong$
因此在 idea 中有个设置入口类名称就是填对应的名称加 Kt ,同时第一个字母要大写 方言:(pascal风格 swift 也是) 变量的类型在后面 ,可以不写类型 var 定义自动推断类型。 函数有声名,返回值类型在后面与 swift 一样但格式不一样
\\js 弱类型语言返回值自动推断
function add2(x,y)
{
sum = x + y;
return sum;
}
\\swift 强类型
func sayHello(personName: String) -> String {
let greeting = "Hello, " + personName + "!"//let常量
return greeting
}
\\kotlin
fun add(m:Int,n:Int):Int{
return m+n
}
when(switch)每个分支中自动 break 格式 为xx ->()( swift用关键字case 也没有 break) when 中可能有范围用 in (swift 也可以有 ) 类 //swift
class MarksStruct {
var mark : Int
init(mark : Int) {
self.mark = mark
}
}
//java
class Person{
String name;
int age;
public void tell(){
System.out.println("姓名:"+name+" "+"年龄:"+age);
}
}
//kotlin 构造函数与类型可以合到一起使用
class Customer(name: String) {
init {
logger.info("Customer initialized with value ${name}")
}
}
class allen() {}
get/set 方法 //java
public class User {
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
//kotlin
class User {
val username:String
get()=allen
set(value:String)
{
allen=value
}
}
//swift
var _name:String?
var name:String?{
get{
return _name;
}
set{
_name = newValue
}
//同时有个回调 当被修改时调用
didSet
{
NSLog("已经改变的时候", []);
}
}
接口 枚举 抽象类与关键字与 java一样 继承 有点不一样 当一个类可以被 其它类继承时 这个类前面加关键字 open kotlin 与 oc swift 一样有扩展功能 kotlin 中的泛型与 java 类似 java中的静态类成员在kotlin中用陪伴对象实现 也就是kotlin没有静态类成员 kotlin 有委托功能 类通过关键字 by 属性通过 operator kotlin一样支持函数对象 高阶函数 装饰 闭包 lambda