一.面向对象编程根底
1.1 包
1)申明包:罕用命名形式 域名反写+项目名称+模块名+程序类型名称
2)根本语法:和java相似
package cn.leaf.demo03
3)Scala在根底语法上进行了扩大,性能更加弱小
- package关键字嵌套申明
package cn{ package leaf{ package demo03{ object Scala_Object{ def main(args: Array[String]): Unit = { println("demo") } } } }}
- Scala中包和类的物理门路没有关系
- 子包能够间接拜访父包内容,不须要import导入
示例
package cn{ package leaf{ class Test{ def fun(): Unit ={ println("test") } } package demo03{ object Scala_Object{ def main(args: Array[String]): Unit = { // 间接应用父包中的Test类 val t = new Test() t.fun() } } } }}
1.2 导入import
1)根本语法和Java统一
2)Scala同样对import进行扩大
- import 能够在任意地位应用
object Scala_Object{ def main(args: Array[String]): Unit = { import java.util.ArrayList new ArrayList[String]() }}
- Scala中import能够在同一行导入多个类
import java.util.{List, ArrayList}
- 屏蔽包
import java.sql.{ Date=>_, Array=>_}
- 给包起别名
import java.util.{Date=>UtilDate}
1.3 类
Scala中没有static成员存在,然而Scala能够通过某种形式达到应用static成员的目标,这个就是伴生机制。
在语法层面上,把static成员和非static成员用不同的表达方式,就是class和object。
class在编译时只会产生以后类的class文件,其作用就是润饰一般的类。
object在编译时会产生两个类文件,一个是以后类的文件,另一个是单例的类文件,object中的属性和办法都能够通过类名间接拜访,相似动态语法。
个别将object申明的类称之为伴生类,对应的单例文件称之为伴生对象。
但通常将雷同名称的class、object申明的类进行辨别:
应用class申明的类为伴生类
应用object申明的类为伴生对象
1.4 属性
示例
object Scala_Object{ def main(args: Array[String]): Unit = { // 类中申明的属性等同于类中申明局部变量,应用var和val申明 val person1 = new Person person1.name = "张三" person1.age = 18 person1.addr = "Beijing" }}class Person{ var name:String = _ // 下划线示意默认初始化 var age:Int = _ var addr:String = _ val heigh = 0 // 如果应用val申明,则须要显示赋值,同时应用val申明的属性也不能批改。}
Scala类中申明的属性:
1)编译时,类中申明的属性都是private
而后同时提供公共办法进行拜访
2)编译生成的办法为:
相似java中Bean对象的get办法,用于返回属性的值相似java中Bean对象的set办法,用于设定属性的值
3)在应用时
因为属性是公有,所以给属性赋值,等同于调用set办法因为属性是公有,所以获取属性值,等同于调用get办法
4)应用val申明的属性
编译时,属性会被final润饰,应用过程中不提供set办法
5)Scala编译生成get、set办法并不遵循bean标准,这导致在很多框架中无奈应用,为了兼容其余框架,能够采纳注解@BeanProperty。
@BeanPropertyvar name:String = _
构建对象:
1) 应用class申明的类,能够间接应用new的形式
object Scala_Object{ def main(args: Array[String]): Unit = { // new 对象,构造方法无参,则小括号可省略 val person1 = new Person }}class Person{}
2)应用apply构建对象,个别用于object伴生对象中构建对象。
示例
object Scala_Object{ def main(args: Array[String]): Unit = { val person = Person() val person2 = Person("张三") }}class Person{}object Person{ // apply办法能够重载 def apply(): Person = new Person() def apply(name:String): Person = { println("Person name==>"+name) new Person }}
1.5 拜访权限
Scala中有4种拜访权限:
- private: 公有权限,同类中拜访
- private[包名]:包公有权限,同类或同包中拜访
- protected: 受爱护的权限,同类中拜访或者子类中拜访
- (default) : 公共权限,任意地位,留神Scala中没有public关键字
1.6 办法
Scala中类的办法就是函数,申明形式齐全一样,但Scala中的办法具备重载和重写机制,同时调用办法必须通过对象。
1.7 构造方法
当应用new关键字创建对象时,就在调用类的构造方法。
Scala中构造方法有两种类型:
1)主构造方法:在类名后的构造方法
2)辅助构造方法:为实现类的初始化提供的构造方法
class Person(){ // 主构造方法 var person_name:String = _ def this(name:String){ // 辅助构造方法 this() person_name = name }}
含有参数的主构造方法
class Person(name:String){ // 主构造方法能够有参数 // name参数是作为局部变量存在,不能通过对象在内部拜访 // person_name 同样是局部变量,但同时也是类的属性,能够通过对象在内部调用 // 如果咱们须要通过对象拜访name属性,那传参时,能够应用val name:String,如下边类Person2 val person_name:String = name}class Person2(val name:String){ }
二. 面向对象编程进阶
2.1 继承
这个跟Java没有多少区别,同样是单继承,应用extends关键字
class Person{}class Student extends Person{}
不同之处,如果子类要重写父类的非形象办法,则必须应用overwrite关键字。
子类重写父类办法后,如果在子类中调用父类的被重写的办法,应用super关键字。
class Person{ def speak(): Unit ={ println("Person") } }class Stu extends Person{ override def speak(): Unit = { super.speak() println("Student") }}
2.2 封装
面向对象编程,封装大同小异,跟没有多少差别。
2.3 形象
1)抽象类
在父类中,有某些办法没有实现,子类继承时,须要重写来实现,这类办法就是形象办法。
而含有形象办法的类,就是抽象类,须要应用abstract申明,跟Java相似。
抽象类不能实例化。
abstract class Car { def car_color():Unit}class BaoMa extends Car{ override def car_color(): Unit = { println("red") println("blue") }}
2)形象属性
形象属性,就是说属性只有申明,而没有初始化
类中存在形象属性,那么这个类也是抽象类。
形象属性在编译时,不会产生类的属性,而是产生属性的get、set办法,且都是形象的。
重写形象属性,等同于重写一般属性的申明:get、set办法
子类重写父类的形象属性,那么只须要将属性申明补充残缺即可。
子类重写父类的惯例属性,则须要应用overwrite关键字润饰。
Scala中类的属性编译时,主动生成公有属性和对应的set、get办法,这点通过反编译能够查到。
示例
abstract class Car { // 形象属性 var car_height:Int // 惯例属性 @BeanProperty val car_weight:Int = 20}class BaoMa extends Car{ var car_height: Int = 30 @BeanProperty override val car_weight: Int = 30}
2.4 特质
Scala没有接口的概念,也就没有interface关键字。
然而Scala提供Trait作为接口来应用,也就是特质。
简略来说,就是Scala可能从多个类中将雷同的特色抽离进去,造成非凡的语法结构。
Java中所有的接口都能够当做特质来应用。
1)特质能够看做Interface,类混入特质,就等同于实现接口interface。
示例
// 应用trait关键字申明特质trait DemoTrait{ def hello(info:String)}// 类应用extends关键字混入特质class Person extends DemoTrait{ def hello(info: String): Unit = { println("hello"+info) }
2)特质中除了定义形象办法外,还能定义具体方法
示例
object Scala_Object{ def main(args: Array[String]): Unit = { // 申明实例对象,应用with关键字混入特质 val person = new Person with DemoTrait person.hello("world") }}// 应用trait关键字申明特质trait DemoTrait{ def hello(info:String):Unit = { println("hello:"+info) }}class Person{ }