Scala语言扫盲第四篇:类与对象

来源:互联网 发布:怎样看出淘宝是包邮的 编辑:程序博客网 时间:2024/06/03 18:19

Scala语言是面向对象和函数式编程的结合体。面向对象重要的概念就是类(class)与对象(object),下面就来谈谈类与对象

类与对象:

咱们就直接看代码与相关注释吧

package com.frank.scala/**  * 说明:面向对象实战  * 1,面向对象的特点:抽象、多态、封装、继承  * 2,抽象:就是把现实世界中的某一类东西,提取出来,用程序代码表示,抽象出来一般叫做类或者接口  * 3,多态:指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。  * 4,封装:封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面或接口  * 5,继承:对象的一个新类可以从现有的类中派生,这个过程称为类继承  * 6,class与object的关系:  *    6.1 class 是面向对象编程的抽象出来的,  *    6.2 object是对象,这个对象属于全局的静态对象,这个类似于Java中的静态变量  *    6.3 同一个文件中同名的class与object的关系是:class是object的伴生类,而object则是class的伴生对象。  *        main方法要定义在object中。在class 中可以直接调用object中的方法,调用的方式是:object名称.方法名。  *        也可以说object是class的静态内容,在class 没有进行实例化的时候直接可以去调用object中的内容  * 7,apply方法:在object中可以通过apply控制对象的生成,也是对象的工厂方法;  *              在class中可以通过apply是类当做函数使用,而函数本质上是类的实例。  *              例如:val arr1 = Array.apply("java","scala","spark") 这个是直接调用apply  *                    但是也可以这样:val arr1 = Array("java","scala","spark") 这个是间接调用了apply方法  * Created by sunzhongwei on 2016/10/22.  * 微信号:F451209123  * QQ:843055018  */class ObjectOrientedTest {    def testPrint = print("这个是class的测试方法")    def testA = ObjectOrientedTest.testObject    def apply() = println("I am class ApplyTest")}object ObjectOrientedTest{  val ooName = "OO"  def main(args: Array[String]): Unit = {    val dog = new Dog("jack",30)    dog.printName()    dog.printWeight //此处实例继承了父类中的方法    val animal = new Animal("主构造",30) //此处直接调用了主构造器进行初始化    animal.printWeight    val animal_b = new Animal("A",30,"femal") //此处调用了从构造器    animal_b.printGender    val t = new ObjectOrientedTest()    t.testA    t.testPrint    /**      * 通过Apply的方式      */    val t2 = ObjectOrientedTest()    t2.testPrint    t2.testA    t2() //此处直接调用class中的appy方法  }  def testObject = println("这个是object的测试方法")  def apply() = {    println("I am object ApplyTest")    new ObjectOrientedTest  }}/**  * 说明:  * 1,我们将小鸟、狗、鸡等抽象出动物Animal这个类  * 2,Animal这个类访问权限默认是public的  * 3,Animal(name:String) 这个是Animal定义了全局的变量,这个所有类的主构造器。  * 4,构造器:在Scala中构造器有两种:一个主构造器,另外一种是从构造器。  *            在类名后面的(...)以及类主体中除了定义的方法以及this从构造器,其他都属于主构造器  * @param name  */class Animal(name:String,weight:Int){  var gender : String = "male"  //打印出名称  def printName() = println(name)  //打印出体重  def printWeight = println("我是"+name+",我的体重是:"+weight+"KG")  def printGender = println("我是"+name+",我的体重是:"+weight+"KG,我的性别是:"+gender)  /**    * 此处通过this定义了从构造器,从构造器最终要调用主构造器    * @param name    * @param weight    * @param gender    */  def this(name:String,weight:Int,gender:String){    this(name,weight) //此处调用了主构造器    this.gender = gender  }}/**  * 继承:通过extends关键词来实现父类相关属性方法的继承  * @param name  * @param weight  */class Dog(name:String,weight:Int) extends Animal(name,weight){  /**    * 通过使用关键词override来复写父类的printName方法    */  override def printName()=println("你好!我是一只小狗,我的名字叫:"+name)  def printName(name:String) = println(name)  def printName(name:String,age:Int) = println(name)}

从上面的代码中涉及到的内容如下:

  1. 面向对象的概念与特点
  2. 在Scala中class与object的关系:伴生类与伴生对象
  3. 类的继承、方法重载、方法复写(override)
  4. class中的主从构造器
  5. appy方法

反编译Animal的class文件

我来看一下Scala反编译的代码:
这里写图片描述
从代码中可以看出在类名后括号声明的变量默认是private final类型,另外在Animal类中定义的私有变量gender,通过这种方式定义的私有变量,编译时会自动生成

public String gender() { return this.gender; } public void gender_$eq(String x$1) { this.gender = x$1; } 

这2个方法

0 0
原创粉丝点击