Kotlin 与java 在面对对象时的相同与不同(超详细)

一 在类中的关键字有区别

对于java  一个类本身就可以被继承 (除非你加了final关键字)

而对于kotlin 一个类想要被继承 必须加上 open 关键字

二 在构造函数上

相同: 类的构造函数若带有参数的话就必须 传递参数来实现他 

class Student(val :sno) : Person(){}

此时Person()里面 有无参的构造函数 所以子类也要写出()来 和java 所遵守的是同一种规则

若 Person类里含有参数 那你子类必须也要传入参数来实现父类的构造函数

不同 :  Kotlin 有次构造函数 

class Student (val sno:String,val grade:Int,name:String,age:Int):
    person(sno)
{
    
    constructor(name :String,age :Int) :this(sno)
{
        这是次构造函数 他自己调用了this 主构造函数 
        意思就是我们只传入两个参数也可以了 
        次构造函数帮你传入了给主构造函数两个参数!!!  
}
}
我们可以通过默认构造值  class Student (val sno:String="我是默认的"):
    person(sno)
此时我们不要求强制给他赋值 也就是几乎替代了次构造函数的功能 所以次构造函数没什么好了解的

三 在接口中

kotlin 跟java 在接口上几乎没有什么差别 下面展示kotlin的接口用法

interface Study{
    fun readBook()
    fun doHomework()

}
我们这里实现的kotlin 接口 函数不要求有函数体 当然你给了函数体也没错
class student(name:String ,age :Int ):Person (name ,age) ,Study
{
        override fun readBook{
            println("这是我实现的接口函数")    
}
        override fun doHomework{
            println("这是我实现的接口函数")    
}
}    这里我们注意 继承父类是: 然后写自己的接口 用 , 分割 

    一个方法 想传入这个接口类 
    fun doStudy(study :Study)
{
        study.readBook()   这里我们要一个接口 然后谁实现了这个接口的我们都算
}

四 在类型上 (Data类,单例类)

Data类

public class CellPhone {
    String brand ;
    double price ;
    public CellPhone(String brand ,double price)
    {
        this.brand=brand;
                this.price=price;
    }
    @Override
    public boolean equals(Object obj)
    {
        if (obj instanceof CellPhone ) {
            CellPhone other = (CellPhone) obj;
            return other.brand.equals(brand)&&other.price==price;      
        }
        return false;
    }
    @Override
    public  int hashCode(){
        return brand.hashCode()+(int) price;
    }
    @Override
    public  String toString(){
        return "Cellphone(brand="+brand;        
  在kotlin中 可以这样写  return"cellphone(brand=$brand)" $符号的妙用
    }
} 
这段代码 主要就是 重写了 equal类(因为要对比是否是相同的) hashCode类 还有toSring类
    hashcode 是重新算他的哈希值 再从hash表里面找是否相同 这里通过+(int)price的方法来进行初筛

在kotlin中 我们不需要这样麻烦 因为 这个类只是数据的操作 我们有data类来描述这些事物

data class CellPhone (val brand:String,val price :Double)

 kotlin 自动帮你搞好

单例类

单例类中

public class Singleton {
    private static Singleton instance;
    private Singleton (){}
    public synchronized static Singleton getInstance(){
        if (instance==null)
        {
            instance=new Singleton();
        }
        return instance;
    }
}
单例类就是说 不准被人创造实例 所以他把创造的方法私有化了 没有就自己创建

   实例不是对象 是对对象的引用 每次new 必出一个新的实例 不一定有一个新的对象
 
          对于情况 1,类 Person 有两个实例,但两个实例代表同一个对象。
          对象是类的实例,实例是代表对象在该类下的副本。
          Person p1 = new Person(1, "Carlos", 20);
          Person p2 = new Person(1, "Carlos", 20);

单例类小片段  说明只能用getinstance来获取他那唯一的单例

class aa{
    public static void main(String[] args) {
        Singleton singleton=new Singleton();//报错
        String a=Singleton.getInstance().toString();
    }
}

在kotlin 中 直接 object Singleton {

        fun aaa(){

println("函数")

        }        //object这个关键字直接就把他当成了单例类 此时调用方法: Singleton.aaa()

                                                                                                            //类似静态调用

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值