当前位置:

首页 > 编程开发 > Java和Scala的面向对象用法

Java和Scala的面向对象用法

Scala包:基础语法:package包名.类名Scala包的三大作用:区分相同名字的类当类很多时,可以很好的管理类控制访问范围包名的命名规范:一般是小写字母+小圆点com.公司名.项目名.业务模块名写包的好处:在maven中可以将自己写的包通过maven导入到项目中在Scala中独有的包的写法和文件夹不对应可以独立存在下图是我在类下边建的包,和正常的包一样使用包是可以嵌套的内层调用外层不需要导包atguigu包在techer下外层调用内层对象需要导包如下代码:packagechapter04object

本文目录

    Scala包:

    基础语法:

    package 包名.类名

    Scala包的三大作用:

    区分相同名字的类

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

    控制访问范围

    包名的命名规范:

    一般是小写字母+小圆点

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

    写包的好处:

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

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

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

    Java和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");
            }
    }
     
    }

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

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

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

    Java和Scala的面向对象用法

    而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")
      }
    }

    Java和Scala的面向对象用法

    匿名子类:

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

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

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

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

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 Java
    相关文章 更多
    Java单元测试入门:使用JUnit 5编写第一个测试用例
    Java单元测试入门:使用JUnit 5编写第一个测试用例

    面向初学者的JUnit 5实用入门指南。从测试概念、Maven依赖配置,到手把手编写首个单元测试用例及断言验证,助你掌握Java单元测试的核心流程。

    Java变量未初始化报错解析:局部变量与成员变量默认值差异
    Java变量未初始化报错解析:局部变量与成员变量默认值差异

    深入解析Java中局部变量未初始化编译报错与成员变量自动赋予默认值的机制差异,涵盖JVM内存分配、编译期确定性赋值检查与实际排查修复方案。

    Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat
    Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat

    详细讲解在Java中获取当前系统时间并进行格式化输出的两种核心方案:基于Java 8全新日期时间API的DateTimeFormatter与传统遗留的SimpleDateFormat,包含完整代码示例、线程安全机制对比及生产选型建议。

    Java中final与static final常量的定义及初始化规则
    Java中final与static final常量的定义及初始化规则

    深入解析Java中final变量与static final常量的定义、内存语义、初始化时机及合法赋值路径,涵盖编译期常量优化与实战避坑指南。

    Java抽象方法与接口方法的区别及选型建议
    Java抽象方法与接口方法的区别及选型建议

    深入对比Java中抽象类抽象方法与接口方法的语法演进、设计意图及运行期差异,并提供清晰的架构选型决策流程与实战范例。

    Java实现HTTP请求与JSON解析的完整代码示例
    Java实现HTTP请求与JSON解析的完整代码示例

    本文提供Java标准库HttpClient发起HTTP GET/POST请求并结合Jackson进行JSON数据反序列化与序列化的完整代码示例与工程实践指南。

    Java递归出现StackOverflowError的原因分析及栈空间优化方案
    Java递归出现StackOverflowError的原因分析及栈空间优化方案

    详细分析Java递归调用出现StackOverflowError的原因,结合代码说明线程栈、栈帧和递归深度之间的关系,并介绍终止条件排查、迭代改写、减少栈帧开销以及通过-Xss调整JVM栈空间的方法。

    Java空指针异常(NPE)的代码排查与修复实例
    Java空指针异常(NPE)的代码排查与修复实例

    针对Java中常见的NullPointerException(NPE),本文从堆栈日志定位、典型代码触发场景、具体修复代码对比到防御体系进行系统讲解,提供实用且易上手的排查与修复方案。

    selenium上传文件教程本地文件路径设置方法
    selenium上传文件教程本地文件路径设置方法

    深入解析Selenium处理文件上传的技术细节,涵盖标准HTML控件的路径直接注入法与非标准控件的系统级模拟方案,提供Windows与Linux环境下的路径设置最佳实践及常见异常排查。

    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景
    大数据开发语言选型:Java对比Scala与Python的优缺点及适用场景

    针对大数据工程场景,系统对比Java、Scala与Python在执行性能、生态结合、开发效率和维护成本上的核心差异,给出清晰的架构选型依据与落地方案。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。