从Java到Kotlin(三)

本篇文章主要对比Java跟Kotlin中的类和接口的写法。html

目录

1、类的声明
2、构造函数
3、函数的参数
4、建立类的实例
5、数据类
6、枚举类
7、属性
8、内部类
9、可见性修饰符
10、继承
11、接口bash


1、类的声明

Java声明一个类微信

public class Foo {}
复制代码

Kotlin声明一个类ide

class Foo
复制代码

若是只声明一个空的类,Java和Kotlin的区别仍是不大的。在Kotlin中若是没有类体,Kotlin能够省略大括号{}函数

2、构造函数

一个类当中能够有一个主构造函数和多个次构造函数。post

1.主构造函数

在Java中,若是不指定构造方法,编译器会默认生成一个不带参数的构造方法学习

public class User{
    public User() {//默认生成
        //能够在构造方法里修改代码
    }
}
复制代码

在Kotlin中,主构造函数是类头的一部分:它跟在类名后ui

class User constructor(userName: String) {
}
复制代码

若是主构造函数没有任何注解或者可见性修饰符,能够省略这个 constructor 关键字this

class User(userName: String) {
}
复制代码

Kotlin的主构造函数不能包含任何的代码。初始化的代码能够放到以 init 关键字做为前缀的代码块中spa

class User(userName: String) {
    init {       
    //...
    }
}
复制代码

2.次构造函数

Java中的构造方法

public class User {
    public User(String userName) {
    }

    //次构造函数
    public User(String userName, int age) {
    }

    //次构造函数
    public User(String userName, int age, String sex) {
    }
}
复制代码

Kotlin的次构造函数前面必须加constructor关键字

class User(userName: String) {
    //主构造函数的实现部分
    init {
        println(userName)
    }

    //次构造函数,可经过this调主构造函数
    constructor() : this("czh")

    //次构造函数,可经过this调主构造函数
    constructor(age: Int) : this("czh") {
        println(age)
    }

    //次构造函数,经过this调主构造函数
    constructor(sex: String, age: Int) : this("czh") {
        println("$sex$age")
    }
}

//实例化User
User()
User("Czh")
User(2)
User("男",22)
复制代码

运行代码,获得结果:

注意:在实例初始化期间,能够有多个init代码块,按照它们出如今类体中的顺序执行,如:

init {
        println(1)
    }    
    init {
        println(3)
    }
    init {
        println(2)
    }
复制代码

执行该段代码,打印顺序就是1->3->2

3、函数的参数

1.Kolin函数中的默认参数

Kotlin支持默认参数,在调用函数时不指定参数,就会使用默认参数,而Java并不支持默认参数。举个例子:

class User(userName: String = "Czh", age: Int = 22)
复制代码

若是咱们在实例化User的时候不传入参数,userName默认就是Czh,age默认就是22,以下所示:

var user = User()
复制代码

若是在设置了默认值后,不想用默认值的话能够在建立实例时传入参数,以下所示:

var user = User("ABC" , 123)
复制代码

2.Kolin函数中的命名参数

若是一个默认参数在一个无默认值的参数以前,那么该默认值只能经过使用命名参数调用该函数来使用,以下所示:

class User(userName: String = "Czh", age: Int)
var  user = User(age = 22)
复制代码

4、建立类的实例

Java使用关键字new建立类的实例:

new User();
复制代码

Kotlin没有new关键字,因此直接建立类的实例:

User()
复制代码

5、数据类

在Kotlin中,存在数据类这样一个概念,咱们常常建立一些保存数据的类,并标记为 data,至关于Java中拥有Set和Get方法的实体类。下面来做个对比: Java实体类:

public class User {
    String userName;
    int age;

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        User user = (User) o;

        if (age != user.age) return false;
        return userName != null ? userName.equals(user.userName) : user.userName == null;
    }

    @Override
    public int hashCode() {
        int result = userName != null ? userName.hashCode() : 0;
        result = 31 * result + age;
        return result;
    }

    @Override
    public String toString() {
        return "User{" +
                "userName='" + userName + '\'' + ", age=" + age + '}'; } } 复制代码

对应的Kotlin数据类:

data class User(var userName: String, var age: Int)
复制代码

数据类用关键字data标识,会自动建立下面的方法:

  • getter/setter方法;
  • equals()/hashCode() 对;
  • toString() 格式是 "User(name=Czh, age=22)"
  • componentN() 函数 按声明顺序对应于全部属性;
  • copy() 函数。

建立数据类须要注意的是:

  • 主构造方法至少要有一个参数,且参数必须标记为val或var
  • 数据类不能用open、abstract、sealed(封闭类)、inner标识

获取数据类实例后,直接能够调用这些方法:

简单解释一下copy()函数。在不少状况下,咱们须要复制一个对象改变它的一些属性,但其他部分保持不变。 copy() 函数就是为此而生成。举个例子:

var user = User("Czh2",22)
var user1 = user.copy(age = 23)
Toast.makeText(this, user1.toString(), Toast.LENGTH_SHORT).show()
复制代码

运行代码,弹出toast:

6、枚举类

Java的枚举类跟Kotlin的枚举类很是类似。 Java定义一个枚举类

enum Color {
    RED, GREEN, BLUE
}
复制代码

Kotlin定义一个枚举类

enum class Color {
    RED, GREEN, BLUE
}
复制代码

Java为枚举类指定数值

enum Color {
    RED(0xFF0000), GREEN(0x00FF00), BLUE(0x0000FF);

    private Color(int rgb) {
    }
}
复制代码

Kotlin为枚举类指定数值

enum class Color(rgb: Int) {
    RED(0xFF0000), GREEN(0x00FF00), BLUE(0x0000FF)
}
复制代码

Java枚举类与Kotlin枚举类除了基本语法不一样,其余都很是类似。

7、属性

Kotlin的类能够有属性。 属性能够用关键字var 声明为读写的,用关键字val声明为只读的。

1.声明属性

Java中的声明属性:

public class User {
    String userName;
    final String sex = "男";
}
复制代码

对应的Kotlin代码:

class User {
    var userName: String
    val sex: String = "男"
}
复制代码

####2.调用属性

Java须要加上getter方法和setter方法才能够调用

new User().getSex();
new User().setUserName("Czh");
复制代码

Kotlin在语法上支持属性,不用为属性定义getter和setter方法。要使用一个属性,只要用名称引用它便可。

User().sex  //getter
User().userName = "Czh"  //setter
复制代码

3.属性的getter与setter

虽然Kotlin在语法上支持属性,但咱们仍然能够在属性中使用getter和setter。举个例子:

class User {
    var name = "Czh"
    var userName: String
        get() = name //调用User().userName,获得结果是 Czh
        set(value) {
            //调用User().userName = "Czh" 把name设为 Czh
            //而后再调用调用User().userName,获得结果是 Czh
            name = value
        }

    //用val只读标识只读
    val sex: String
        get() = "男"//调用User().sex,获得结果是 男
}
复制代码
  • field标识符

上面例子的User类中定义了一个name来保存属性的值,若是不想定义一个字段来保存属性的值,可使用field标识符,以下所示:

class User {
    var userName: String = "Czh"
        get() = field
        set(value) {
            field = value
        }
}
复制代码

经过Kotlin提供的field标识符可以更简便地读写属性值。

8、嵌套类

嵌套类指的是在类中定义的类,以下所示: Java中的嵌套类

class User {
    int age;

    static class UserName{

    }
}

User.UserName user= new User.UserName();
复制代码

Kotlin用inner关键字标记嵌套类

class User {
    var age: Int = 0

    inner class UserName {
    }
}

var userName: User.UserName  = User().UserName()
复制代码

当咱们用inner关键字标记嵌套类时,能够经过外部类的实例调用嵌套类。

9、可见性修饰符

Java中的可见性修饰符:

可见性修饰符 访问级别 同类 同包 子类 不一样包
public 公开
protected 受保护 ×
default 默认 × ×
private 私有 × × ×

Kotlin中的可见性修饰符:

  • private ——本类内部(包含其全部成员)均可见
  • protected ——只在本类内部+子类中可见
  • public ——能见到类声明的任何客户端均可以见到其public成员
  • internal——能见到类声明的本模块内的任何客户端均可以见到其public成员

与Java可见性修饰符的可见性修饰符不一样的是,多了一个internal,少了一个default。 internal 意味着该成员只在相同模块内可见。更具体地说, 一个模块是编译在一块儿的一套 Kotlin 文件:

  • 一个 IntelliJ IDEA 模块;
  • 一个 Maven 项目;
  • 一个 Gradle 源集;
  • 一次 <kotlinc> Ant 任务执行所编译的一套文件。

10、继承

1.类的继承

Java类的继承

class UserActivity extends AppCompatActivity {}
复制代码

Kotlin类的继承

class UserActivity:  AppCompatActivity()
复制代码

Java跟Kotlin都是单继承的,也就是说,都只能有一个父类。不一样的是,Kotlin使用冒号:继承,并且Kotlin的class默认不容许继承,若是想让类能够被继承,须要用open关键字来标识该类,以下所示:

open class Food //用open关键字来标识该类

class Fruits : Food()
复制代码

2.重写方法

在Kotlin中,方法也是默认不可重写的。若是子类要重写父类中的方法,要在父类的方法前面加open关键字,而后在子类重写的方法前加override关键字,以下所示:

//父类
open class Food {
    open fun banana() {}
}
//子类
class Fruits : Food(){
    override fun banana() {
        super.banana()
    }
}
复制代码

11、接口

Java接口跟Kotlin接口都是用interface关键字声明

interface A{}
interface B{}
复制代码

Java用implements实现接口

class Foods implements A, B {}
复制代码

Kotlin用冒号:实现接口

class Food : A, B {}
复制代码

若是Kotlin中同时存在继承类和实现接口

//继承Food类和接口AB
class Fruits: Food,A, B {}
复制代码

一个类能够实现多个接口,并且接口中的属性和方法都是open的,不用另外加open标识。

  • 接口中的方法体

Kotlin接口中的方法能够有默认方法体,有默认方法体的方法能够不重写。而Java不支持接口里的方法有方法体。举个例子:

interface UserImpl {
    fun getName(): String
    fun getAge(): Int{
        return 22
    }
}
//实现接口UserImpl,能够不重写getName()
class User :UserImpl{
    override fun getName(): String {
        return "Czh"
    }
}
复制代码

总结

本篇文章主要对比了Kotlin和Java中对于类和接口的区别,相对来讲Kotlin加了一些语法糖,让代码编写更方便。

参考文献:
Kotlin语言中文站、《Kotlin程序开发入门精要》

推荐阅读:
从Java到Kotlin(一)为何使用Kotlin
从Java到Kotlin(二)基本语法
从Java到Kotlin(三)类和接口
从Java到Kotlin(四)对象与泛型
从Java到Kotlin(五)函数与Lambda表达式
从Java到Kotlin(六)扩展与委托
从Java到Kotlin(七)反射和注解
从Java到Kotlin(八)Kotlin的其余技术
Kotlin学习资料总汇


更多精彩文章请扫描下方二维码关注微信公众号"AndroidCzh":这里将长期为您分享原创文章、Android开发经验等! QQ交流群: 705929135

相关文章
相关标签/搜索