Java&Kotlin语法对比篇(一)|如何做一个随机抽牌并比较大小的小Demo?

  • 温馨提示:本篇重在逻辑和思维方式,只涉及少量语法!!

前言

大家好呀!在学习了一些Java和kotlin的基础语法之后,小编将在这里对新学习的一些语法知识进行对比和总结。我们将通过写一个随机抽牌并比较大小的小Demo的方式来对Java和kotlin进行对比学习,让我们一起来看看吧!

包含语法:
1.定义变量
2.方法重载
3.if判断语句
4.for循环
5.构造方法,初始化
6.输出语句
7.基本格式

  • 注:实现本Demo采用了面向对象的思考方式,与c是完全不同的思考方式

正文

一、pokerDemo的功能

在Demo中,我们需要在一副扑克牌中抽取两张牌(除去大小王),然后对两张牌进行比较。首先比较牌面点数的大小,然后比较花色的大小,最后输出两张牌的比较结果。

注意:点数大小顺序(依次增大):"3","4","5","6","7","8","9","10","J","Q","K","A","2"
花色大小顺序(依次减小):"♠","♥","♣","♦"

二、分析如何实现pokerDemo

(一)、文字分析

  1. 有两张牌,比较点数和花色。但由于点数非纯数字而花色也难以比较,因此我们选择将点数和花色分别放到字符数组中,将点数和花色都从小到大放置,这样对应元素的下标也依次增大,我们比较元素的下标时即可比较对应的点数和花色。

  2. 创建一个可以管理所有扑克牌的类。这个管理器既可以产生所有的牌,又可以让我们随机从中抽取两张牌。

(二)、UML类图

PokerDemo-UML类图

三、代码对比

(一)、PokerNumber类和PokerSuit类

1. Java

public class PokerNumber {
    String number;
    int tag;

    public PokerNumber(String number, int tag) {
        this.number = number;
        this.tag = tag;
    }
}
public class PokerSuit {
    String suit;
    int tag;

    public PokerSuit(String suit, int tag) {
        this.suit = suit;
        this.tag = tag;
    }
}

Java中:
1.定义变量:“类型 类型名”
2.对默认构造方法进行重载
注:在{ }中进行重载

2. kotlin

class PokerNumber(
    val number: String,
    val tag:Int
)
class PokerSuit(
    val suit:String,
    val tag:Int
)

kotlin中:
1.定义变量:“类型(var/val)类型名[:类型的类 eg.Int String...]”
2.直接赋予两个参数进行重载
注:在( )中传递参数

(二)、Poker类

1. Java

public class Poker {
    //构成一张牌的两个属性
    PokerNumber numberObj;
    PokerSuit suitObj;

    //当属性为私有时,用get方法得到两个属性
    public PokerNumber getNumberObj() {
        return numberObj;
    }
    public PokerSuit getSuitObj() {
        return suitObj;
    }

    //重载默认构造函数,可以直接使用带参数的方法对牌进行初始化
    public Poker(PokerNumber numberObj, PokerSuit suitObj) {
        this.numberObj = numberObj;
        this.suitObj = suitObj;
    }

    //定义一个compare构造方法,传递一个Poker类型的参数
    //对两张牌进行比较,返回类型为Boolean型
    public boolean compare(Poker other){
        if (this.numberObj.tag == other.numberObj.tag){
            if (this.suitObj.tag > other.suitObj.tag){
                return true;
            }else {
                return false;
            }
        }
        else {
            if (this.numberObj.tag > other.numberObj.tag){
                return true;
            }else {
                return false;
            }
        }
    }
}

在Java中:
1.定义一个Poker类需要的属性和compare方法
2.if语句只能在其中进行操作,不能直接作为结果返回

2. kotlin

class Poker(
    val numberObj:PokerNumber,
    val suitObj:PokerSuit
) {
    //返回值为boolean类型
    fun compareTo(other:Poker):Boolean{
//        var result:Boolean = true
//        //比较点数
//        if (this.numberObj.tag == other.numberObj.tag){
//            //点数相同 比较花色
//            result = this.suitObj.tag > other.suitObj.tag
//        }else{
//            result = this.numberObj.tag > other.numberObj.tag
//        }
//        return result

        return if (this.numberObj.tag == other.numberObj.tag){
            //点数相同 比较花色
            this.suitObj.tag > other.suitObj.tag
        }else{
            this.numberObj.tag > other.numberObj.tag
        }
    }
}

kotlin中:
1.直接在( )中传递两个变量(指定变量的类型),在{ }中写构造方法
2.if语句里{ }中的最后一句能够直接作为结果返回也可进行操作,如以上代码的注释部分与Java语法相似,而return部分直接作为结果返回

(三)、PokerManager类

1. Java

public class PokerManager {
    ArrayList<Poker> pokers = new ArrayList<>();

    //建立两个字符数组分别放置点数和花色
    String[] numbers = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"};
    String[] suits = {"♦", "♣", "♥", "♠"};

    //重载默认构造函数,产生一副牌
    public PokerManager() {
        for (int i = 0; i < numbers.length; i++) {
            for (int j = 0; j < suits.length; j++) {
                //创造一张牌的点数和花色
                PokerNumber pokerNumber = new PokerNumber(numbers[i],i);
                PokerSuit pokerSuit = new PokerSuit(suits[j],j);
                //创造一张牌
                Poker poker = new Poker(pokerNumber,pokerSuit);
                //将牌添加到一副牌所在的数组中
                pokers.add(poker);
            }
        }
        //随机置换指定列表元素,此处可以不写,因为下方可以随机得到牌面
        Collections.shuffle(pokers);
    }

    //随机得到一张牌,构造getPokers方法,返回类型为Poker
    public Poker getPokers() {
        Random random = new Random();
        int index = random.nextInt(pokers.size());
        Poker poker = pokers.get(index);
        //将得到的牌移出牌组
        pokers.remove(poker);
        return poker;
    }
}

Java中:
1.fori循环
2.产生随机数的方式Random ra = new Random( );
获得随机数调用的方法:ra.nextInt(数组名.size() );
3.添加和移除数组中的元素:array.add/remove(移除元素的类型名);

2.kotlin

class PokerManager {
    //提供一个容器存储所有的扑克 可以增删数组里的内容
    val pokers: ArrayList<Poker> = arrayListOf()
    //点数的数组 一旦创建不可改变
    val numbers = arrayOf("2","3","4","5","6","7","8","9","10","J","Q","K","A")
    //花色的数组
    val suits = arrayOf("♦","♣","♥","♠")

    //和构造函数同时处理
    init {
        for ((i,number) in numbers.withIndex()){
            for ((j,suit) in suits.withIndex()){
                //创建点数和花色的对象
//                val numberObj = PokerNumber(number,i)
//                val suitObj = PokerSuit(suit,j)
//                //创建扑克对象
//                val poker = Poker(numberObj,suitObj)
//                //添加到数组pokers中
//                pokers.add(poker)

                //直接写 减少轮询
                pokers.add(
                    Poker(PokerNumber(number,i),PokerSuit(suit,j))
                )
            }
        }
    }

    fun getPoker():Poker{
        //获取一个随机数
//        val index = Random.nextInt(pokers.size)
        val index = (0..pokers.size).random()
        val poker = pokers[index]
        pokers.removeAt(index)
        return poker
    }
}

kotlin中:
1.init初试化块,不用重载默认构造函数
2.fori循环中可以用for ((i,number) in numbers.withIndex())的方式找出元素的下标和内容
3.移除和添加数组中的元素:array.add(元素类型);array.removeAt(index)//index即元素的下标

(四)、Test类

1.Java

public class Test {
    public static void main(String[] args) {
        PokerManager pokerManager = new PokerManager();

        //产生两张牌
        Poker poker1 = pokerManager.getPokers();
        Poker poker2 = pokerManager.getPokers();

        //比较两张牌
        boolean result = poker1.compare(poker2);
        if (result){
            System.out.println(poker1.numberObj.number + poker1.suitObj.suit + ">" 
                               +poker2.numberObj.number + poker2.suitObj.suit);
        }else {
            System.out.println(poker1.numberObj.number + poker1.suitObj.suit + "<" 
                               +poker2.numberObj.number + poker2.suitObj.suit);
        }

    }
}

java中:
1.方法:“返回类型 方法名”
2.输出:System.out.println/print //换行/不换行
3.每个语句间要加分号,输出用“+”连接

2.kotlin

fun main() {
    val manager = PokerManager()

    val poker1 = manager.getPoker()
    val poker2 = manager.getPoker()

    val result = poker1.compareTo(poker2)
    if (result){
        println("${poker1.numberObj.number}${poker1.suitObj.suit} > " +
                "${poker2.numberObj.number}${poker2.suitObj.suit}")
    }else{
        println("${poker1.numberObj.number}${poker1.suitObj.suit} < " +
                "${poker2.numberObj.number}${poker2.suitObj.suit}")

    }
}

kotlin中:
1.方法:“fun 方法名”
2.输出:println/print //换行/不换行 类似于c
3.代码间无需分号,“ ”中若想输出代码里的内容用“${xx}”

四、总结

  • Kotlin比Java更加简洁,语法也有很多相似之处。在学习的过程中,我们可以用写小Demo的方式进行对比学习。在本篇文章中,实现Demo的方式全部采用了面向对象的思考方式,将这个小项目进行分析后分类,实现类的继承、封装,安全性得到了提高。
  • Kotlin和Java语法有一定程度的相似,我们在学习中应该多写代码,尽量不要将两者弄混
  • 其实Kotlin和Java的语法区别并不大,在编程语言的学习过程中更重要的是注重项目背后的逻辑思维,在生活中我们也应该时刻关注并使用面向对象的思考方式。

免责说明:
1.萌新选手刚来,不喜勿喷,如有错误,欢迎指正(求生欲满满QAQ)
2. 未经允许,禁止转载

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容