04_Scala_OOP_类_属性_成员变量_创建对象

举报
alexsully 发表于 2021/04/06 10:19:08 2021/04/06
【摘要】 OOP_类 属性 显性赋值,自动类型推断, _ 默认值(指明类型) 创建对象 类型省略/类型必须写明(子类对象给予父类引用)

一 Scala语言是面向对象的

1) Java中还存在非面向对象内容:基本类型, null, 静态方法

2 )Scala语言来自Java, 天生面向对象,一切皆对象

二 类

【修饰符】 class 类名 { 类体}

1 )Scala语法中,类并不声明 public,所有类都具有共有可见性(默认public)

2 )一个scala 源文件可以包含多个类,默认都是public

三  属性/成员变量

1) 属性的定义同变量,例:[访问修饰符] var 属性名称 [:类型] = 属性值
2) 属性的定义类型可以为任意类型,包含值类型或引用类型
3) 声明一个属性,必须显示的初始化,然后根据初始化数据的类型自动推断,属性类型可以省略(这点和Java不同)
4)如果赋值为null,则一定要加类型,因为不加类型, 那么该属性的类型就是Null类型
5)如果在定义属性时,暂时不赋值,也可以使用符号_(下划线) 但必须指定类型,让系统分配默认值

类型 _ 对应的值
Byte Short Int Long 0
Float Double 0.0
String 和 引用类型 null
Boolean false


object CatDemo {
  def main(args: Array[String]): Unit = {

    //创建一只猫
    val cat = new Cat
    //给猫的属性赋值

    //说明
    //1. cat.name = "sumi" 其实不是直接访问属性,而是  cat.name_$eq("sumi")
    //2. cat.name 等价于 cat.name()
    cat.name = "sumi" //等价
    cat.age = 10
    cat.color = "while"
    cat.sex  ="male" // 字符串
    println("ok~")
    printf("\n小猫的信息如下: %s %d %s", cat.name, cat.age, cat.color)
  }
}

//定义一个类Cat
//一个class Cat 对应的字节码文件只有一个 Cat.class ,默认是public
class Cat {
  //定义/声明三个属性
  //说明
  //1. 当我们声明了 var name :String时, 在底层对应 private name
  //2. 同时会生成 两个public方法 name() <=类似=> getter  public name_$eq() => setter
  var name: String = "" //给初始值
  var age: Int = _ // _ 表示给age 一个默认的值 ,如果Int 默认就是0  如果是用 _ 方式给默认值,则属性必须指定类型
  var color: String = _ // _ 给 color 默认值,如果String ,默认是就是""
  var sex = ""   // 自动类型推断
}

/*
public class Cat
{
  private String name = "";
  private int age;
  private String color;

  public String name()
  {
    return this.name; }
  public void name_$eq(String x$1) { this.name = x$1; }
  public int age() { return this.age; }
  public void age_$eq(int x$1) { this.age = x$1; }
  public String color() { return this.color; }
  public void color_$eq(String x$1) { this.color = x$1; }

}
 */

四 创建对象

val | var 对象 [:类型]  = new 类型() 

1)如果不希望改变对象的引用(即:内存地址), 声明为val,否则为var, 推荐使用val ,在程序中,我们只是改变对象属性的值,而不是改变对象的引用

2) 声明对象变量时,可以根据创建对象的类型自动推断,所以类型声明可以省略,但当类型和后面new 对象类型有继承关系即多态时,就必须写了

object CreateObj {
  def main(args: Array[String]): Unit = {
    val emp = new Emp // emp 类型就是Emp
    //如果我们希望将子类对象,交给父类的引用,这时就需要写上类型
    val emp2: Person = new Emp
 }
}

class Person {
}

class Emp extends Person {
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。