Android学习(五)-Kotlin编程语言-面向对象中的 继承-构造函数-接口三模块学习

首先,我们需要定义一个 Person 类:

open class Person {
    var name = ""
    var age = 0

    fun eat() {
        println("$name is eating.")
    }
}

注意,Person 类前面加上了 open 关键字,表示这个类可以被继承。在 Kotlin 中,默认情况下类是不可继承的,必须显式地声明为 open

定义 Student

接下来,我们定义 Student 类并让它继承 Person 类:

class Student : Person() {
    var sno = ""
    var grade = 0
}

这里使用冒号 : 来表示继承关系,并且在 Person() 后面加上括号。这表示 Student 类的主构造函数在初始化时会调用 Person 类的无参数构造函数。

构造函数

Kotlin 的构造函数分为两种:主构造函数和次构造函数。这里只讲解主构造函数

主构造函数

主构造函数是最常用的构造函数,直接定义在类名后面。例如:

class Student(val sno: String, val grade: Int) : Person() {
}

在这个例子中,snograde 是通过主构造函数传入的参数,并且被声明为 val,这样它们就成为了 Student 类的属性。

初始化逻辑

如果需要在主构造函数中编写一些初始化逻辑,可以使用 init 块:

class Student(val sno: String, val grade: Int) : Person() {
    init {
        println("sno is $sno")
        println("grade is $grade")
    }
}
调用父类构造函数

当父类有带参数的构造函数时,子类的主构造函数必须通过括号传递这些参数。例如,修改 Person 类使其带有 nameage 参数:

open class Person(val name: String, val age: Int) {
    var name = name
    var age = age

    fun eat() {
        println("$name is eating.")
    }
}

相应的,Student 类需要修改如下:

class Student(val sno: String, val grade: Int, name: String, age: Int) : Person(name, age) {
}

这里我们在 Student 类的主构造函数中添加了 nameage 参数,并将它们传递给 Person 类的构造函数。


接口

接口

在面向对象编程中,接口是实现多态编程的重要组成部分。Java 是单继承语言,但可以实现多个接口。Kotlin 中的接口与 Java 非常相似,但也有一些细微差别。接下来,我们将通过具体代码学习如何在 Kotlin 中使用接口。

定义接口

首先,我们创建一个名为 fly 的接口,选择类型为“Interface”。

interface fly() { 
   println("cat can fly")
}

在接口中定义的函数不需要有具体的实现,只是声明了需要实现的行为。

实现接口
open class animal{
    val name:String="小花";
    var age:Int=0;
}
class cat: animal(),catfly{
    override fun fly(){
     println("猫会飞")
    }
}
interface catfly {
    fun fly(){
        println("cat can fly")
    }
}

在 Kotlin 中,继承父类和实现接口都使用冒号 :,多个接口之间用逗号 , 分隔。

默认实现

Kotlin 允许对接口中的函数提供默认实现。这与 Java 8 引入的默认方法类似。

interface abc { 
    fun num() { 
        println("abc") 
    } 
}

现在,如果某个类实现了 abc 接口但没有重写 num 函数,将自动使用默认实现。


函数的可见性修饰符

在面向对象编程中,控制函数和属性的可见性非常重要。Java 和 Kotlin 都提供了多种可见性修饰符,但它们之间有一些差异。接下来,我们将详细对比这两种语言中的可见性修饰符。

常见的可见性修饰符

修饰符

Java

Kotlin

public

所有类可见(默认)

所有类可见(默认)

private

当前类可见

当前类可见

protected

当前类、子类、同一包路径下的类可见

当前类、子类可见

default

同一包路径下的类可见(默认)

internal

同一模块中的类可见

详细说明
  • public: 表示该函数或属性对所有类都可见。在 Kotlin 中,默认情况下所有函数和属性都是 public
  • private: 表示该函数或属性只对当前类内部可见。与其他语言一致。
  • protected: 在 Java 中,表示该函数或属性对当前类、子类和同一包路径下的类可见。而在 Kotlin 中,protected 仅对当前类和子类可见。
  • default (Java): 表示该函数或属性在同一包路径下的类可见。这是 Java 中的一种默认可见性,但在 Kotlin 中不存在。
  • internal (Kotlin): 表示该函数或属性在同一模块中的类可见。这对于模块化开发非常有用,可以隐藏一些内部实现细节。
示例

下面是一些具体的代码示例,展示如何在 Kotlin 中使用不同的可见性修饰符。

Public
public class MyClass {
    public fun myPublicFunction() {
        println("public.")
    }
}
Private
class MyClass {
    private fun myPrivateFunction() {
        println("private.")
    }
}
Protected
open class ParentClass {
    protected fun myProtectedFunction() {
        println("This function is protected.")
    }
}

class ChildClass : ParentClass() {
    fun accessProtectedFunction() {
        myProtectedFunction()
    }
}
Internal
internal class MyInternalClass {
    internal fun myInternalFunction() {
        println("internal.")
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/941038.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

永磁同步电机负载估计算法--自适应扩张状态观测器

一、 原理介绍 在线性扩张观测器中,LESO观测器增益ω0 决定了观测器的跟踪速度,ω0 越大,观测器估计精度越高, 抗干扰能力越强,瞬态响应速度加快,过大则会引入高频噪声使系统不稳定。为使观测器在全速域内…

【Spring事务】深入浅出Spring事务从原理到源码

什么是事务 保证业务操作完整性的一种数据库机制 (driver 驱动)事务特定 ACID A 原子性 (多次操作 要不一起成功 要不一起失败 (部分失败 savepoint)) C 一致性 (事务开始时数据状态&#xff0c…

Apache解析漏洞(apache_parsingCVE-2017-15715)

apache_parsing 到浏览器中访问网站 http://8.155.8.239:81/ 我们写一个木马 1.php.jpg 我们将写好的木马上传 会得到我们上传文件的路径 我们访问一下 发现上传成功 发现木马运行成功,接下来使用蚁剑连接我们的图片马 获取 shell 成功 CVE-2013-454 我们还是到…

CCF-GESP 等级考试 2023年9月认证C++二级真题解析

2023年9月真题 一、单选题(每题2分,共30分) 正确答案:D 解析:考察知识点:计算机基础 本题属于考察计算机基础知识。中国第一台计算机通用数字电子计算机于 1958 年 6 月由中科院计算所研制成功。那时候的逻…

linux环境使用yum方式安装nginx

linux环境使用yum方式安装nginx 一、nginx官网 二、nginx安装 点击首页的 Docs 或者 install 都可以,最终都是进入到Installing nginx页面 因为安装的服务器环境是linux centos 所以选择 Installation on Linux下面 packages 跳转链接 点击packages后 最终会跳转…

CS 144 check6: buiding an IP router

Lecture Notes Exercises 路由器的任务是根据路由表转发接收到的数据报:路由表是一系列规则,用于指导路由器针对任何给定的数据报应如何进行转发。 发送出什么接口。下一跳的IP地址。 这个check的工作是实现一个路由器,它可以为任何给定的…

Android Studio IDE环境配置

​需要安装哪些东西: Java jdk Java Downloads | OracleAndroid Studio 下载 Android Studio 和应用工具 - Android 开发者 | Android DevelopersAndroid Sdk 现在的Android Studio版本安装时会自动安装,需要注意下安装的路径Android Studio插件…

时钟周期、机器周期及指令周期是什么关系?

组成原理中,时钟周期、机器周期和指令周期是三个至关重要的概念,它们共同定义了计算机执行指令的基本时间框架。本文将对这三个周期进行详细介绍,并展示它们的工作原理。 一、时钟周期(Clock Cycle) 定义与作用 主…

YOLOv8改进,YOLOv8引入Hyper-YOLO的MANet混合聚合网络+HyperC2Net网络

摘要 理论介绍 MANet 的目标是通过多种卷积操作的协同作用,提高特征提取能力,并加强梯度流动,从而提升模型在不同层次的特征表示和语义深度。MANet 结合了三种卷积变体,通过混合使用它们来提高视觉特征的多样性和信息流动性。 HyperC2Net 的主要目标是通过超图结构对多层次…

挑战一个月基本掌握C++(第六天)了解函数,数字,数组,字符串

一 C函数 函数是一组一起执行一个任务的语句。每个 C 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数。 您可以把代码划分到不同的函数中。如何划分代码到不同的函数中是由您来决定的,但在逻辑上&#xff…

vue的ElMessage的css样式不生效

我使用elementplus,是使用的用哪个单独引入的,然后表单校验时候警告的css不生效,就是这个效果 反复看视频的引入也没发现问题,后来才知道需要这个引入 import { ElMessage } from "element-plus"; import element-pl…

PromptGIP:Unifying lmage Processing as Visual Prompting Question Answering

“Unifying Image Processing as Visual Prompting Question Answering” 文章提出了一种名为 PromptGIP 的通用模型,将图像处理任务统一为视觉提示问答范式,在多个图像处理任务上展现出良好性能,为通用图像处理提供了新的思路和方法。 confe…

Windows服务器修复SSL/TLS协议信息泄露漏洞等...

为了保证生产环境的安全, 我们会定期对服务器进行漏洞扫描, 一般情况下我们都是使用Linux服务器, 某些情况会用到Windows服务器 出现SSL/TLS协议信息泄露漏洞问题一般情况下是远程连接使用了不安全的加密算法, 需要禁用这些加密算法 修复方法 从网络中查询修复方法又很多, 大…

基于AT89C52单片机的6位电子密码锁设计

点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/90166684?spm1001.2014.3001.5503 14 部分参考设计如下: 目 录 摘要 1 abstract 2 1 绪论 3 1.1 课题背景 3 1.2 课题的目的和意义 3 1.3 电子密码…

考前倒计时98天

2024年12月21日到2025年3月29日共有 98​ 天 一、计算机基础 思维分类特征强调学科代表理论思维(推理思维)推理和演绎推理数学实验思维(证实思维)观察和总结自然规律归纳物理学计算思维(构造思维)设计和构造…

力扣-图论-70【算法学习day.70】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非…

最新详细Gmail 注册指南以及注册谷歌账号手机号码无法验证?解决方法分享

Gmail 注册指南:2024 年实用教程,解决手机号验证难题,开启你的数字之旅 在当今信息时代,Gmail 邮箱已成为我们工作与生活中常用的数字工具,它不仅功能强大、界面简洁,还是访问 Google 服务(如 …

【已解决】黑马点评项目jmeter高并发测试中用户数据的生成

具体实现见此篇文章的第3章 运行 test 程序后,生成以下用户名 以下文件名改成自己的地址 成功

范德蒙矩阵(Vandermonde 矩阵)简介:意义、用途及编程应用

参考: Introduction to Applied Linear Algebra – Vectors, Matrices, and Least Squares Stephen Boyd and Lieven Vandenberghe 书的网站: https://web.stanford.edu/~boyd/vmls/ Vandermonde 矩阵简介:意义、用途及编程应用 在数学和计算科学中&a…

数智化医院分布式计算框架融合人工智能方向初步实现与能力转换浅析

人工智能中心计算机 一、引言 1.1 研究背景与意义 近年来,人工智能(Artificial Intelligence,AI)与大数据技术的迅猛发展为医疗行业带来了前所未有的变革机遇。医疗领域积累了海量的数据,如电子病历(Electronic Medical Record,EMR)、医学影像、临床检验数据以及基因…