zoukankan      html  css  js  c++  java
  • 简单理解 伴生类 伴生对象

    scala里面没有 static 关键字。那么如果想实现static的效果要怎么做呢?  ==》 可以使用伴生对象

    在同一个scala文件中定义一个类,同时定义一个同名的object,那么它们就是伴生类和伴生对象的关系,可以互相直接访问私有的field,具体细节可以自己看下底层。伴生对象通常会使用apply函数定义伴生类的构造方法。 这样在创建伴生类的对象时就可以省略 new 关键字。

    //定义一个猫咪类,带两个参数:猫咪的名字和年龄。  
    class Cat(val name:String,val age:Int) {
    //在类中定义一个方法,跟猫咪打招呼。
      def sayHello = println(s"hi,${name},I guess you are ${age} years old,and you have ${Cat.clawNum} claws.")
    //  def sayHello = println(s"hi,${name},I guess you are ${age} years old.")
    }
    
    //定义一个猫咪的object,名字和猫咪类的类名必须完全一致。
    object Cat{
    //object的私有field,描述了爪子的数量。
      private val clawNum = 4
    //  val clawNum = 4
    //  private[this] val clawNum = 4  //伴生类也不能够直接访问
    //  def sayHello = println(s"animals usually have ${clawNum} clows.")
      def apply(name: String, age: Int): Cat = new Cat(name, age)
      def apply(name: String): Cat = new Cat(name, 0)
    //Cat.sayHi的方式调用
      def sayHi = println("a cat says hi~.")
    }
    object里面的属性和方法就可以看作是带有static标识的。所以object中定义的方法 sayHi 不用使用类的实例调用,只能用静态的方式调用
    测试代码如下:
    scala> val cat = Cat("mow",2)
    cat: Cat = Cat@5fd9b663
    
    scala> cat.sayHello
    hi,mow,I guess you are 2 years old,and you have 4 claws.
    
    scala> cat.sayHi
    <console>:17: error: value sayHi is not a member of Cat
    cat.sayHi
    ^
    
    scala> Cat.sayHi
    a cat says hi~.

    上面的代码如果类比成 java ,是下面这种形式和效果:

    public class Cat {
        private static int clawNum = 4;
        private String name;
        private int age;
    
        public Cat(String name,int age){
            this.name = name;
            this.age = age;
        }
    
        public  void sayHello() {
            System.out.println("hi," + name + ",I guess you are " + age + " years old,and you have " + clawNum + " claws.");
        }
    
        public static void sayHi() {
            System.out.println("a cat says hi~.");
        }
    
        public static void main(String[] args) {
            Cat cat = new Cat("mimi",1);
            cat.sayHello();
            Cat.sayHi();
        }
    }

    还要注意的是,如果object里面的属性被修饰成 private[this],那么伴生类也将无法直接访问此属性。private[this] 是scala中最高级别的私有属性,只有当前object内部可以访问。

    scala 定义访问属性时候 有 private[T] 变量。这句话的意思是

    1. 变量是 private性质的。

    2. 变量 在T package空间内可以被访问。

    关注公众号 海量干货等你
  • 相关阅读:
    学习工作记录七
    NoSuchBeanDefinitionException:No qualifying bean of type
    学习工作记录六
    密码学考试要点
    Failed to execute goal org.springframework.boot
    学习工作记录五
    学习工作记录四
    关于打包ipa文件以及苹果证书的若干问题
    学习工作记录三
    PAT乙级(Basic Level)练习题-NowCoder数列总结
  • 原文地址:https://www.cnblogs.com/sowhat1412/p/12734172.html
Copyright © 2011-2022 走看看