大数据笔记(二十四)——Scala面向对象编程实例

===================== Scala语言的面向对象编程 ========================

一、面向对象的基本概念:把数据和操作数据的方法放到一起,作为一个整体(类 class)
面向对象的特征:
(1)封装
(2)继承
(3)多态

二、定义类: class,没有类的修饰符: public、protected、private

class Student1 {
  //定义属性
  private var stuName:String = "Tom"
  private var stuAge:Int = 20

  //定义方法(函数)
  def getStuName():String = stuName
  def setStuName(newName:String) = this.stuName = newName

  def getStuAge():Int = stuAge
  def setStuAge(newAge:Int) = this.stuAge = newAge
}

//开发一个测试程序,创建学生对象
// Java: public static void main()******
//概念:objec对象可以跟类名不一样,如果一样,这个object对象就是该类的伴生对象
object Student1{
  //都是静态
  def main(args: Array[String]): Unit = {
    //创建学生对象
    var s1 = new Student1

    //第一次输出
    println(s1.getStuName()+"\t" + s1.getStuAge())

    //调用set方法
    s1.setStuName("Mary")
    s1.setStuAge(25)

    //第二次输出
    println(s1.getStuName()+"\t" + s1.getStuAge())

    //第三次输出: 直接访问类的私有成员
    //问题:为什么可以直接访问类的私有成员??? ----> 讨论:属性的set和get方法
    println(s1.stuName + "\t" + s1.stuAge)

  }
}

运行:

三、属性的get和set方法

/*
属性的get和set方法
1、当定义属性的时候,如果是private,Scala会自动生成对应的set和get方法
     private var stuName:String = "Tom"
     (1) get方法:stuName
     (2) set方法: stuName_

2、如何只有get方法,没有set方法? ---> 将属性定义为: 常量 val
      private val money:Int = 1000

3、不希望生成get和set方法: private[this]
   该属性只属于该对象私有
 */

class Student2 {
  //定义属性
  private var stuName:String = "Tom"

  //只有get方法
  private val money:Int = 1000
}

object Student2{
  def main(args: Array[String]): Unit = {
    var s2 = new Student2

    println(s2.stuName)

    //修改money值 ===> error 错误
    //s2.money = 2000
  }
}

四、嵌套类(内部类): 类:Student 包含:课程Course

import scala.collection.mutable.ArrayBuffer

class Student3 {

  //定义一个内部类(嵌套类): 学生选修的课程
  //通过主构造器
  class Course(val courseName:String,val credit:Int){
    //其他的方法
  }

  //属性
  private var stuName:String = "Tom"
  private var stuAge:Int = 20

  //定义一个数组来保存该学生选修的课程
  private var courseList = new ArrayBuffer[Course]()

  //定义方法:往学生信息中添加新的课程
  def addNewCourse(cname:String,credit:Int): Unit ={
    //创建一门课程
    var c = new Course(cname,credit)

    //加入list
    courseList += c
  }
}

object Student3{
  def main(args: Array[String]): Unit = {
    //创建学生
    var s3 = new Student3

    //给学生添加课程
    s3.addNewCourse("Chinese",3)
    s3.addNewCourse("English",3)
    s3.addNewCourse("Math",3)

    //输出
    println(s3.stuName+"\t"+s3.stuAge)
    for(s <- s3.courseList) println(s.courseName + "\t" + s.credit)
  }
}

运行:

五、构造器:(1)主构造器 (2)辅助构造器

package main.scala

/**
  * Created by YOGA on 2018/2/3.
  * (1)主构造器:和类的申明在一起,只能有一个主构造器
  * (2)辅助构造器:多个,通过关键字this
  */

class Student4(val stuName:String,val stuAge:Int) {
   //定义一个辅助构造器
  def this(age:Int){
     //调用主构造器
     this("No Name",age)
   }
}

object Student4{
  def main(args: Array[String]) {
    //使用主构造器创建学生对象
    val s4 = new Student4("Tom",24)
    println(s4.stuName+ "\t" + s4.stuAge)
    //使用辅助构造器创建学生对象
    var s5 = new Student4(25)
    println(s5.stuName+"\t"+s5.stuAge)
  }
}

运行:

六、Object对象:相当于static关键字

1、单例模式:一个类只有一个对象

举例:生成信用卡的卡号

package main.scala

/**
  * Created by YOGA on 2018/2/3.
  */
object CreditCard {
  //变量:保存信用卡的卡号
  //该属性只属于该对象
  private[this] var creditCardNumber:Long = 0

  //产生卡号
  def generateNewCCNumber() = {
    creditCardNumber += 1
    creditCardNumber
  }

  //测试
  def main(args: Array[String]) {
    //得到新的卡号:通过类名.方法
    println(CreditCard.generateNewCCNumber())
    println(CreditCard.generateNewCCNumber())
    println(CreditCard.generateNewCCNumber())
    println(CreditCard.generateNewCCNumber())
  }
}

运行:

2、应用程序对象: App -----> 可以省略main方法

package main.scala

object MainAppObject extends App {
  //创建一个main方法
//  def main(args: Array[String]): Unit = {
//    println("Hello World")
//  }

  println("Hello World")
}

七、类的apply方法:省略new关键字
举例:val s1 = new Student
val s2 = Student ---> 必须要定义Student类的apply方法

package main.scala

/**
  * 主构造器
  */
class Student5(val stuName:String){

}
object Student5 {
  //定义类的Apply方法 位置:定义在类的伴生对象中
  def apply(stuName:String) ={
    println("调用到了apply方法")
    //调用主构造器
    new Student5(stuName)
  }
  def main(args: Array[String]) {
    //创建学生对象
    var s1 = new Student5("Tom")
    println(s1.stuName)

    //省略new 关键字
    var s2 = Student5("Mary")
    println(s2.stuName)
  }
}

运行:

八、继承 extends

子类与父类同名时,需要加override

package main.scala
//继承
/*
* 1、基本的继承
* 2.复写父类方法
* 2.使用匿名子类
* */
//定义父类
class Person(val name:String,val age:Int){
  //方法(函数)
  def sayHello():String = "Hello " + name + " and the age is "+age;
}
//定义子类
class Employee(override val name:String,override val age:Int,salary:Int) extends Person(name,age) {
  //重写父类中的sayhello
  override def sayHello():String = "子类中的sayHello方法"
}
object Demo1 {
  def main(args: Array[String]): Unit = {
    //创建一个Person对象
    var p1 = new Person("Tom",20)
    println(p1.sayHello())

    //创建一个子类
    var p2:Person = new Employee("Mike",25,1000)
    println(p2.sayHello())

    //创建一个匿名子类,从Person继承
    var p3:Person = new Person("jerry",26){
      //在匿名子类中重写父类的方法
      override def sayHello():String = "匿名子类中的sayHello方法"
    }
    println(p3.sayHello())

  }
}

运行:

九、抽象类:方法只声明,不实现

package main.scala
//抽象类
//父类: 抽象 交通工具
abstract class Vehicle{
  //定义一个抽象方法
  def checkType():String
}

//子类
class Car extends Vehicle{
  def checkType():String = {"I am a car"}
}

class Bike extends Vehicle{
  def checkType():String = {"I am a bike"}
}
object Demo2 {
  def main(args: Array[String]):Unit =  {
    var v1:Vehicle = new Car
    var v2:Vehicle = new Bike

    println(v1.checkType())
    println(v2.checkType())
  }
}

运行:

十、抽象字段:没有初始值的字段

package main.scala.p1

//父类:抽象
abstract class Person{
  //就是一个抽象字段
  var id:Int
  var name:String
}

//一种做法
abstract class Employee1 extends  Person{
  //var id:Int = 1
  var name:String = "No Name"
}

//另一种做法: 定义一个主构造器,在主构造器中,提供抽象字段
class Employee2(var id:Int) extends  Person{

  //只提供name
  var name:String = "No Name"
}

class Demo3 {

}

十一、特质trait:就是抽象类

与抽象类的最大区别:支持多重继承 :extends... with

package main.scala.p2
//特质:trait
//有点像接口、也有点像抽象类 支持多重继承
trait Human{
  //抽象字段
  var id:Int
  var name:String

  //方法:可以是抽象,也可以不是
  def sayHello():String = "Hello" + name
}

trait Action{
  //定义一个抽象方法
  def getActionName():String
}

//定义一个子类,从上面两个继承
//关键字: extends... with
class Student6(var id:Int,var name:String) extends Human with Action{
  //实现Action中的getActionName
  def getActionName():String = "Action is running"
}
object Demo4 {
  def main(args: Array[String]) {
    var s1 = new Student6(1,"Tom")
    println(s1.sayHello())
    println(s1.getActionName())
  }
}

运行:

十二、包和包对象
举例:package ****{
class ****
def 函数
val 常量
等等
}

包可以被引用在程序的任何地方

可以把工具函数或者常量添加到包对象里,在其他的类里导入这个包对象就可以引用。

包对象:常量,变量,特质,方法,类,对象

原文地址:https://www.cnblogs.com/lingluo2017/p/8673145.html

时间: 2024-11-03 12:39:12

大数据笔记(二十四)——Scala面向对象编程实例的相关文章

大数据笔记(十四)——HBase的过滤器与Mapreduce

一. HBase过滤器 package demo; import javax.swing.RowFilter; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.client.HTable; import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.client.ResultScanner; impo

Java笔记二十四.TCP网络编程

 TCP网络编程 转载请表明出处:http://blog.csdn.net/u012637501(嵌入式_小J的天空) 从上面一节内容可以知道,利用UDP通信的两个程序是平等的,无主次之分,两个程序代码可以完全一样.但利用TCP协议进行通信的两个应用程序,是有主从之分的,一个称为服务器程序,另外一个称为客户机程序.Java中提供了ServerSocket类用于创建服务器端的socket,Socket类用于创建客户端socket. 一.APIs简介 java.net.ServerSocket (1

马哥学习笔记二十四——分布式复制快设备drbd

DRBD: 主从 primary: 可执行读.写操作 secondary: 文件系统不能挂载 DRBD: dual primay, 双主(基于集群文件系统的高可用集群) 磁盘调度器:合并读请求,合并写请求: Procotol:drbd数据同步协议 A: Async, 异步  数据发送到本机tcp/ip协议栈 B:semi sync, 半同步  数据发送到对方tcp/ip协议 C:sync, 同步  数据到达对方存储设备 DRBD Source: DRBD资源 资源名称:可以是除了空白字符外的任意

Android学习笔记二十四之ListView列表视图二

Android学习笔记二十四之ListView列表视图二 前面一篇我们介绍了常用的几种适配器的简单实现和ListView的简单使用,这一篇中,我们介绍一下ListView的优化和一些其它的问题. ListView优化方法一 在ListView中,我们最常用的就是自定义Adapter,在我们自定义Adapter中,需要实现两个比较重要的方法getCount()和getView(),前者是负责计算ListView的总Item数,后者是生成Item,有多少个Item就会调用getView()方法多少次

angular学习笔记(二十四)-$http(2)-设置http请求头

1. angular默认的请求头: 其中,Accept 和 X-Requested-With是$http自带的默认配置 2. 修改默认请求头: (1) 全局修改(整个模块) 使用$httpProvider依赖 var myApp = angular.module('MyApp',[]); myApp.config(function($httpProvider){ console.log($httpProvider.defaults.headers.common) //修改/操作$httpProv

python学习第十四天 -面向对象编程基础

python也是支持面向对象编程的.这一章节主要讲一些python面向对象编程的一些基础. 什么是面向对象的编程? 1.面向对象编程是一种程序设计范式 2.把程序看做不同对象的相互调用 3.对现实世界建立对象模型 面向对象编程的基本思想: 1.类用于定义抽象类型 2.实例根据类的定义被创建出来 如何定义一个类并创建实例? >>> class Animal(object): pass >>> dog = Animal() >>> cat = Animal

Android笔记二十四.Android基于回调的事件处理机制

如果说事件监听机制是一种委托式的事件处理,那么回调机制则与之相反,对于基于回调的事件处理模型来说,事件源和事件监听器是统一的,或者说事件监听器完全消失了,当用户在GUI控件上激发某个事件时,控件自己特定的方法将会负责处理该事件. 转载请表明出处:http://blog.csdn.net/u012637501(嵌入式_小J的天空) 一.View类的常见回调方法 为了使用回调机制来处理GUI控件上所发生的事件,需要为该组件提供对应的事件处理方法,而Java又是一种静态语言,我们无法为每个对象动态地添

Android学习笔记二十四.Service入门(二)绑定本地Service并与之通信

绑定本地Service并与之通信    通过上一篇博文的前3步,我们就算完成了一个Service及使用该Service的应用程序(Service为该应用程序的组成部分).但当程序通过startService()和stopService()启动.关闭Service时,Service与访问者之间基本上不存在太多的关联,因此Service和访问者之间也无法进行通信.数据交换.如果我们希望开发的Service能与访问者之间实现方法调用或数据交换,我们可以让访问者使用bindService()和unbin

Java基础学习笔记二十四 MySQL安装图解

.MYSQL的安装 1.打开下载的mysql安装文件mysql-5.5.27-win32.zip,双击解压缩,运行“setup.exe”. 2.选择安装类型,有“Typical(默认)”.“Complete(完全)”.“Custom(用户自定义)”三个选项,选择“Custom”,按“next”键继续. 3.点选“Browse”,手动指定安装目录. 4.填上安装目录,我的是“F:\Server\MySQL\MySQL Server 5.0”,也建议不要放在与操作系统同一分区,这样可以防止系统备份还