Android学习(五)-Kotlin编程语言-面向对象中的 继承-构造函数-接口三模块学习
首先,我们需要定义一个 Person 类:
open class Person {var name = ""var age = 0fun 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() {
}
在这个例子中,sno 和 grade 是通过主构造函数传入的参数,并且被声明为 val,这样它们就成为了 Student 类的属性。
初始化逻辑
如果需要在主构造函数中编写一些初始化逻辑,可以使用 init 块:
class Student(val sno: String, val grade: Int) : Person() {init {println("sno is $sno")println("grade is $grade")}
}
调用父类构造函数
当父类有带参数的构造函数时,子类的主构造函数必须通过括号传递这些参数。例如,修改 Person 类使其带有 name 和 age 参数:
open class Person(val name: String, val age: Int) {var name = namevar age = agefun eat() {println("$name is eating.")}
}
相应的,Student 类需要修改如下:
class Student(val sno: String, val grade: Int, name: String, age: Int) : Person(name, age) {
}
这里我们在 Student 类的主构造函数中添加了 name 和 age 参数,并将它们传递给 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.")}
}
相关文章:
Android学习(五)-Kotlin编程语言-面向对象中的 继承-构造函数-接口三模块学习
首先,我们需要定义一个 Person 类: open class Person {var name ""var age 0fun eat() {println("$name is eating.")} } 注意,Person 类前面加上了 open 关键字,表示这个类可以被继承。在 Kotlin 中&am…...
滑动窗口 + 算法复习
维护一个满足条件的窗口大小,然后进行双指针移动 1.最长子串 题目链接:1.最长子串 - 蓝桥云课 #include<bits/stdc.h> #define int long long using namespace std; string s; int k; signed main() {int max_len0,left0;cin>>s>>k;…...
贪心算法 greedy
文章目录 参考贪心算法[Leetcode455 分发饼干](https://leetcode.cn/problems/assign-cookies/description/)分析题解 [Leetcode135 分发糖果](https://leetcode.cn/problems/assign-cookies/description/)分析题解 leetcode435无重叠区间分析题解 参考 https://github.com/ch…...
基于python的家教预约网站-家教信息平台系统
标题:基于 Python 的家教预约网站-家教信息平台系统 内容:1.摘要 本文介绍了一个基于 Python 的家教预约网站-家教信息平台系统。该系统旨在为学生和家长提供一个方便、高效的家教预约平台,同时也为家教老师提供一个展示自己教学能力和经验的机会。本文详细介绍了系…...
基于深度学习多图像融合的屏幕缺陷检测方案
公司项目,已申请专利。 深度学习作为新兴技术在图像领域蓬勃发展,因其自主学习图像数据特征的性能避免了人工设计算法的繁琐,精准的检测性能、高效的检测效率以及对各种不同类型的图像任务都有比较好的泛化性能,使得深度学习技术在…...
MySQL基础笔记(三)
在此特别感谢尚硅谷-康师傅的MySQL精品教程 获取更好的阅读体验请前往我的博客主站! 如果本文对你的学习有帮助,请多多点赞、评论、收藏,你们的反馈是我更新最大的动力! 创建和管理表 1. 基础知识 1.1 一条数据存储的过程 存储数据是处理数…...
【JetPack】WorkManager笔记
WorkManager简介: WorkManager 是 Android Jetpack 库中的一个重要组件。它用于处理那些需要在后台可靠执行的任务,这些任务可以是一次性的,也可以是周期性的,甚至是需要满足特定条件才执行的任务。例如,它可以用于在后…...
docker 安装 ftp
前言 经多次测试 不知道为什么 必须添加被动模式跟端口才可以 连接成功,有知道为什么可以评论下 下载镜像 docker pull fauria/vsftpd启动ftp 服务 参考链接 docker run -d -v /etc/localtime:/etc/localtime:ro -v /home/dr/data/ftp:/home/vsftpd \ -e "…...
5.C语言内存分区-堆-栈
目录 内存分区 运行之前 代码区 全局初始化数据区 、静态数据区 (data) 未初始化数据区(bss(Block Started by Symbol)区) 总结 运行之后 代码区 (text segment) 未初始化数据区(bss) 全局初始化数据区,静态…...
传统CV算法——基于opencv的答题卡识别判卷系统
基于OpenCV的答题卡识别系统,其主要功能是自动读取并评分答题卡上的选择题答案。系统通过图像处理和计算机视觉技术,自动化地完成了从读取图像到输出成绩的整个流程。下面是该系统的主要步骤和实现细节的概述: 1. 导入必要的库 系统首先导入…...
国产 HighGo 数据库企业版安装与配置指南
国产 HighGo 数据库企业版安装与配置指南 1. 下载安装包 访问 HighGo 官方网站(https://www.highgo.com/),选择并下载企业版安装包。 2. 上传安装包到服务器 将下载的安装包上传至服务器,并执行以下命令: [rootmas…...
「Mac畅玩鸿蒙与硬件46」UI互动应用篇23 - 自定义天气预报组件
本篇将带你实现一个自定义天气预报组件。用户可以通过选择不同城市来获取相应的天气信息,页面会显示当前城市的天气图标、温度及天气描述。这一功能适合用于动态展示天气信息的小型应用。 关键词 UI互动应用天气预报数据绑定动态展示状态管理 一、功能说明 自定义…...
Springboot @Transactional使用时需注意的几个问题
一、事务的隔离级别 在Springboot应用中,如果我们想实现方法一旦执行有异常产生,就触发事务回滚,可以在方法上面添加Transactional注解。如果应用采用mysql数据库,虽然mysql本身也有事务隔离机制,但在Sping数据库的应…...
数字经济下的 AR 眼镜
目录 1. 📂 AR 眼镜发展历史 1.1 AR 眼镜相关概念 1.2 市面主流 XR 眼镜 1.3 AR 眼镜大事记 1.4 国内外 XR 眼镜 1.5 国内 AR 眼镜四小龙 2. 🔱 关键技术 2.1 AR 眼镜近眼显示原理 2.2 AR 眼镜关键技术 2.3 AR 眼镜技术难点 3. Ὂ…...
力扣150题
88. 合并两个有序数组 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。 **注意:**…...
剑指offer搜索二维矩阵
题目连接 https://leetcode.cn/problems/search-a-2d-matrix-ii/’ 代码 自己想出来的 解法一 初始化两个指针,i0,j列数-1 若此时matrix[i][j]target 则返回true 若此时matrix[i][j]>target,表明在第j列中不可能存在target,因为列是升序的 若此时ma…...
如何设置浏览器不缓存网页
设置浏览器不缓存网页可以通过多种方法实现,以下是一些常见的策略: HTTP响应头控制: Cache-Control:这是最常用的HTTP头之一,用于控制响应的缓存行为。例如: Cache-Control: no-cache, no-store, must-r…...
Iris简单实现Go web服务器
package mainimport ("github.com/kataras/iris" )func main() {app : iris.New() // 实例一个iris对象//配置路由app.Get("/", func(ctx iris.Context) {ctx.WriteString("Hello Iris")})app.Get("/aa", func(ctx iris.Context) {ct…...
后端项目java中字符串、集合、日期时间常用方法
我这里只介绍了项目中最常用的哈,比如像集合有很多,但我们最常用的就是ArrayList。 然后我这里会以javascript中的字符串、数组的方法为基准来实现,有些方法js和java会有些区别也会介绍 字符串 每次修改 String 对象都会创建一个新的对象,而 StringBuffer 可以在同一个对象…...
【Spring事务】深入浅出Spring事务从原理到源码
什么是事务 保证业务操作完整性的一种数据库机制 (driver 驱动)事务特定 ACID A 原子性 (多次操作 要不一起成功 要不一起失败 (部分失败 savepoint)) C 一致性 (事务开始时数据状态,…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
