Scala入门到放弃—03—面向对象

news2024/11/15 6:51:06

文章目录

  • 面向对象
      • 概述
      • 类的定义和使用
      • 构造器
      • 继承和重写
      • 抽象类
      • 伴生类和伴生对象
      • case和trait

面向对象

概述

OO(Object Oriented)

  • 封装:属性、方法封装到类中,可设置访问级别
  • 继承:父类和子类之间的关系 ,重写
  • 多态:父类引用指向子类对象 ,开发框架基石
    Person person = new Person();
    User user = new User();
    Person person =new User();

类的定义和使用

package org.example
object ObjectApp {
  def main(args: Array[String]): Unit = {
    val person = new People()
    person.name = "szm"
    println(person.name + ".." + person.age)

    println("invoke eat method: " + person.eat)
    person.watchFootball("GuoZU")
    person.printInfo()
    //编译不通过 private 修饰
    //println(person.gender)
  }
}

class People{
  //var(变量)类型自动生成getter/setter
  //val(常量)类型自动生成getter
  //_这种写法就是一个占位符,只可以用于var
  // 定义属性
  var name: String = _
  val age: Int = 10
  private [this] var gender = "male"
  // 定义方法
  def printInfo() : Unit = {
    print("gender: " + gender)
  }
  def eat(): String = {
    name + " eat..."
  }
  def watchFootball(teamName: String): Unit = {
    println(name + " is watching match of " + teamName)
  }
}

invoke eat method: szmy …
Messi is watching match of GuoZu
gender: male

构造器

Scala构造器的基本语法:

class 类名(形参列表) {  // 主构造器   注意这种定义格式和java不同
   // 类体
   def  this(形参列表) {  // 辅助构造器
   }
   def  this(形参列表) {  //辅助构造器可以有多个...
   }
} 
object People {
  def main(args: Array[String]): Unit = {
    val s = new Student
    s.name = "tom"
    s.age = 19
    s.printInfo()
  }
}
class Student { // 或者 class Student()  这样写也可以
  var name: String = _
  var age: Int = _
  // 辅助构造器无论是直接或间接,最终都一定要调用主构造器,执行主构造器的逻辑,并且调用的代码一定要放在第一行
  def this(name: String) {
    this() // 直接调用主构造器(主构造器是一个空的构造器)
    this.name = name
    print("this(name: String)")
  }
  def this(name: String, age: Int) {
    this() // 直接调用主构造器
    this.name = name
    this.age = age
    println("this(name: String, age: Int)")
  }
  def this(age: Int) {
    this("jack") // 调用其他辅助构造器,但是这里也间接调用了主构造器,因为 def this(name: String)中调用了主构造器
    this.age = age
  }
  println("主构造器中的语句")
  def printInfo(): Unit = {
    println("name:" + name)
    println("age: " + age)
  }
}

继承和重写

  • 继承
// 如果是父类没有的需要var进行添加
class Student(name: String, age: Int, var major: String) extends Person(name, age) {}
  • 重写
// 父类存在的需要添加关键字 override 
	override def acquireUnrollMemory()
	override def toString = "test override"
package org.example
object ConstructorApp {
  def main(args: Array[String]): Unit = {
    var person =new Person("zhangsan",99)
    println(person.age+":"+person.name)
    var person2 =new Person("zhangsan",99,"Man")
    println(person2.age+":"+person2.name+";"+person2.gender)
  }

}
//主构造器
class Person(val name: String, val age: Int){
  println("Person constructor enter...")
  val school = "ustc"
   //占位符肯定要预先指定类型
  var gender: String = _
  //附属构造器
  def this(name: String , age: Int, gender: String){
    //必须要调用主构造器或者其他附属构造器
    this(name, age)
    this.gender = gender
  }
  override def toString = "test override"
  println("Person Constructor leave...")
}

//继承
//name: String, age: Int, var major: String 继承父类的可以不用直接写var 否则需要重新申明
class Student(name: String, age: Int, var major: String) extends Person(name, age) {

//重写
override val school = "pku"
println("Person Student enter...")
println("Person Student leave...")
}


抽象类

抽线类无法直接实例化,需要通过继承来实例化

package org.example
object AbstractApp {
  def main(args: Array[String]): Unit = {
    var stu =new Student1();
    println(stu.age)
    println(stu.name)
    stu.speak;
  }
}
abstract class Person3{
  def speak
  val name: String
  val age: Int
}

class Student1 extends Person3{
  override def speak: Unit = {
    println("speak")
  }
  override val name: String = "szm"
  override val age: Int = 32
}

伴生类和伴生对象

如果有一个class,还有一个与class同名的object ,则称为两者互为 伴生类和伴生对象


class ApplyTest{
	def apply(){
		println(...)
	}
} 
object ApplyTest{
	def apply(){
		println("Object ApplyTest apply...")
		new ApplyTest
	}
} 
	

类名() ==> Object.apply
对象() ==> Class.apply
最佳实践:在Object的apply方法中去new一个Class

package org.example
object ApplyApp {
  def main(args: Array[String]): Unit = {
//    for(i<-1 to 10){
//      ApplyTest.incr
//    }
//    //object 是一个单例对象
//    println(ApplyTest.count)

    var b=ApplyTest()
    //默认走的是object.apply
    //Object ApplyTest apply...

    println("-----------------------")
    var c= new ApplyTest()
    c()
    //Class ApplyTest apply...
  }

}
class ApplyTest {
  def apply() = {
    println("Class ApplyTest apply...")
  }
}
object ApplyTest {
  println("Object start...")
  var count = 0
  def incr={
    count=count+1
  }
  def apply() = {
    println("Object ApplyTest apply...")
    //在object中的apply中new class
    new ApplyTest
  }
  println("Object end...")
}

case和trait

case class :不用new;通常会用到模式匹配里面

case class Dog(name: String)
// 直接可以调用
Dog("wangcai")

Trait: 类似implements ;第一个使用extends,第二个+使用with即可

trait xxx entends ATrait {

}

trait xxx extends Cloneable with Logging with Serializable{

}

源码中Partition类

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小程序中如何(批量)打印订单的小票、标签、发货单和电子面单

在小程序中可以实现打印订单小票、标签、发货单和电子面单&#xff0c;以及进行批量选择打印。下面具体介绍。 在打印订单之前&#xff0c;需要在小程序管理员后台->打印设置处&#xff0c;添加对应的打印机。打印机支持云打印和本地打印二种模式&#xff0c;云打印是指打印…

【Q1—45min】

1.epoll除了边沿触发还有什么&#xff1f;与select区别. epoll 是Linux平台下的一种特有的多路复用IO实现方式&#xff0c;与传统的 select 相比&#xff0c;epoll 在性能上有很大的提升。 epoll是一种当文件描述符的内核缓冲区非空的时候&#xff0c;发出可读信号进行通知&…

【C语言】条件变量(pthread_cond_t)

一、概述 条件变量(pthread_cond_t)是POSIX线程&#xff08;也称为pthread&#xff09;库中用于线程同步的一种机制。在多线程程序中&#xff0c;条件变量通常与互斥锁(pthread_mutex_t)一起使用&#xff0c;以防止并发问题&#xff0c;如竞态条件和死锁。 二、条件变量(pthre…

JS:给数字添加千分位符(每3位数用逗号隔开)

背景 如果一串数字的长度太长&#xff0c;就不方便阅读&#xff0c;因此可以采用分隔符对数字进行分割本文的分割规则是&#xff1a; 如果数字的长度大于等于5则进行分割&#xff0c;每3位数用逗号分割开 解决 数字可以分为&#xff1a;number类型的数字和字符串类型的数字&…

76基于matlab的免疫算法求解配送中心选址问题,根据配送地址确定最佳配送中心地址位置。

基于matlab的免疫算法求解配送中心选址问题&#xff0c;根据配送地址确定最佳配送中心地址位置。数据可更换自己的&#xff0c;程序已调通&#xff0c;可直接运行。 76matlab免疫算法配送中心选址 (xiaohongshu.com)

day17-高速缓冲区的管理机制

1.目的 用户与磁盘进行文件交互时的流程 磁盘与高速缓冲区的关系 加深块设备驱动的理解 hash 循环链表 单链表的使用方法 2.高速缓冲区的工作流程 高速缓冲区中存储这对应的块设备驱动的数据 当从块设备中读取数据的时候&#xff0c;OS首先会从高速缓冲区中进行检索&#xff0…

【Redis使用】一年多来redis使用笔记md文档,第(2)篇:命令和数据库操作

Redis 是一个高性能的key-value数据库。本文会让你知道&#xff1a;什么是 nosql、Redis 的特点、如何修改常用Redis配置、写出Redis中string类型数据的增删改查操作命令、写出Redis中hash类型数据的增删改查相关命令、说出Redis中 list 保存的数据类型、使用StrictRedis对象对…

深度学习领域中的耦合与解耦

在阅读论文的时候应该会看到两个操作&#xff0c;一个是耦合&#xff0c;一个是解耦&#xff0c;经常搭配着出现的就是两个词语&#xff0c;耦合头&#xff08;Coupled head&#xff09;以及Decoupled head&#xff08;解耦合头&#xff09;&#xff0c;那为什么要耦合&#xf…

电影:从微缩模型到AI纹理

在线工具推荐&#xff1a; 三维数字孪生场景工具 - GLTF/GLB在线编辑器 - Three.js AI自动纹理化开发 - YOLO 虚幻合成数据生成器 - 3D模型在线转换 - 3D模型预览图生成服务 自胶片问世以来&#xff0c;电影制作人必须以模仿现实的方式使用纹理&#xff0c;让观众相信他…

Nginx-负载均衡-动静分离-虚拟主机

负载均衡 负载均衡基本使用 1 配置上游服务器 upstream myserver { #是server外层server ip1:8080;server ip1:8080; }2 配置代理 server {location / { proxy_pass http://myserver;#请求转向myserver 定义的服务器列表 注意这个http不能丢 pro…

你知道STM32和51单片机的区别吗?

你知道STM32和51单片机的区别吗&#xff1f; 51单片机是很经典的一款单片机。事实上很多电信专业本科阶段都会以这个单片机作为入门。最近很多小伙伴找我&#xff0c;说想要一些STM32的资料&#xff0c;然后我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#xff0c;精心…

8086/8088 存储器分段概念

8086/8088 存储器分段概念 这一节主要讲述8086/8088 存储器分段的概念。 目的 从8086 CPU开始采用了分段的方法管理存储器&#xff0c;只有充分理解存储器分段的概念和存储器逻辑地址和物理地址的关系&#xff0c;才能有助于我们掌握8086/8088汇编语言。 存储器分段的原因 在此…

【EI会议征稿】2024年智慧城市与信息系统国际学术会议 (ICSCIS 2024)

2024年智慧城市与信息系统国际学术会议 (ICSCIS 2024) 2024 International Conference on Smart City and Information System 随着互联网技术的发展&#xff0c;城市化进程的深入&#xff0c;智慧城市的研究与发展越来越普遍&#xff0c;运用物联网、云计算、大数据等先进信…

数据结构:枚举

概念 枚举主要用途是&#xff1a;将一组常量组织起来&#xff0c;在这之前表示一组常量通常使用定义常量的方式&#xff1a; 比如下面的例子&#xff1a; public static final int RED 1; public static final int GREEN 2; public static final int BLACK 3; 利用常量…

想做副业在哪里找?做好这些副业平台就够了

每个人在生活中都有一些额外的需求和理想&#xff0c;所以越来越多的人开始寻找副业来实现小目标。但是&#xff0c;但是寻找副业的过程并不容易&#xff0c;需要考虑到自己的时间和能力&#xff0c;还有选择一个靠谱的平台。其实&#xff0c;副业平台并不太难&#xff0c;只要…

被OpenAI开除后,创始人奥特曼在微软找到了新工作

微软首席执行官纳德拉宣布&#xff0c;OpenAI创始人Sam Altman和Brockman及其同事将加入微软。随后&#xff0c;Altman转发了他的推特。 此前&#xff0c;外媒消息称&#xff0c;OpenAI首席科学家伊尔亚苏茨克维&#xff08;Ilya Sutskever&#xff09;周日晚告知公司员工&…

springboot中动态api如何设置

1.不需要编写controller 等mvc层&#xff0c;通过接口动态生成api。 这个问题&#xff0c;其实很好解决&#xff0c;以前编写接口&#xff0c;是要写controller&#xff0c;需要有 RestController RequestMapping("/test1") public class xxxController{ ApiOperat…

使用 Amazon VPS 探索存储选项:实用指南

文章作者&#xff1a;Libai 在这个数字化时代&#xff0c;云计算已经成为了企业的必需品&#xff0c;它为我们带来了可扩展性、灵活性和成本效益。作为一家领先的云服务提供商&#xff0c;亚马逊网络服务&#xff08;Amazon Web Services&#xff09;提供了各种各样的服务&…

栈和队列知识点+例题

1.栈 1.1栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素的操作。进行数据插入和删除操作的一端成为栈顶&#xff0c;另一端成为栈底。遵守后进先出的原则&#xff08;类似于弹夹&#xff09; 压栈&#xff1a;栈的插入操…

Linux搭建服务器环境,挂载SpringBoot+VUE项目

本地环境 Ubuntu20.04 服务器环境 CentOS7.6 购买服务器 以阿里云轻量服务器&#xff08;适合初学者&#xff09;为例&#xff0c;自行选择规格进行购买 购买完成后&#xff0c;获取服务器公网IP&#xff0c;同时重置密码&#xff0c;设置服务器密码 配置防火墙 点击实例ID&am…