类与对象

一.概念

类:其实可以看作新的数据类型,可以管理多个不同类型的数据,并且可以对属性进行操作

面向对象:Java是面向对象的编程语言,由于历史原因,Java中还存在着非面向对象的内容:基本类型 ,null,静态方法等
Scala语言来自于Java,所以天生就是面向对象的语言,而且Scala是纯粹的面向对象的语言,即在Scala中,一切皆为对象
(int - Int , null - Null,在scala中没有静态,用伴生对象)
https://news.cnblogs.com/n/548327/整理一下

类和对象的区别和联系
类是抽象的,概念的,代表一类事物,比如人类,猫类..
对象是具体的,实际的,代表一个具体事物
类是对象的模板,对象是类的一个个体,对应一个实例

二.类

定义:

[修饰符] class 类名 {
    类体
}

定义类的注意事项

1.scala语法中,类并不声明为public,所有这些类都具有公有可见性(即默认就是public),添上public会报错
2.多个类写在一个文件中,如果类前都不写修饰符的话,都是public,(对比在java中,多个class在一个文件中,最多只能有一个修饰符为public,且与文件名一致,可以都不写public)
3.一个类编译后只有一个class文件生成,区分object的不同

三.属性/成员变量

[访问修饰符] var 属性名称 [:类型] = 属性值
1.当不写访问修饰符时,默认为private,并且编译后val类型会自动生成类似get的方法,var类型会自动生成类似get和set方法
2.如果不写类型,会自动根据值进行判断,并且之后不能被赋于其他类型的数值,

var height = 12
height = ""               //报错
var name = null           //判断为Null类型
var name1 :String = null  //String类型

3.如果在定义属性时,暂时不赋值,也可以使用符号_(下划线),让系统分配默认值,但是必须指定类型,因为其根据类型进行赋初始值,且必须用var

char                   空字符
Byte Short Int Long    0
Float,Double           0.0
String及其他引用类型     null
Boolean                false

4.内存

四.构造器

复习Java

public class A extends B{
    public A(){
    }
    public A(String name){
    }
}

每一个构造器隐藏的第一行代码是啥?  super();
这句话能显式放在第二行代码或之后吗?  不能
为什么?https://www.zhihu.com/question/47012546       https://blog.csdn.net/zhaozhirongfree1111/article/details/77962184

 看一段scala代码

class person(Inname:String,Inage:Int){
    var name:String = Iname
    var age:Int =Inage
} //形参与变量无法重名

注:
1.主构造器的声明直接放置于类名之后 

class person(Inname:String,Inage:Int){
}

2.主构造器会执行类定义中的所有语句

class person(Inname:String,Inage:Int){
    var name:String = Iname
    var age:Int =Inage
    println("name = " + name)
}
在new person时,println("name = " + name)会执行,因为这条语句是构造器中的,可以反编译进行查看

3.如果主构造器无参数,小括号可省略class person{},构建对象时调用的构造方法的小括号也可以省略 new Person
4.辅助构造器名称为this,每一个辅助构造器都必须以一个对先前已定义的其它辅助构造器或主构造器的调用开始,即都会直接或者间接的调用主构造器。new时,可以对应辅助构造器的参数,也可以是主构造器的参数,但是都会先进行执行主构造器
5.如果想让主构造器变成私有的,可以在()之前加上private,这样用户只能通过辅助构造器来构造对象了

class person private(){} 

6.函数高阶

①构造器参数

Scala类的主构造器的形参未用任何修饰符修饰,那么这个参数是局部变量,普通函数不可以。
如果参数使用val关键字声明,那么Scala会将参数作为类的私有的只读属性使用
如果参数使用var关键字声明,那么那么Scala会将参数作为类的成员属性使用,并会提供属性对应的xxx()[类似getter]/xxx_$eq()[类似setter]方法,即这时的成员属性是私有的,但是可读写。

②给某个属性加入@BeanPropetry注解后,会生成getXXX和setXXX的方法,并且对原来底层自动生成类似xxx(),xxx_$eq()方法,没有冲突,二者可以共存

@BeanProperty var name: String = null
posted @ 2019-01-06 15:57  Hypergroup  阅读(158)  评论(0)    收藏  举报