• Scala基础之类(伴生对象,半生类)


    类基本语法:Scala中一个源文件中可以声明多个公共类

    // 声明类:访问权限 class 类名 { 类主体内容 } 
    class User {
        // 类的主体内容
    }
    // 对象:new 类名(参数列表)
    new User()  

    类的属性 :在编译时,编译器会将变量编译为类的(私有的)属性,同时提供了属性对应的set,get方法

    class User {

        var name : String = _ // 类属性其实就是类变量

        var age : Int = _ // 下划线表示类的属性默认初始化

    }

    // 给类的属性赋值,等同于调用对象属性的set方法

      //user.name = "AsianHarden"

    // 访问类的属性时,等同于调用对象属性的get方法

      //println(user.name)

    //scala中给属性提供的set,get方法不遵循bean规范

      //@BeanProperty var email : String = _

    访问权限:java&scala对比

    java :
         1. private    => 本类
         2. (default)  => 本类,本包
         3  protected  => 本类,本包,子类
         4. public     => 任意
    scala :
         1. private       => 同类
         2. private[包名]  => 同包,包私有
         3. protected     => 受保护的, 同类,子类,没有同包
         4. (default) => 什么都不写就是公共的。没有public关键字     
    
     
            private val name1:String = "AsianHarden"
            private[package_name] val name2:String = "AsianHarden"
            protected val name3:String = "AsianHarden"
            val name4:String = "AsianHarden" 

    访问权限的疑问

    public class Test{
        public static void main(String[] args) throws Exception {
    
            // 访问权限 ,调用者和方法的提供者之间的关系
            // 方法的提供者 =>AA
            // 方法的调用者 =>Test
    
            // 点不是调用的意思,点的含义就是"的",从属关系
            AA aa = new AA();
            aa.clone();
    
        }
    }
    class AA {
    //1    @Override
    //  2  protected Object clone() throws CloneNotSupportedException {
    //    3    return super.clone();
        }
    }
    //123注释掉后,aa.clone()报错,Test的object没用权限访问到AA的object,Test,AA的Object是彼此独立的 

     类的对象

    val | var 对象名 [:类型]  = new 类型()
    var user : User = new User() 

    类的构造方法

    • 1.主动构造函数
    • 2.辅助构造函数
    class User() { // 主构造函数
        var username : String = _ 
        def this( name:String ) { // 辅助构造函数,使用this关键字声明
            this() // 辅助构造函数应该直接或间接调用主构造函数
            username = name
    }
    def this( name:String, password:String ) {
        this(name) // 构造器调用其他另外的构造器,要求被调用构造器必须提前声明
    }
    }
    
    1)辅助构造方法在执行之前,应该首先调用主构造方法完成类的初始化
    2)辅助构造方法可以重载的,并且可以互相调用,但是调用的辅助构造方法应该提前声明(位置关系)
    • 参数声明为val & var 区别
    参数声明为val
    如果构造函数参数声明为val,Scala只为它生成一个getter方法。
    
    参数声明为var
    如果构造函数参数声明为var,Scala将生成访问器和mutator方法。
    
    //定义一个类,参数不可变
    class Book( val title:String)
    //调用只能调用getter 方法 无法调用setter方法
    object Main {
      def main(args: Array[String]) {
        class Book( val title:String)
        val book = new Book("Scala")
        println(book)
        println(book.title )
        //book.title = "new title"  //Error
      }
    }
    //定义一个类,参数可变
    class Book( var title:String)
    //Scala将生成访问器和mutator方法。
    object Main {
      def main(args: Array[String]) {
        class Book( var title:String)
        val book = new Book("Beginning Scala")
        book.title = "new title"
        println(book.title )
      }
    } 
    • 构造方法私有化
    构造方法私有化: 在参数列表前增加private关键字
        class Person private () {
    
        }

    scala类java静态语法,私有化实现

    1)scala中没有静态语法,但是可以直接使用java中的静态操作
    2)scala采用了一种特殊的处理方式来代替静态语法 :object
    3)object关键字可以用于创建对象,对象的名字就是声明的名字,object关键字声明的类和对象有关系的。
    这个对象等同于伴随着这个类创建时所产生的,所以将这个对象称之为:伴生对象
    这个类称之为伴生类
    伴生对象就是一个对象,可以访问伴生类中的所有东西,包括私有的。
    伴生对象其实就是马丁模拟静态语法所产生的。
    一般写代码时,将静态语法操作的代码写在伴生对象中,将成员方法或属性写在伴生类中
    
    //构造方法私有化导致new Person()报错,所以需要构建一个对象来创建Person类
    //半生类  
      class Person private (){
        println("class Person")
      }
    // 伴生对象,与半生类同名 类java的静态方法调用使用
      object Person{
        def getInstance(): Person ={
          new Person()
        }
      }
    }
    
        Person.getInstance()
    //  val person = new Person()  报错
    TODO scala中伴生对象就是单例的
    伴生对象只需要声明即可,无需构建,所以不需要构造参数列表
    单例模式存在一个问题:创建的对象不会被回收,需要显示地回收(设置为null)
        
     // 如果伴生对象中构建对象的方法名成为apply,编译器可以自动识别的,所以这个方法名可以省略的
    val test1: Test = Test.apply()
    val test1 = new Test() // 调用类的构造方法
    val test2 = Test()     // 调用的是伴生对象的apply方法
    val test3 = Test       // 伴生对象本体
    
        class Test() {
            println("ttttt")
        }
        object Test {
            def apply() = {
                println("apply") //打印apply。证明走的是伴生对象的apply()
                //new Test()
            }
        }


    本文为原创文章,转载请标明出处
  • 相关阅读:
    C#之线程基础
    C#之Stream和IO
    一图搞懂各种开源协议(转载)
    Qt杂谈4.浅谈事件传递的那些事
    Qt小技巧14.Qt5.12.x编译Mysql插件驱动
    Qt定制开发3.飞机飞行状态综合显示控件
    Qt实战14.告警信息滚动轮播控件
    Qt小技巧13.如何为程序设置环境变量?
    local variable 'xxx' referenced before assignment
    python 中字典(dict)合并:两个双层嵌套字典的合并
  • 原文地址:https://www.cnblogs.com/harden13/p/14797197.html
Copyright © 2020-2023  润新知