• Scala(三)——类与对象


    Scala快速入门(三)——类与对象

    一、类

    这边类的模板如下,和Java很像

    object a {
      def main(args: Array[String]): Unit = {
        val person=new Person
        println(person.name+" "+person.age)
      }
    }
    class Person{
      var name:String = "steve yu"
      var age = 10
    }
    

    遇到不确定的成员属性,最好不要赋值null,可赋值一个下划线,需要标明类型。下划线Int型代表0,Double代表0.0,boolean代表false,对象代表null,这样解决所有问题。

    改进后:

    class Person{
      var name:String = _
      var age:Int = _
    }
    

    二、创建对象和方法

    1.对象的创建

    我们可以加括号,也可以不加
    val p=new Person
    val p=new Person()
    这两种都可以,用var还是val,官方推荐使用val
    

    2.方法

    和函数的创建一模一样

    3.构造器

      def this(name:String,age:Int){
        this
        this.name=name
        this.age=age
      }
    

    4.主构造器,3上的构造器并非主构造器,class后面的Person是主构造器,直接加括号,跟参数,即可写一个构造函数

    class Person(){
      var name:String = _
      var age:Int = _
      def this(name:String,age:Int){
        this
        this.name=name
        this.age=age
      }
    }
    

    5.构造器的私有

    • 主构造器的私有化
    class Person private(){}
    
    • 其他构造器的私有化
      private def this(name:String,age:Int){
        this
        this.name=name
        this.age=age
      }
    
    • 构造器的高级运用(inname使用val修饰,那么inname就是一个只读变量)
    class Person (val inname:String){
    	var name=inname
    }
    

    三、包

    1.相同名字class进行分包处理

    object Test {
      def main(args: Array[String]): Unit = {
        val tiger1=new com.littlepage.scalapackage.steve.Tiger
        val tiger2=new com.littlepage.scalapackage.yu.Tiger
      }
    }
    
    

    2.scala包可以任意改变package,并且,在package改变后,能够删除之前编译的内容并且重新编译

    3.包的引用,首先引用本类,如果使用一样名字的类,需要把名字写全

    例子:

    val a=new com.littlepage.Tiger
    
    

    4.包对象

    为什么需要包对象。在包中不定义类,直接写方法,就会报错,所以,我们需要一个包对象技术

    package object people{
    	//定义一个包对象
    }
    
    

    5.使用包对象进行调用函数

    object Tiger {
      def main(args: Array[String]): Unit = {
        A.print_a
      }
    }
    
    package object A{
      def print_a: Unit ={
        println("a")
      }
    }
    
    

    如果你的这个伴生类在A的package里面,可以直接进行调用

    package A{
      object Tiger {
        def main(args: Array[String]): Unit = {
          print_a
        }
      }
    }
    
    

    我们反编译这段代码,发现这个package实际是一个final的class,中间有个静态的MODULE$对象

    包对象注意点:
    1.每个包只有一个包对象
    2.包对象的名称需要和包名保持一致
    
    

    四、访问修饰符

    1.属性为默认时,底层看是private的,使用效果是public的

    2.方法为默认,默认是public的

    3.private为私有权限,只在类内部和伴生对象中可用

    4.protected为受保护的,保护权限只能供子类访问,同包无法访问

    5.scala中没有public关键字,不能用public 进行修饰属性和方法

    注意点:
    scala中,我们import一个包中所有的内容应该使用下划线,而不是使用*
    
    

    作业布置

    1.编写一个Time类,加入只读属性hours和minutes,检查某一个时刻是否早于另外一个时刻的方法,before(other:Time):Boolean。Time对象应该以new Time(hrs,min)的方式构建

    class Time(val hrs:Int,val min:Int) {
      val hours:Int=hrs
      val minutes:Int=min
    
      def before(other:Time):Boolean={
        if(hours!=other.hours)  hours<other.hours
        else minutes<other.minutes
      }
    }
    
    

    2.编写一段程序,将Java中的HashMap中的所有元素拷贝到Scala的HashMap,用引入语句重命名这两个类。

    object Test {
      import java.util.{HashMap=>JavaHashMap}
      import collection.mutable.{HashMap=>ScalaHashMap}
      def main(args: Array[String]): Unit = {
        val jm=new JavaHashMap[Int,String]
        jm.put(1,"小舞")
        jm.put(2,"团团")
        jm.put(2,"怪兽")
        jm.put(4,"S.X")
        val sm=new ScalaHashMap[Int,String]()
        for(k<-jm.keySet().toArray()){
          sm.put(k.asInstanceOf[Int],jm.get(k))
        }
        println(sm.mkString(" "))
      }
    }
    
    
  • 相关阅读:
    maven更新远程仓库速度太慢解决方法
    maven安装配置
    myeclipse中配置maven
    java数组的常用函数
    在数组中插入元素
    MySQL的表使用
    MySQL的数据库与表格创建
    节点的添加与删除
    html常用的综合体
    标签的类添加与删除
  • 原文地址:https://www.cnblogs.com/littlepage/p/11590240.html
Copyright © 2020-2023  润新知