首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

scala面向对象编程

面向对象编程

"面向对象编程"也是一种"编程范式"(programming paradigm)

结构化编程的思路是从功能结构的角度求解问题,先做什么,后做什么,有一个结构在里面,而面向对象编程是将问题分解成小的问题对象,通过对象之间的通信以及内在的属性变化来求解问题。不同的编程思路有其各自的优缺点。

面向对象编程中,对象是人们要进行研究的任何事物,从最简单的整数到复杂的飞机等均可看作对象,它不仅能表示具体的事物,还能表示抽象的规则、计划或事件。

具有相同特性(数据元素)和行为(功能)的对象的抽象就是类。因此,对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象,类实际上就是一种数据类型。

// 声明类

public class User {

public String username;

}

// 构建对象

User user = new User();

Java是面向对象的编程语言,由于历史原因,Java中还存在着非面向对象的内容:基本类型,null,静态方法等,所以Java又不是完全面向对象的语言。Scala语言来自于Java,所以天生就是面向对象的语言,在面向对象的学习过程中可以对比着Java语言

// Java

// [修饰符] class 类名

// java语法中要求一个java源码文件中可以声明多个类,但是公共类只能有一个,且必须和源码文件的文件名保持一致。

// Scala

// [修饰符] class 类名

对象

// Java

// 类型 变量 = new 类型();

// User user = new User();

// Java是强类型语言,声明任何变量的同时都必须声明类型

// Scala

// val 变量 [:类型] = new 类型();

// val user : User = new User();

// scala在声明对象变量时,可以根据创建对象的类型自动推断,所以类型声明可以省略

属性

// Java(Bean)

// private 类型 属性名称;

// public Setter/Getter方法

//Java语法中如果声明了一个属性,但是没有显示的初始化,那么会给这个属性默认初始化

// 通过setter/getter方法对属性进行赋值和取值

// setter/getter方法一般都是公共访问权限,起到了封装的作用

// Scala(Bean)

// private var 属性名称 [:类型] = 属性值

// def Setter/Getter方法

// Scala中声明一个属性,必须显示的初始化,然后根据初始化数据的类型自动推断,属性类型可以省略,如果初始化的值设定为null,也可以使用符号_(下划线)代替

// Scala为了访问一致性,所以并不推荐由开发人员自行定义setter/getter方法

// Scala中为了简化代码的开发,当声明属性时,本身就自动提供了对应的setter/getter方法

// 如果属性声明为private的,那么自动生成的setter/getter方法也是private的

// 如果属性省略访问权限修饰符,那么自动生成的setter/getter方法是public的

方法

// Java

// public 返回值类型 方法名(参数列表) { 方法体 }

//调用方法

// 对象.方法名()

// Scala

// def 方法名(参数列表) [:返回值类型] =

// Scala中一般将对象中的函数称之为方法,将非对象中的函数称之为函数。声明规则请参考函数式编程中的函数声明

// 调用方法

// 对象.方法名()

静态方法

// Java

// public static 返回值类型 方法名(参数列表)

// Java中静态方法并不是通过对象调用的,而是通过类对象调用的,所以静态操作并不是面向对象的。

// Scala

// Scala语言是完全面向对象(万物皆对象)的语言,所以并没有静态的操作。但是为了能够和Java语言交互,就产生了一种特殊的对象来模拟类对象,我们称之为类的伴生对象。这个类的所有静态内容都可以放置在它的伴生对象中声明和调用

// Scala中伴生对象采用object关键字声明,伴生对象中声明的全是“静态”内容,可以通过伴生对象名称直接调用。

// 伴生对象对应的类称之为伴生类,伴生类和伴生对象应该在同一个源码文件中

// 从语法角度来讲,所谓的伴生对象其实就是类的静态方法和成员的集合

// 从技术角度来讲,所谓的伴生对象在编译时,会将对应的代码以静态的方式生成到类的字节码中。

// Java

// package 包名;

// Java中的包名主要用于区分不同含义但名称相同的类,通过包名进行管理,使用时,只要增加全包名就不会冲突

// java中包名和源码所在的系统文件结构息息相关,并且编译后的字节码文件路径也和包名保持一致

// Scala

// package 包名

// scala语言也可以使用包管理类

// scala 包名和源码实际的存储位置没有关系

// 从技术角度来讲,Scala的编译器会将Scala中的包编译成符合Java语法规则的包结构

继承

和Java一样,Scala也支持类的单继承

// Java

// class 子类名 extends 父类名 { 类体 }

// 子类继承父类的属性和方法

// Scala

// class 子类名 extends 父类名 { 类体 }

//子类继承父类的属性和方法

接口

// Java

// 声明接口

// interface 接口名

// 实现接口

// class 实现类类名 implements 接口名

// 在Java中,接口并不属于类的体系关系,所以可以多实现,且接口支持多继承

// 接口中属性都是常量

// 接口中的方法都是抽象的。

// Scala

// Scala语言中,采用特质(特征)来代替接口的概念,也就是说,多个类具有相同的特征

(特征)时,就可以将这个特质(特征)独立出来,采用关键字trait声明

// 声明特质

// trait 特质名

// 一个类具有某种特质(特征),就意味着这个类满足了这个特质(特征)的所有要素,所以在使用时,也采用了extends关键字,如果有多个特质或存在父类,那么需要采用with关键字连接

// class类名 extends 特质1名称 with 特质2名称 with 特质3名称

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190519A0F3F600?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券