Scala之面向对象

目录

Scala包:

基础语法:

Scala包的三大作用:

包名的命名规范:

写包的好处:

包对象:

导包说明:

类和对象:

定义类:

封装:

构造器:

 主从构造器的加载机制:

继承:

基础语法:

抽象属性:

多态:

Java中的多态测试

Scala测试如下:


Scala的面向对象思想和Java是一致的

Scala包:

基础语法:

        package 包名.类名

Scala包的三大作用:

        区分相同名字的类

        当类很多时,可以很好的管理类

        控制访问范围

包名的命名规范:

             一般是小写字母+小圆点

   com.公司名.项目名.业务模块名

写包的好处:

在maven中可以将自己写的包通过maven导入到项目中

在Scala中独有的包的写法  和文件夹不对应  可以独立存在

下图是我在类下边建的包,和正常的包一样使用 

 包是可以嵌套的

内层调用外层 不需要导包  atguigu包在techer下
外层调用内层 对象 需要导包

如下代码:

package chapter04
object Test_01_package {
  def main(args: Array[String]): Unit = {
  }
}
//Scala独有的
package techer {
  import chapter04.techer.atguigu.Inner
  object test01t {
    def main(args: Array[String]): Unit = {
      println("hello  我是大哥 pack")
      //外层调用内层 对象 需要导包
          //Inner.main是下边那个包中的
      Inner.main(args)
    }
  }
  package atguigu {
    object Inner {
      def main(args: Array[String]): Unit = {
        println("Inner")
        //内层调用外层 不需要导包  atguigu包在techer下
        test01t.main(args)
      }
    }
  }
}


包对象:

在Scala中包也是面向对象的,只要在包的内部(只要在内部都可以,内层的嵌套也可以),都可以直接调用包对象的属性和方法

如果包有嵌套,会出现覆盖的情况,则会调用距离最近的包的属性与方法(包距离最近则会后调用,会覆盖先前调用的)

导包说明:

导包是不支持嵌套的(导包后只能用它下边的类和对象,不能再用它下边的包,如果想使用它下边包中的方法,就需要使用   .   但是当我们导包直接导入它下边的包  就可以直接调用,不需要用  .     来使用)

Scala 中的三个默认导入分别是
import java.lang._
import scala._
import scala.Predef._

类和对象:

类:可以看成一个模板
对象:表示具体的事物

我们在使用对象的时候,会以类为模板创建对象

定义类:

在Java中一个文件中只能有一个public    

在Scala中 默认的是public 但是它在一个文件中可以创建多个伴生类和伴生对象

封装:

在Scala中属性只有两种  可变(var)与不可变(val)(分离了读写权限----类似与面向对象中的封装(封装get  set  方法  是为了分离读写权限))

在Scala直接通过属性的类型来分离

在Scala中属性的类型已经封装成    var----private       val----private final         

并且get  set方法也已经封装(封装成了注解,在使用get  set方法的时候需要 先引入注解@BeanProperty----不过该注解的作用域只有一个属性  意思是  一个属性需要设置一个注解)

构造器:

面向对象的语言基本都有构造器(构造方法),如果在类中不写构造方法  默认构造器为空参构造方法

在Scala中也有构造器,与Java不同,

Scala的构造器是在类名上加个()   是主构造器(主构造器无参的时候可以省略()  表示默认是可以无参构造的  类同Java)

有主构造器就一定有从构造器

在主构造器的内部可以定义辅助构造器 定义的格式是固定的,在从构造器的内部第一行代码必须是直接或者间接的调用主构造器

class Person03(name:String){
  var name1:String=name
def this()
  {
    this("唐不唐")
    println("hello world")
  }
}

 主从构造器的加载机制:

在Scala中没有类加载机制,所以在代码直接调用辅助构造器的时候它是不知道类中的内容的, 所以上边要求(从构造器的内部第一行代码必须是直接或者间接的调用主构造器),这就是原因所在,获取类信息(加载一遍),调用完后才会返回从构造器继续执行

根据main方法中你的参数决定你调用那个构造器

从构造器是有先后顺序的,后边的只能调用前面的(所调用的构造器必须在本构造器之前)

从构造器的名称统一为this(根基参数的个数来区分)

主构造器是可以传参的 参数可以当作属性来使用(参数类型如果省略,默认val)

继承:

继承关键字:extends

基础语法:

        class 子类名 extends 父类名 { 类体 }

子类继承父类的属性方法

scala 是单继承

继承的本质:其实与Java是完全不一样的

在创建子类的对象时,Scala会先创建父类的对象让后在外层创建子类对象(同Java)

Scala继承的本质就是继承父类的一个构造器(继承那个构造器(参数个数来区别)就会调用那个)

抽象属性:

就是不写等号,写抽象方法需要把类改成抽象类

抽象属性在使用的时候需要继承它   让后需要重写属性和方法(在Java中是不需要重写属性的,因为Scala底层是对属性进行封装,自带方法)

在重写抽象类中的非抽象方法的时候需要在重写的方法前面加上    override   关键字

子类调用父类的方法的时候使用关键字super  

子类对抽象属性进行实现,父类抽象属性可以用 var 修饰;

子类对非抽象属性重写,父类非抽象属性只支持 val 类型,而不支持 var。
因为 var 修饰的为可变变量,子类继承之后就可以直接使用(可以直接进行修改),没有必要重写    

多态:

父类的引用指向子类的实例

Java中的多态测试

:在父子共有的属性和方法调用的是父类还是子类:

public class Polymorphic {
    public static void main(String[] args) {
        Person person=new Student();
        System.out.println(person.name);
        person.sayhi();
    }
    public static class Person{
     String   name="Person";
     public void sayhi()
     {
         System.out.println("person  sayhi");
     }
    }
public static class Student extends Person{
        String name="Student";
        public void sayhi()
        {
            System.out.println("student sayhi");
        }
}

}

属性是调用父类   方法是调用子类   

在进行多态的时候是先将整个内存先把父类写入里面,再把子类嵌套到外边

引用是使用栈 把地址值是先指向父类的   指向谁就调用谁的属性,但是调用方法是一层一层的调用,是不断的被重写的,所以方法是调用子类

而Scala与Java不同 都是调用的子类的

Scala测试如下:

package chapter04

object Test07_Polymorphic {
  def main(args: Array[String]): Unit = {
       val  per:Person07=new Student07
       per.sayhi();
    println(per.name)
  }
}
class Person07()
{
  val name:String="dsdsd"
def sayhi():Unit={
  println("hi person")
}
}
class Student07 extends Person07{
  override val name: String = "Student"
override def sayhi(): Unit =
  {
    println("Student say hi")
  }
}

 匿名子类:

可以使用匿名子类直接调用抽象类

也可以直接new这个抽象子类

匿名子类是自动使用多态的

多态无法调用子类独有的属性和方法,外部无法使用匿名子类中特有的(它自己的)方法和属性

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

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

相关文章

Spark 之 解析json的复杂和嵌套数据结构

本文主要使用以下几种方法: 1,get_json_object():从一个json 字符串中根据指定的json 路径抽取一个json 对象 2,from_json():从一个json 字符串中按照指定的schema格式抽取出来作为DataFrame的列 3,to_j…

【SpringMVC】第一个springmvc项目

需求: 用户在页面发起一个请求, 请求交给springmvc的控制器对象,并显示请求的处理结果(在结果页面显示一个欢迎语句)。 实现步骤: 新建web maven工程 加入依赖 spring-webmvc依赖,间接把spri…

FLINK 在蚂蚁大规模金融场景的平台建设

摘要:本文整理自蚂蚁集团高级技术专家、蚂蚁集团流计算平台负责人李志刚,在 Flink Forward Asia 2022 平台建设专场的分享。本篇内容主要分为四个部分: 主要挑战架构方案核心技术介绍未来规划点击查看直播回放和演讲 PPT 一、主要挑战 1.1 金…

【 Spring MVC 核心功能(三) - 输出数据】

文章目录引言一、返回静态页面二、返回非静态页面的数据三、返回 JSON 对象四、请求转发(forward)和请求重定向(redirect)五、拓展:IDEA 热部署(热加载)3.1 添加 SpringBoot DevTools 框架3.2 开起 IDEA 的自动编译3.3 开起运行中的热部署3.4 使用 debug 启动项目引…

【机器学习】SoftMax多分类---学习笔记

SoftMax---学习笔记softMax分类函数定义:softmax分类损失函数softMax分类函数 首先给一个图,这个图比较清晰地告诉大家softmax是怎么计算的。 (图片来自网络) 定义: 给定以歌nknknk矩阵W(w1,w2,...,wk)W(w_1,w_2,...,w_k)W(w1​,w2​,...,w…

Arcgis小技巧【12】——ArcGIS标注的各种用法和示例

标注是将描述性文本放置在地图中的要素上或要素旁的过程。 本文整理了ArcGIS中的各种标注方法、可能遇到的问题和细节,内容比较杂,想到哪写到哪。 一、正常标注某一字段值的内容 右键点击【属性】,在【标注】选项卡下勾选【标注此图层中的的…

Python 小型项目大全 1~5

一、百吉饼 原文:http://inventwithpython.com/bigbookpython/project1.html 在百吉饼这种演绎逻辑游戏中,你必须根据线索猜出一个秘密的三位数。该游戏提供以下提示之一来响应您的猜测:"Pico",当您的猜测在错误的位置有…

【SpringMVC】7—文件上传

⭐⭐⭐⭐⭐⭐ Github主页👉https://github.com/A-BigTree 笔记链接👉https://github.com/A-BigTree/Code_Learning ⭐⭐⭐⭐⭐⭐ 如果可以,麻烦各位看官顺手点个star~😊 如果文章对你有所帮助,可以点赞👍…

布隆过滤器讲解及基于Guava BloomFilter案例

目录 1、布隆过滤器是什么 2、主要作用 3、存储过程 4、查询过程 5、布隆过滤器的删除操作 6、优点 7、缺点 8、测试误判案例 8.1、引入Guava依赖 8.2、编写测试代码 8.3、测试 8.4、BloomFilter实现原理 9、总结 推荐博主视频,讲的很棒:布隆…

华为运动健康服务Health Kit 6.10.0版本新增功能速览!

华为运动健康服务(HUAWEI Health Kit)6.10.0 版本新增的能力有哪些? 阅读本文寻找答案,一起加入运动健康服务生态大家庭! 一、 支持三方应用查询用户测量的连续血糖数据 符合申请Health Kit服务中开发者申请资质要求…

大数据项目之电商数据仓库系统回顾

文章目录一、实训课题二、实训目的三、操作环境四、 实训过程(实训内容及主要模块)五、实训中用到的课程知识点六、实训中遇到的问题及解决方法七、课程实训体会与心得八、程序清单一、实训课题 大数据项目之电商数据仓库系统 二、实训目的 完成一个电…

7.基于概率距离快速削减法的风光场景生成与削减方法

matlab代码:基于概率距离快速削减法的风光场景生成与削减方法 采用蒙特卡洛进行场景生成,并再次进行场景缩减。 clear;clc; %风电出力预测均值E W[5.8,6.7,5.8,5.1,6.3,5,6.2,6,4.1,6,7,6.8,6.5,6.9,5,5.6,6,5.8,6.2,4.7,3.3,4.4,5.6,5]; %取标准差为风…

在unreal中的基于波叠加的波浪水面材质原理和制作

关于水的渲染模型 如何渲染出真实的水体和模拟,是图形学,游戏开发乃至仿真领域很有意思的一件事 记得小时候玩《Command & Conquer: Red Alert 3》,被当时的水面效果深深震撼,作为一款2008年出的游戏,现在想起它…

算法:将一个数组旋转k步

题目 输入一个数组如 [1,2,3,4,5,6,7],输出旋转 k 步后的数组。 旋转 1 步:就是把尾部的 7 放在数组头部前面,也就是 [7,1,2,3,4,5,6]旋转 2 步:就是把尾部的 6 放在数组头部前面,也就是 [6,7,1,2,3,4,5]… 思路 思…

C++继承(上)

一、继承的概念及定义1.继承的概念2.继承定义2.1定义格式2.2继承关系和访问限定符2.3继承基类成员访问方式的变化二、基类和派生类对象赋值转换三、继承中的作用域一、继承的概念及定义 1.继承的概念 继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允…

聊聊如何运用JAVA注解处理器(APT)

什么是APT APT(Annotation Processing Tool)它是Java编译期注解处理器,它可以让开发人员在编译期对注解进行处理,通过APT可以获取到注解和被注解对象的相关信息,并根据这些信息在编译期按我们的需求生成java代码模板或…

【SQL Server】数据库开发指南(一)数据库设计

文章目录一、数据库设计的必要性二、什么是数据库设计三、数据库设计的重要性五、数据模型5.1 实体-关系(E-R)数据模型5.2 实体(Entity)5.3 属性(Attribute)5.5 关系(Relationship)六…

和ChatGPT-4聊完后,我觉得一切可能已经来不及了

了然无味,晴空万里!和ChatGPT-4开始了一场坦诚的沟通,它全程都表现出高情商,以及不断尽量安抚我的情绪,而这,恰恰令我脊背发凉。 部分文字截取 ZM:我能不能理解每次对话就是一次你的“生命” G&…

LeetCode刷题6:二叉树篇之第 1 节

提示1:本篇先带大家了解二叉树的基础理论,后给出4道基础题目,不难,冲啊~ 算法刷题系列 LeetCode刷题1:数组篇LeetCode刷题2:链表篇LeetCode刷题3:哈希篇LeetCode刷题4:字符串篇Lee…

1678_计算机架构黄金时代_文章阅读

全部学习汇总: GreyZhang/g_risc_v: Learning notes about RISC V. (github.com) 看了一份几年前的文章,觉得还是挺有收获的,因此做一个简单的整理。 对于架构有很大影响的主要考虑四点:专用硬件的实现、高安全性的要求、开放指令…
最新文章