学习笔记1-scala变量和常量声明(java对比)

0 scala程序基本结构

在这里插入图片描述object 伴生对象,编译之后有两个类,类本身,和$伴生对象(为啥存在?scala中没有静态的语法内容,通过伴生对象来模拟),tips:通过类名访问类内部的东西
def 声明
main 方法,
**()**参数列表,强类型
args:Array[string]参数名:类型,
Unit 参数列表的后面有个unit 代替 java的void
= 连接符 把{]方法的主体内容给main方法
{} 方法的逻辑实现
在scala中认为方法也是类的一部分,和属性是一样的,声明方式和使用方式都是一样的。都是=
scala怎么简单怎么来
scala不一定需要分号结尾,可加可不加(java需要分号隔开,避免写在一行里面;一般良好的代码风格都会换行)但写在一行会报错,需要加分号

0.0 java和scala程序对比

maven结构
在这里插入图片描述

0.1 scala代码

package com.atguigu.chapter01

object scala_Hello {
  def main(args: Array[String]): Unit =  {
    println("hello scala")
  }
}

0.2 java代码

package com.atguigu.chapter01;

public class java01_helloworld {
    public static void main(String[] args) {
        System.out.println("hello java");
    }
}

scala运行结果
在这里插入图片描述

java运行结果
在这里插入图片描述

0.3Scala的object创建伴生对象

scala创建类的时候默认创建一个class,但要创建一个静态变量写一个main方法,kind的要选择object创建一个伴生对象
选择scala class在这里插入图片描述默认kind是class,伴生变量需要选择object在这里插入图片描述

0.4Scala语言的输出方式

val name = “ApacheCN”
val age = 1
val url = “www.atguigu.com”
1)字符串通过+号连接(类似java)有ln末尾换行

println("name=" + name + " age=" + age + " url=" + url)

2) printf用法 (类似C语言)字符串通过 % 传值。(格式化输出)

printf("name=%s, age=%d, url=%s \n", name, age, url)

3)字符串插值:通过美元符号引用(类似PHP)

//3.println(s"name=$name, age=$age, url=$url") $name.后面有一堆方法当作变量使用
println(s"name=$name,age=$age,url=$url")
//3.1. f 格式化 浮点类型
println(f"name=$name,age=$age%.2f,url=$url")
//3.2. raw 输出原始型
println(raw"name=$name,age=$age%.2f,url=$url \n")

代码运行
在这里插入图片描述

1 变量

变量相当于内存中一个数据存储空间的表示,你可以把变量看做是一个房间的门牌号,通过门牌号我们可以找到房间,而通过变量名可以访问到变量(值)。

变量使用的基本步骤
1、声明/定义变量
2、使用

1.1变量声明基本语法

var | val 变量名 [: 变量类型] = 变量值

package com.atguigu.chapter02

object scala01_var {
  def main(args: Array[String]): Unit = {
    //var 声明的变量可以修改
    var age : Int = 10
    age = 20
    //val 声明的变量修改不了,main内部声明编译后没有final
    val name : String ="first"
    //name = "list" 报错,reassignment ,编译的角度完全一样,但语法的角度上限值
  }
}

scala运行结果
在这里插入图片描述

1.2scala与java对比

1.2.1 scala变量语法

1)基本语法
var 变量名 [: 变量类型] = 初始值 var i:Int = 10
val 常量名 [: 常量类型] = 初始值 val j:Int = 20
注意: 能用常量的地方不用变量

package com.atguigu.chapter02

object scala01_var0 {
  def main(args: Array[String]): Unit = {
    val name : Int = 10
    val day : Int = 20
    println(name)
    println(day)
  }
}

1.2.2 java变量语法

Java 变量和常量语法
变量类型 变量名称 = 初始值 int a = 10
final 常量类型 常量名称 = 初始值 final int b = 20

package com.atguigu.chapter01;

public class java02_var1 {
    public static void main(String[] args) {
        int age = 10;
        final int day = 20;
        System.out.println(age);
        System.out.println(day);
    }
}

scala运行结果
在这里插入图片描述

java运行结果
在这里插入图片描述

1.3关于scala增加的关键字var/val

package com.atguigu.chapter02

object scala01_var {
  def main(args: Array[String]): Unit = {
    //声明变量
    //var 变量名称: 变量类型 = 变量的值
    //scala 声明变量必须显示的初始化
    var age : Int = 10
    println(age)
  }
}

scala输出结果
在这里插入图片描述
idea按 ctrl+shift+F9 (编译recompile)之后为查看编译结果,编译中不存在var关键字,只是scala的定义需要
在这里插入图片描述编译后的结果和java的语句完全一致,输出一致

package com.atguigu.chapter01;

public class java02_var0 {
    public static void main(String[] args) {
        int age = 10;
        System.out.println(age);
    }
}

1.4val不能改的原因深究

在这里插入图片描述在java中string不可变,不是字符串不可变,是引用地址不可变;是因为声明好字符串之后所引用的地址不可变;
源码体现,final修饰了一个变量 char[] value;这个变量的值无法改变,内存地址不变,但其实内容可变,但字符串未提供任何可以改变的方法,只能产生新的字符串,不对现有字符串进行更改
在这里插入图片描述通常使用方式:产生新的字符串
s.trim()
s.replaceALL()
tip:java的方法是值传递

如何变?
反射:从内存对象中把属性的值取出来
举例
java代码1:声明string变量后 s 含空格,用s.trim()去掉首尾空格

package com.atguigu.chapter01;

public class java03_var0 {
    public static void main(String[] args) {
        String s = "  a b  ";
        s.trim();//去掉首尾空格
        System.out.println("!"+s+"!");
    }
}

java运行结果1
在这里插入图片描述java代码2:

package com.atguigu.chapter01;

import java.lang.reflect.Field;

public class java03_var1 {
    public static void main(String[] args) throws Exception{
        String s = " a b ";

        Field value = s.getClass().getDeclaredField( s:"value");
        value.setAccessible(true);
       //Object o = value.get(s);//反射
        char[] cs = (char[]) value.get(s); //cahr[]数组
        cs[2] = 'd';
        System.out.println(s);

    }
}

java运行结果2
在这里插入图片描述

2 变量注意事项

2.1声明变量时,类型可以省略(就是叫 类型推断)

package com.atguigu.chapter02

object scala01_var1 {
  //在方法外部声明的变量如果采用val关键字,等同于使用final修饰
  val sex : String = "男"
  def main(args: Array[String]): Unit = {
    //scala 的val声明,能省则省,
    //scala 为了让开发过程变得简单,可以将自动推断的内容省略,scala不看重类型
    val username : String = "zhangsan"
    //可以省略String ,可以推断出 带引号的都为string类型
    val name = "list"
    println(name)
  }
}

在这里插入图片描述
scala快捷使用tips
// “wangwu”.var 回车能自动带出来
val wangwu = “wangwu”
//1 + 1 .回车 语法可以省略带出来 var
val i = 1 + 1

2.2类型确定后,就不能修改,说明Scala 是强数据类型语言

在这里插入图片描述

2.3在声明/定义一个变量时,可以使用var 或者 val 来修饰, var 修饰的变量可改变,val 修饰的变量不可改

同1.4

2.4val修饰的对象属性在编译后,等同于加上final

在main方法内部的局部变量不会加final,放在main方法外面有final
举例:
val 定义的main外变量sex 和main内变量name
在这里插入图片描述在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值