Scal——类与对象

Posted littlepage

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Scal——类与对象相关的知识,希望对你有一定的参考价值。

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(" "))
  

以上是关于Scal——类与对象的主要内容,如果未能解决你的问题,请参考以下文章

python 面向对象专题:类的空间问题类与对象之间的关系类与类之间的关系

类与对象

Java-类与对象-多态

Python初识类与对象

Python初识类与对象

OOP封装:类与对象