zoukankan      html  css  js  c++  java
  • 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"
    }
    

      

  • 相关阅读:
    construction of tuples containing 0 or 1 items
    globals()
    __new__
    ubuntu系统安装mysql登陆提示 解决Mysql ERROR 1045 (28000): Access denied for user 'root'@'localhost'问题
    ubuntu系统更新源
    Python Web开发问题收集(二)
    linux后台执行./run.py提示python syntax error near unexpected token `('
    linux下执行scrapy的爬虫定时任务
    ubuntu系统中crontab的使用介绍
    JMeter BeanShell断言使用
  • 原文地址:https://www.cnblogs.com/guziteng1/p/14272526.html
Copyright © 2011-2022 走看看