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