浅谈kotlin:类

听着music睡 听着music睡     2022-09-01     461

关键词:

浅谈Kotlin(一):简介及Android Studio中配置

浅谈Kotlin(二):基本类型、基本语法、代码风格

浅谈Kotlin(三):类

浅谈Kotlin(四):控制流 

 

前言:

  已经学习了前两篇文章,对Kotlin有了一个基本的认识,往后的文章开始深入介绍Kotlin的实战使用。

  本篇介绍Kotlin中类的使用。

 

一、表现形式

  首先看一段Java中定义类的形式,定义三个属性,每一个属性对应一个get、set方法,有一个toString()方法

/*
* @author xqx
* @emil djlxqx@163.com
* create at 2017/5/18
* description: 自己写的类,人,包含姓名,年龄,性别
*/

public class XPatient {
    private String name;  //姓名
    private int age;      //年龄
    private int sex;     //性别  1、男    2、女

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

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

    public int getSex() {
        return sex;
    }

    public void setSex(int sex) {
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "XPatient{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", sex=" + sex +
                '}';
    }
}

  

  接下来我们看这个类对应的Kotlin的表现形式:

  跟着下面的操作做一个处理,让我们这个类对应的 .java 文件转化为对应的 .kt 文件

  

  

  之后转换完成我们看下转换后的代码:

  看一下变化:

      1、代码量少了很多

      2、get/set方法都没有了

      3、只有一个重写的toString()方法。

      4、类的属性都有一个默认的初始值

/*
* @author xqx
* @emil djlxqx@163.com
* create at 2017/5/18
* description: 自己写的类,人,包含姓名,年龄,性别
*/

class XPatient {
    var name: String? = null  //姓名
    var age: Int = 0      //年龄
    var sex: Int = 0     //性别  1、男    2、女

    override fun toString(): String {
        return "XPatient{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", sex=" + sex +
                '}'
    }
}

 

二、定义类的构造方法

  首先看Java类的构造

  Java中定义构造方法特点:

      1、方法名需要和类名一致

      2、参数可以任意属性值的组合,也可以不写

      3、可以有多个构造方法

    //无参数的构造方法
    public JPatient() {
    }

    //类的三个属性值都需要的构造方法
    public JPatient(String name, int age, int sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

  

  在看Kotlin的类,这里有个知识点 :Kotlin类中可以有一个主构造方法一个至多个二级构造方法

  ①、主构造方法的的写法:

    直接写在类的头部,类似于定义方法的形式 加一个参数。

    需要添加 init{} 代码块来处理对主构造方法传来的参数的初始化操作

class XPatient(name: String? ,age: Int ,sex: Int) {  //主构造方法的形式 ,类名后面加(属性名 : 属性类型 .....)
    var name: String? = null  //姓名
    var age: Int = 0      //年龄
    var sex: Int = 0     //性别  1、男    2、女


    /*进行主构造函数的初始化,自己定制*/
    init {
        this.name = name;
        this.age = age+1;
        this.sex = sex-1;
    }
    ....
}

    

  ②、二级构造方法:

    为了实现类似于Java中一个类具有多种构造方法

    二级构造函数最终委托到主构造方法,中间可以有0个或多个中间二级构造方法。

    个人理解,如果涉及到一个类有多个构造方法的时候,主构造方法尽量设为无参的。

    如下:当创建一个对象XPatient("Alice",18); 的时候 会调用二级构造方法 constructor(name: String?,age : Int):this(name){}

       该二级构造方法再委托(调用)对应的一个参数name(String) 对应的二级构造方法  constructor(name:String?):this( ){}

       一个参数的该二级构造方法最终委托(调用)主构造方法

    下面举例测试:

class XPatient() {
var name: String? = null //姓名
var age: Int = 0 //年龄
var sex: Int = 0 //性别 1、男 2、女


/*进行主构造函数的初始化*/
init {
Log.i("xqxinfo","调用了无参数的主构造方法");
}

/*传入(name)*/
constructor(name:String?):this( ){
this.name = "Alice";
Log.i("xqxinfo","调用了一个参数的二级构造方法");

}
/*传入(name,age)*/
constructor(name: String?,age : Int):this(name){
this.age = age+1;
Log.i("xqxinfo","调用了两个参数的二级构造方法");
}

override fun toString(): String {
return "XPatient{" +
"name='" + name + '\'' +
", age=" + age +
", sex=" + sex +
'}'
}
}

    进行测试:

val patient = XPatient("Alice", 18)
Log.i("xqxinfo", "该对象的属性值" + patient.toString())

    打印结果:

05-19 18:08:05.621 25081-25081/? I/xqxinfo: 调用了无参数的主构造方法
05-19 18:08:05.621 25081-25081/? I/xqxinfo: 调用了一个参数的二级构造方法
05-19 18:08:05.621 25081-25081/? I/xqxinfo: 调用了两个参数的二级构造方法
05-19 18:08:05.621 25081-25081/? I/xqxinfo: 该对象的属性值XPatient{name='Alice', age=19, sex=0}

    这里看一下,不要以为先执行了主构造方法,然后再执行一个参数的,再执行两个参数的二级构造方法。

    实际还是先执行了创建对象的那个参数 对应的两个参数的二级构造方法,两个参数的构造方法调用一个参数的构造方法,一个参数的又调用了主构造方法。

    所以当主构造方法执行完之后,会返回来执行一个参数的构造方法内的处理,一个参数的构造方法执行完了,再执行两个参数的构造方法内的处理类似于递归。

      所以打印结果如上代码所示。

 

二、类的继承

  关于Kotlin的类有几个知识点需要先知道:

    1、默认情况下,任何类都是根继承自Any(类似于Java中的Object)

    2、默认情况下,任何类都是不可继承的(final)

    3、只有被申明open或者abstract的类可以被继承

 

  继承形式:

 

open class Animal(name: String)  // 被继承的类  需要open修饰
class Person(name: String, surname: String) : Animal(name)     //继承Animal类的类

 

 

 

注:方法即函数

 

浅谈kotlin解析之设计模式

一、前言设计模式是我们Android成长之路必备的一项技能,相信很多同学都已经Get了,现在让我们来看看在Kotlin中设计模式是如何表达的呢。二、单例模式单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称... 查看详情

kotlin|浅谈reified与泛型那些事(代码片段)

背景在业务中,或者要写某个技术组件时,我们无可避免会经常使用到泛型,从而让代码更具复用性与健壮性。但相应的,由于Java泛型存在类型擦除的实现机制,所以某些情况下就会显得力不从心。而在Kotlin... 查看详情

kotlin常用的kotlin类②(枚举类|枚举类定义函数|密封类)(代码片段)

...普通函数2、枚举类定义构造函数三、密封类一、枚举类Kotlin中使用枚举类定义常量,枚举类定义格式如下:枚举常量都是枚举类的实例对象;enumclass枚举类类型名 枚举常量1, 枚举常量2, ...代码示例:enumclassGenderMALE,FEMALEfunmain()println(Ge... 查看详情

kotlin常用的kotlin类②(枚举类|枚举类定义函数|密封类)(代码片段)

...普通函数2、枚举类定义构造函数三、密封类一、枚举类Kotlin中使用枚举类定义常量,枚举类定义格式如下:枚举常量都是枚举类的实例对象;enumclass枚举类类型名 枚举常量1, 枚举常量2, ...代码示例:enumclassGenderMALE,FEMALEfunmain()println(Ge... 查看详情

kotlin——最详细的抽象类(abstract)内部类(嵌套类)详解

在前面几个章节中,详细的介绍了Kotlin类的类别中的数据类、密封类、接口类以及枚举类。在这个章节中会对Koltin的抽象类和内部类作出一个详细的讲解。如果对上面所提到的类的类别还不是很清晰的,请阅读我的前几篇文章。... 查看详情

浅谈23种设计模式

浅谈23种设计模式类之间的关联关系:在使用Java、C#和C++等编程语言实现关联关系时,通常将一个类作为另一个类的属性。  (1)双向关联,两个类互相为各自的属性,比如顾客类Customer和商品类Product,顾客拥有商品,商品与某... 查看详情

Kotlin 类 NoClassDefFoundError 崩溃

】Kotlin类NoClassDefFoundError崩溃【英文标题】:KotlinclassNoClassDefFoundErrorcrash【发布时间】:2017-02-0114:04:47【问题描述】:我有一个使用以下库的现有Android项目:自动值匕首2RxJavaRetrolambda我正在尝试添加Kotlin支持,以便我可以将项目... 查看详情

访问公共类 (Kotlin)

】访问公共类(Kotlin)【英文标题】:Accessingapublicclass(Kotlin)【发布时间】:2021-09-1420:14:34【问题描述】:我是kotlin和androidstudio(我正在使用)的新手,所以这很简单,但是我在编写教程时遇到了这个问题问题很简单:我有两个kotl... 查看详情

kotlin学习与实践类接口

1、类的继承结构接口*Kotlin的类和接口与Java的有些地方不一样:*Kotlin的声明默认是publicfinal的。*Kotlin嵌套的类默认不是内部类:它没有包含对外部类的隐式引用等*Kotlin也一样是使用interface来声明接口*如下:声明一个简单的接口... 查看详情

Kotlin 数据类

】Kotlin数据类【英文标题】:KotlinDataclass【发布时间】:2019-08-1620:43:49【问题描述】:我在java中有以下POJO,它在SpringBoot应用程序中用于在应用程序启动期间从YML注入属性。尝试将应用程序转换为Kotlin,但是当我将POJO转换为数... 查看详情

Kotlin 类扩展

】Kotlin类扩展【英文标题】:KotlinClassExtension【发布时间】:2019-02-2102:27:49【问题描述】:我只是将Kotlin作为ProjectEuler的一个有趣的副项目来学习。我刚刚在5分钟前开始使用IntelliJIDEA。我有这个代码:funNumber.isMultipleOf(n:Number):Boo... 查看详情

Kotlin 类扩展

】Kotlin类扩展【英文标题】:KotlinClassExtension【发布时间】:2019-02-2102:27:49【问题描述】:我只是将Kotlin作为ProjectEuler的一个有趣的副项目来学习。我刚刚在5分钟前开始使用IntelliJIDEA。我有这个代码:funNumber.isMultipleOf(n:Number):Boo... 查看详情

Kotlin:找不到符号类片段或其他 android 类

】Kotlin:找不到符号类片段或其他android类【英文标题】:Kotlin:CannotfindsymbolclassFragmentorotherandroidclasses【发布时间】:2017-10-3001:42:04【问题描述】:我有一个带有viewPager的java片段..publicclassFragmentWithViewPagerextendsFragmentprivateclassViewPa... 查看详情

正如文档中所说,kotlin 1.2 中没有 kotlin.Math 类

】正如文档中所说,kotlin1.2中没有kotlin.Math类【英文标题】:Nokotlin.Mathclassinkotlin1.2asitissaidinthedocumentation【发布时间】:2019-01-0301:12:45【问题描述】:我最近一直在处理kotlin多平台,我完全理解开发的本质。最初,我有自己预期... 查看详情

浅谈jrebel

有个同事提高个jrebel的工具,提起tomcat的热部署方案。 jrebel是一款收费的JVM级的热部署工具包。 JVM级的热部署也就是说,可以不重启JVM,让修改或添加的类加载到JVM中。 加载器:启动类加载器-》扩展类加载器-》应... 查看详情

RealmObject 的 Kotlin 数据类

】RealmObject的Kotlin数据类【英文标题】:KotlindataclassofRealmObject【发布时间】:2016-03-2521:58:35【问题描述】:我正在使用Kotlin和Realm编写一个数据类dataclassAuthToken(valregister:Boolean,valtoken:String,valtokenSecret:String,valuser:AuthUser)我必须将数... 查看详情

如何从kotlin中的类实例化对象

】如何从kotlin中的类实例化对象【英文标题】:howtoinstantiateanobjectfromaclassinkotlin【发布时间】:2019-02-1403:54:18【问题描述】:我正在学习Kotlin,我在google上搜索了如何在kotlin中创建一个类。所以,我创建了下面的类作为测试。在... 查看详情

深入kotlin-类(代码片段)

类Kotlin中定义类有些地方不同于java。不需要public一个类默认就是public的,所以不用显示地声明一个类为public。不需要花括号如果一个类是空实现,可以不需要classMyClass主构造方法Kotlin规定每个类允许有一个主构造方法和... 查看详情