大数据笔记(二十四)——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 常量
等等
}
包可以被引用在程序的任何地方
可以把工具函数或者常量添加到包对象里,在其他的类里导入这个包对象就可以引用。
包对象:常量,变量,特质,方法,类,对象
大数据笔记(二十四)——Scala面向对象编程实例的更多相关文章
- 大数据笔记(十四)——HBase的过滤器与Mapreduce
一. HBase过滤器 1.列值过滤器 2.列名前缀过滤器 3.多个列名前缀过滤器 4.行键过滤器5.组合过滤器 package demo; import javax.swing.RowFilter; ...
- python3.4学习笔记(二十四) Python pycharm window安装redis MySQL-python相关方法
python3.4学习笔记(二十四) Python pycharm window安装redis MySQL-python相关方法window安装redis,下载Redis的压缩包https://git ...
- (C/C++学习笔记) 二十四. 知识补充
二十四. 知识补充 ● 子类调用父类构造函数 ※ 为什么子类要调用父类的构造函数? 因为子类继承父类,会继承到父类中的数据,所以子类在进行对象初始化时,先调用父类的构造函数,这就是子类的实例化过程. ...
- python学习笔记(十九)面向对象编程,类
一.面向对象编程 面向对象,是一种程序设计思想. 编程范式:编程范式就是你按照什么方式去编程,去实现一个功能.不同的编程范式本质上代表对各种类型的任务采取的不同的解决问题的思路,两种最重要的编程范式分 ...
- JavaScript学习笔记(十六)——面向对象编程
在学习廖雪峰前辈的JavaScript教程中,遇到了一些需要注意的点,因此作为学习笔记列出来,提醒自己注意! 如果大家有需要,欢迎访问前辈的博客https://www.liaoxuefeng.com/ ...
- 大数据技术之_16_Scala学习_06_面向对象编程-高级+隐式转换和隐式值
第八章 面向对象编程-高级8.1 静态属性和静态方法8.1.1 静态属性-提出问题8.1.2 基本介绍8.1.3 伴生对象的快速入门8.1.4 伴生对象的小结8.1.5 最佳实践-使用伴生对象解决小孩 ...
- 大数据技术之_16_Scala学习_05_面向对象编程-中级
第七章 面向对象编程-中级7.1 包7.1.1 Java 中的包7.1.2 Scala 中的包7.1.3 Scala 包的特点概述7.1.4 Scala 包的命名7.1.5 Scala 会自动引入的常 ...
- python学习第十四天 -面向对象编程基础
python也是支持面向对象编程的.这一章节主要讲一些python面向对象编程的一些基础. 什么是面向对象的编程? 1.面向对象编程是一种程序设计范式 2.把程序看做不同对象的相互调用 3.对现实世界 ...
- 大数据入门第十四天——Hbase详解(二)基本概念与命令、javaAPI
一.hbase数据模型 完整的官方文档的翻译,参考:https://www.cnblogs.com/simple-focus/p/6198329.html 1.rowkey 与nosql数据库们一样, ...
随机推荐
- css overflow规定元素溢出框将会发生什么
- 软考题型—PERT图(项目计划评审技术)
经历过软件危机和大量软件项目的失败,人们对软件工程产业现状进行分析后,得出普遍性结论便是:软件项目成功率低的原因很可能就是项目管理能力太弱.由于软件本身的特殊性和复杂性,将项目管理思想引入软件工程领域 ...
- python-day18(正式学习)
目录 numpy模块 numpy简介 为什么要用numpy 创建numpy数组 numpy数组的基本属性 获取numpy数组的行列数 切割numpy数组 numpy数组元素替换 numpy数组的合并 ...
- 使用Idea部署SSM项目后,访问路径为url:8080/项目名_war_exploded的解决方案
在tomcat配置页的Deployment下,修改Application context为/,即可直接使用url:8080访问项目主页.
- luogu P1587 [NOI2016]循环之美
传送门 首先要知道什么样的数才是"纯循环数".打表可以发现,这样的数当且仅当分母和\(k\)互质,这是因为,首先考虑除法过程,每次先给当前余数\(*k\),然后对分母做带余除法,那 ...
- django Paginator 让分页变得完美
参考大佬地址:https://www.zmrenwu.com/courses/django-blog-tutorial/materials/21/ 类视图 from django.contrib.au ...
- oracle中的多表查询和子查询以及一些注意事项
多表查询就是使用两张表及其以上的查询.首先需要知道几个名词,笛卡尔积,内连接,外连接,子查询. 1)笛卡尔积 所谓笛卡尔积其实就是两张表数据的条数相乘得到的最后结果,例如表1有10条数据,表2有4条数 ...
- HTML5的几大新特性
为了更好地处理今天的互联网应用,HTML5添加了很多新元素及功能,比如: 图形的绘制,多媒体内容,更好的页面结构,更好的形式 处理,和几个api拖放元素,定位,包括网页 应用程序缓存,存储,网络工作者 ...
- random 方法 生成随机数
Math.random() 生成 大于等于0.0 且小于 1.0 的double 型随机数 ( 0.0 <= Math.random() < 1.0 ) 可以使用它便携简单了表达式,生成任 ...
- initlocation - 创建一个从属的 PostgreSQL数据库存储区
SYNOPSIS initlocation directory DESCRIPTION 描述 initlocation 创建一个新的PostgreSQL从属数据库存储区.参阅 CREATE DATAB ...