期末复习——第三章

首先区分类型和变量。
类型是一组值,以及可以对这些值执行的操作。 而变量是存储一个特定类型值的被命名的位置(用特定数据类型定义,可存储满足类型约束的值)

Java
基本数据类型(primitive types):int ,long ,boolean ,double ,char;
对象数据类型:String,BigInteger,定义的对象类型
基本数据类型小写开始,对象数据类 型大写开始
在这里插入图片描述
另外,对象数据类型还包括基本类型的包装类,但是会影响效率。
所有类都默认继承了Object类。子类继承父类的方法和可见成员变量,并且可以重写方法。
java中的操作符,如+ - * /,和函数,都可以被重载
java是一种静态类型语言,再编译时需要知道所有变量的类型,在编译阶段进行类型检查。(而Python则是动态的,在运行时进行类型检查)

静态类型检查的内容——关于类型
语法错误(动态检查的语言也会进行此检查)
类名/函数名错误
参数数目错误
参数类型错误
返回值类型错误

动态类型检查的内容——关于值
非法的参数值:如除0错误
非法的返回
索引越界
空指针

Java的基本类型有一些不会被动态检查的特例,如5/2,大整数溢出,浮点类型中的特殊值如NaN
没有提示错误,但是结果是infinity
 java.lang.ArithmeticException: / by zero
静态检查:the local variable b may not have been initialized

  • 可变与不可变
    改变variable和改变value
    对变量赋值是在改变变 量的指向,指向不同的值
    改变可变变量的内容时 ,是在改变变量内部内容的引用
    由于改变常常是不可预测的,所以优秀的程序需要维护某些不变性
    immutable type:不变类型的实例创建完之后,值不可修改
    immutable reference:不变引用一旦指定位置,不可再次指定——使用final关键字,利于静态检查
    final class不可被继承,final variable不能被改变,final method不能被重写

不可变的对象:一旦被创建,他们总是表示同样的值
可变的对象:拥有mutator,可以改变自身的值

String是典型的不可变类型。如果要修改String对象表示的值,只能将这个引用指向其他内存区间。
SnapShot描述
而StringBuilder则是可变的字符串类型。
在这里插入图片描述

不可变类型:许多临时的拷贝,性能差,但安全
可变:性能好,可共享,但不安全,带来内存别名的风险,返回时需要defensive copy
不可变类型可能没有可变类型高效,但是它不需要denfensive copy

  • Snapshot diagrams
    表示程序在运行时的内部状态
    栈:方法和局部变量
    堆:现存的对象
    不可变的引用和对象都用双线
    可以有:不可变的引用指向可变的值,如 final StringBuilder sb,可变的引用指向不可变的值,如String s

常用的不可变类型
基本类型及其包装类是immutable的。如果要进行较大的数的运算,BigInteger和BigDecimal也是immutable的。Collections提供包装方法Collections.unmodifiableList ,Collections.unmodifiableSet, Collections.unmodifiableMap等获取不可变的集合(可以用来defensive copy)。

非空的collection可以包含null,基本类型不可以被赋值为null。如非必要,在程序中不要使用null。

猜你喜欢

转载自blog.csdn.net/qq_43351085/article/details/92796732
今日推荐