Scala简单入门1

一门语言想要精通应该很不容易,但是想要简单的掌握一些用法并拿来使用,应该不难,Scala和Java有许多共性,从Java的角度出发,来进入Scala,应该手到擒来。

配置Scala环境

这里我配置的是2.11.8版本的Scala
1、先是配置了本地的环境变量
在这里插入图片描述
2、在Settings->Plugins中安装了scala的插件
在这里插入图片描述
3、在Project Structure中的Libraries中添加进了SDK
在这里插入图片描述

Scala与Java的区别和共性

Scala特性

Scala可拓展
面向对象
函数式编程
兼容JAVA
类库调用
互操作
语法简洁
代码行短
类型推断
抽象控制
静态类型化(不能随便改变类型,var和val只能改变值)
可检验
安全重构
支持并发控制
强计算能力
自定义其他控制结构

区别(一些概念的区别)

Java中

Scala中非常兼容Java,这里我们简单定义一个Java类

public class Demo1Java {
    public void print(){
        System.out.println("打印java");
    }

    public static void main(String[] args) {
        Demo1Java demo1Java = new Demo1Java();
        demo1Java.print();//这是通过类的对象调用的方法

        Demo1Java.main(args);//这是通过类对象调用的方法

//        new Demo2Scala().print_scala();

        //Java中可以直接调用Scala中的类
        new Demo4ScalaStu().print();
    }
}

这里我们可以看到,在Java中,如果类中的一个方法不加上static的话,那它就只是一个普通的成员方法,必须通过类的对象调用,也就是下面这样:(这里面我们的print方法没有static修饰,只是一个简单的方法,调用的时候就需要创建一个类的对象来进行调用)
在这里插入图片描述
只有static修饰的方法,才能通过类对象(类名)的方式直接调用,也就是下面这样:(因为Java中的main方法是由虚拟机调用的,也就是通过类对象这种方式调用的,类对象就是代码经过编译生成的.class字节码文件加载到内存的一个对象,主函数里面有一个static修饰,去掉static会报错,也就是说,主函数需要通过类对象的方式进行调用
在这里插入图片描述

Scala中

Scala中的main方法只能放在object中运行,也就是说,object修饰的类相当于就是一个静态类,也就是相当于代码加载到虚拟机中的“类对象”,类中的方法和属性,相当于自动加上了static,可以直接通过“类对象”(类名)的方式直接调用,是一种单例模式

object Demo2Scala {
  val i = 10

  /**
    * Scala中的main方法
    * 在Scala中的方法不可以用static修饰
    *
    * def 定义一个函数的关键字
    * main 方法名
    * args: Array[String] 参数名:参数类型
    * Unit 返回值类型 相当于Java中的void
    * {} 方法体
    */

  def print_scala(): Unit ={
    print("scala")
  }

  def print_s: String ={
    val s = "S"
    return s
  }


  def main(args: Array[String]): Unit = {
    print("Hello World")
    Demo2Scala.print_scala()
    print(Demo2Scala.i)

  }
}

共性

Java中可以直接调用Scala中的类,并使用里面的方法
在这里插入图片描述

Scala中的类:

class Demo4ScalaStu {
  def print(): Unit ={
    println("Scala Stu")
  }
}

区别(一些使用的区别)

import java.io.{BufferedReader, FileReader}
import java.util

import scala.io.{BufferedSource, Source}

object Demo5ScalaBase {
  //scala的基本语法
  def main(args: Array[String]): Unit = {
    /**
      * 变量
      * 可以使用val 和 var 来定义变量,定义的时候不需要指定类型,但是最好指定类型
      * 用val修饰的变量,不能进行修饰,相当于常量
      * 用var修饰的变量,可以进行修改
      * 能使用val就使用val
      */
    val i = 100
    var j = 200
    j = 300
    println(i+1)//这样不算是修改变量

    //自动推断类型
    val k = 100
    //最好手动加上类型
    val kk : Int = 200
    //不知道是什么类型就使用object类型
    val k1 :Object = "100"
    println(k)
    println(kk)
    println(k1)


    //类型转换
    //Java中的类型转换
    val str1 = "123"
    println(Integer.parseInt(str1))
    //scala中的类型转换:只要数据符合要求,就可以直接to+类型
    val i1 = str1.toInt
    println(i1)


    //String类型
    //1.
    val str:String = "Hello,World"
    println(str.getClass.getSimpleName)
    val strings = str.split(",")
    strings.foreach(println) //这样就可以直接输出遍历了
    println(strings{0}) //这里输出需要用{}括号


    val str2:String = "abc"+"def"
    println(str2)
    //2.
    val builder: StringBuilder = new StringBuilder()
    builder.append("a")
    builder.append("bc")
    println(builder)
    //3.
    //可以通过 $变量名 在字符串中去变量的值 底层是StringBuilder
    val str3:String = "abc"
    val str4:String = "def"
    val str5:String = "hij"
    println(s"$str3,$str4,$str5")//前面用上s


    //文件读写
    //Java方式
    val br = new BufferedReader(new FileReader("data/students.txt"))
    var line:String = br.readLine()
    while (line!=null){
      println(line)
      line = br.readLine()
    }
    br.close()
    println("*" * 50)

    //scala读取文件
    val source: BufferedSource = Source.fromFile("data/students.txt")
    val iter: Iterator[String] = source.getLines() //返回一个迭代器,但是迭代器只能遍历一次
    //scala中的foreach
    for (elem <- iter) {
      println(elem)
    }
    println("*" * 50)

    //第一种简化
    for(elem<-Source
    .fromFile("data/students.txt")
    .getLines()){
      println(elem)
    }
    println("*" * 50)

    //第二种简化:链式调用
    Source
      .fromFile("data/students.txt")
      .getLines()
      .foreach(println)
    println("*" * 50)
  }
}

scala面向对象编程

构造方法

class Student(id:String,name:String,age:Int){
  println("默认的构造函数")
  //直接定义类的属性
  val _id:String = id
  val _name:String = name
  val _age:Int = age

}


object Demo6ScalaClass {
  def main(args: Array[String]): Unit = {
    val stu: Student = new Student("001","张三",21)
    println(stu._id)
    println(stu._name)
    println(stu._age)
  }
}

构造方法的重载

class Student(id:String,name:String,age:Int){
  println("默认的构造函数")
  //直接定义类的属性
  val _id:String = id
  val _name:String = name
  val _age:Int = age
  var _clazz:String = _


//  构造方法的重载 需要重新实现this方法
//  第一行代码必须调用默认的构造方法
  def this(id:String,name:String,age:Int,clazz:String){
    //调用默认的构造方法
    this(id,name,age)
    _clazz = clazz
  }

}


object Demo6ScalaClass {
  def main(args: Array[String]): Unit = {
    val stu: Student = new Student("001","张三",21)
    println(stu._id)
    println(stu._name)
    println(stu._age)

    val stu2:Student = new Student("002","李四",22,"文科一班")
    println(stu2._id)
    println(stu2._name)
    println(stu2._age)
    println(stu2._clazz)

  }
}

注意:
// 如果变量名以下划线开头 需要用花括号括起来
// 如果想调用变量的某个方法 也需要用花括号括起来
// return 可以省略 最后一行代码默认是返回的值

继承

class A(id:String,name:String){
  println("A的构造方法")
  //定义即赋值
  val _id:String = id
  val _name:String = name

  override def toString = s"A(${_id}, ${_name})"
}

/**
  * 继承还是使用extends关键字
  * 但是在继承的时候,需要调用父类的构造方法
  */
class B(id:String,name:String,age:Int) extends A(id,name){
  println("B中的构造方法")
  val _age:Int = age

  override def toString = s"B(${_id}, ${_name},${_age})"
}


object Demo7ScalaExtend {
  def main(args: Array[String]): Unit = {
    val b: A = new B("001","张三",21)
    println(b.toString)
  }

}

样例类

object Demo8CaseClass {
  def main(args: Array[String]): Unit = {
    //创建样例类对象的时候,new关键字可以省略
    val stu: Stu = Stu("001","张三",21,"男","文科一班")
    println(stu.id)
    println(stu.name)
    println(stu.age)
    println(stu.gender)
    println(stu.clazz)

    //样例类中的参数 就是该类的属性
    //默认是以val赋值的,如果想要修改,就需要手动修改成var
    stu.age = 22
    println(stu.age)
  }
}

/**
  * 样例类:会给每一个属性在编译的时候自动加上“get、set”方法,还会实现序列化接口
  */
case class Stu(id:String,name:String,var age:Int,gender:String,clazz:String)

感谢阅读,我是啊帅和和,一位大数据专业大四学生,祝你快乐。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啊帅和和。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值