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"
}

  

posted @ 2021-01-13 15:51  恶霸xx  阅读(122)  评论(0编辑  收藏  举报