kotlin方言(对比其它语言)

本文对比了Java和Kotlin两种语言的编译及运行过程,详细记录了从源代码到执行的过程,包括常见错误及其解决办法,并介绍了Kotlin的一些基本语法特点。

环境:
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方言(对比其它语言)
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$ 

kotlin方言(对比其它语言)
第二种方式
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 包
kotlin方言(对比其它语言)
查看 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 ,同时第一个字母要大写
kotlin方言(对比其它语言)
方言:(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

转载于:https://blog.51cto.com/haidragon/2172950

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值