scala学习总结(3)
1.对象和类
-在自然界中,只要是客观存在的都是对象 (万物皆对象)
-对大量对象共性的抽象,抽取为类
*有什么 属性
*能做什么 方法
-在scala以及Java语言中,类是创建的模板
-类是客观事物在人脑中的主观反映
2.Scala的属性
-在Scala语言中,类、方法、属性默认修饰符是public,但是没有public关键字
-对于Scala中的属性,底层会用private修饰,同时提供公开的设置以及获取属性的方法----面向封装
-如果要生成满足JavaBean规范的get和set方法的话,需要在属性上加@BeanProperty注解
3.访问权限
-Java
*private 私有的,只能在本类中被访问
*default 默认的,可以在本类以及同包的其它类中被访问
*protected 受保护的,可以在本类、同包的其它类以及非同包的子类中被访问
*public 公开的,所有类
-Scala
*private 私有的,只能在本类中被访问
*public(默认) 公开的,所有类
*protected 比Java设置的更严格,只能在本类以及子类中被访问,同包其他类访问不了
*private[包名] 可以让指定的包进行访问
4.构造器(构造方法)
-主构造方法
*在声明类的同时,主构造方法也被声明
*主构造方法只能有一个
*如果主构造方法没有参数,那么以及调用的时候,小括号可以省略的
-辅助构造方法
*方法名必须叫this
*辅助构造方法可以重载
*辅助构造方法中的第一行必须直接或者间接调用主构造方法
5.模糊、不具体
-使用abstract关键字定义抽象类
-抽象类一般和抽象属性以及抽象方法配合使用
>抽象属性
属性只有声明,但是没有赋值
>抽象方法
方法只有声明,没有实现
-在一个类中,如果存在抽象属性或者抽象方法,那么这个类一定是抽象类
-如果一个类是抽象类,那么它不一定包含抽象属性和抽象方法
-如果一个类中存在抽象属性或者抽象方法,那么具体的实现应该交给子类完成
-如果子类也实现不了抽象内容,那么子类也应该声明为抽象类
-如果重写(实现)抽象属性或者方法,那么override关键字可以省略
-如果重写(覆盖)非抽象属性或者方法,那么override关键字不能省略,必须得加
-如果对非抽象属性进行覆盖,要求属性必须得用val修饰
-可以通过super关键字调用父类的方法,但是不能super调用父类的属性
-在Scala中,属性和方法都是动态绑定
*静态绑定(编译器绑定)
在编译阶段,确定属性或者方法所属类型
*动态绑定
在运行阶段,根据实际创建的对象类型来决定属性 或者方法所属类型
6.匿名子类
7.创建对象的方式
-new
底层调用的是构造方法
-类名()
底层调用的是伴生对象中apply方法
-实现单例设计模式
8.特质
-声明特质的语法
trait 特质名{
抽象属性
非抽象属性
抽象方法
非抽象方法
}
-混入特质
*不存在继承关系
class 类名 extends 特质1 with 特质2
*存在继承关系
class 类名 extends 父类 with 特质1 with 特质2
-特质叠加的顺序
第一步:列出第一个混入特质的继承关系,作为临时叠加的顺序
DBOperation-->Operation
第二步:列出第二个混入特质的继承关系,并且该顺序放到临时叠加顺序的前面,已经出现的特质不在出现
HDFSOperation-->DBOperation-->Operation
第三步:将子类放到临时叠加顺序的第一个
MyOperation-->HDFSOperation-->DBOperation-->Operation
注意:这个时候super不是调用父类中的方法了,而是调用特质叠加顺序上下一个节点的方法
package com.atguigu.scala.chapter06 /** * Author: Felix * Date: 2020/4/30 * Desc: 抽象 */ object Scala12_TestAbstract { } abstract class Person12{ //非抽象属性 val name:String = "zhangsan" //抽象属性 var age:Int //非抽象方法 def eat(): Unit ={ println("Person's eat") } //抽象方法 def sleep():Unit } class Student12 extends Person12{ //在Scala语言中,重写除了方法之外,还要属性的重写 //在子类中 ,如果重写的是抽象属性和方法,那么override关键字可以省略 var age: Int = 18 def sleep(): Unit = { println("banzhang sleep") } //对父类的非抽象方法进行重写 //override关键字不能省略,必须得加 override def eat(): Unit = { //可以通过super关键字,取调用父类的方法 super.eat() //但是不能通过super关键字,访问父类的属性 //println(super.name) //println(super.age) println("Student‘s eat") } //父类声明了抽象属性 ,子类对属性进行实现 //父类声明了非抽象属性 ,子类对属性进行重写 //如果子类需要对父类的属性进行重写,属性只能是val修饰 //override var name:String = "jingjing" override val name:String = "jingjing" }