Java编程思想(一)

对象导论

抽象过程

  • 抽象数据类型
    • 可以创建某一类型的变量,然后操作这些变量。
    • 每个类的成员或元素都具有某种共性
    • 每个成员都有其自身的状态
    • 每个对象都属于定义了特性和行为的某个特定的类
  • 类和数据类型
    • 类和数据类型一样描述了具有相同特性和行为的对象集合
    • 差异在于:定义类用于适应问题,而不是被迫使用现有的用来表示机器中的存储单元的数据类型
  • 问题空间的元素和解空间的对象之间创建一对一的映射
    • 获得有用的对象:有某种方式产生对对象的请求,是对象完成各种任务。
    • 每个对象都只能满足某些请求,这些请求由对象的接口定义,决定接口的是类型
    • 接口确定了对某一特定对象所能发出的请求
  • 将对象看作服务提供者
    • 程序通过调用其他对象提供的服务实现向用户提供服务的目的
    • 有助于提高对象的内聚性
    • 每个对象都有一个它所能提供服务的内聚的集合

被隐藏的具体实现

  • 访问控制的存在原因
    • 隐藏对数据类型内部操作必要,而用户解决特定问题时不需要
    • 数据类型内部修改不用影响解决问题
  • 访问权限
    • public:修饰内容任何人可用
    • 默认:包访问权限,同一个包可以访问,其他包不可
    • protected:继承的类可以访问,其他不可以
    • private:内部方法之外不可使用

复用

  • 复用方式:
    • 某个类的方式就是直接使用该类的一个对象
    • 组成:将一个类的一个对象置于新的类成为一个成员对象,这个类可以由任意数量,任意类型的其他对象以任意可以实现新的类中想要的功能的方式所组成->现有类合成新类->新类的成员对象通常设置为private

继承

  • 继承使用基类型和导出类型的概念表示了这种类型之间的相似性(两个类有相同的特征和行为,一个比另一个有更多的属性和方法)
  • 类与基类具有相同的类型:所有可以发送给基类对象的消息同时也可以发送给导出类对象
  • 覆盖:与基类一致的方法名和参数列表,内部函数体不一致
  • 纯粹替代:导出类和基类具有完全相同的属性和覆盖的方法,导致一个导出类对象可以完全替代几类对象
  • 后期绑定:当向对象发送信息时,被调用的代码直到运行时才能确定。编译器确保被调用方法的存在,并对调用参数和返回值执行类型检查,但不知道将被执行的确切代码
  • 在Java中,动态绑定是默认行为
  • 单根继承结构:所有的类最终都继承自单一的基类,Object,确保了所有对象都具备某些基本操作
  • 容器:创建一种对象类型持有其他对象的引用
    • 类型:
      • List:存储序列
      • Map:关联数组,建立对象之间的关联
      • Set:每种对象类型只持有一个
    • 选择性容器的原因:
      • 不同容器提供了不同类型的接口和外部行为
      • 不同容器对于某些操作具有不同的效率
        • LinkedList 和 ArrayList
        • ArrayList是数组结构,逻辑顺序相邻,物理地址相邻,LinkedList是列表,逻辑顺序不影响物理地址关系
        • ArrayList随机访问是一个花费固定时间的操作,LinkedList越靠近表尾耗费越大
        • 插入元素,ArrayList需要移动插入元素后面的所有元素,LinkedList插入元素仅需要修改连接下一个元素内容
  • 参数化类型
    • 向下转型,将基类转型为导出类。不安全,但错误会报错
    • 创建一个保存所保存对象的类型的容器:参数化类型机制(一个编译器可以自动定制作用域特定类型上的类)—>JAVA中泛型
    • 泛型:ArrayList<类型信息> arr = new ArrayList<类型信息>();

对象的创建和生命期

  • 最大执行速度:通过将对象置于堆栈或者静态存储区域实现在编写程序时确定对象的存储空间和生命周期。
    • 将存储空间分配和释放置于优先考虑的位置
    • 牺牲灵活性
    • 在编写程序时知道对象确切的数量,生命周期和类型
  • 动态创建对象:在堆的内存池中,直到运行时才知道需要多少对象,生命周期和具体类型
    • 如果需要一个新对象,可以在需要时刻直接在堆中创建
    • 存储空间在运行时被动态管理,所以需要大量时间在堆中分配存储空间
    • 在堆栈中创建存储空间和释放存储空间需要一条汇编指令即可,即栈顶指针向下移动或向上移动。
  • Java才用了动态内存分配方式,每当想要创建新对象使用new构建此对象的动态实例
  • Java的垃圾回收机制:自动发现对象何时不再使用并继而销毁,用来处理内存释放问题

异常处理:处理错误


一切都是对象

引用

  • String s = new String(“abcd”);
    • s:是String类型的一个引用
    • new操作符实现了创建新的对象
  • 对象存储位置
    • 寄存器:最快存储器,数量有限。根据需求分配,不受人为控制
    • 堆栈:RAM(随机访问存储器)中,通过堆栈指针从处理器获得支持,指针向下移动分配新的内存,向上移动则释放内存。创建程序时,Java必须知道存储在堆栈内所有项的确切生命周期。
    • 堆:一种通用内存池(RAM中),用于存放所有的JAVA对象
      • 编译器不需要知道存储数据的生命周期
      • 当需要一个对象时,只需要new,执行这个时,会自动在堆里进行存储分配
      • 用堆进行存储分配和清理会浪费时间,但灵活性更多
    • 常量存储:直接存放在程序代码内部,安全,永远不会改变
    • 非RAM存储:存储完全存活于程序之外的数据,即不收程序控制,在程序运行时可以存在的数据
  • 基本类型
    • 基本数据类型
header 1 header 2 最小值 最大值 包装器 默认值
boolean - - - Boolean false
char 16 bit Unicode 0 Unicode 2^16-1 Character null
byte 8 bits -128 127 Byte (byte)0
short 16 bits -2^15 2^15-1 Short (short)0
int 32 bits -2^31 2^31-1 Integer 0
long 64 bits -2^63 2^63-1 Long 0L
float 32 bits IEEE754 IEEE754 Float 0.0f
double 64 bits IEEE754 IEEE754 Double 0.0d
void - - - Void
    • 高精度数字
      • BigInteger:支持任意精度的整数,可以准确表示任何大小的整数值,不会丢失任何信息
      • BigDecimal:支持任意精度的定点数
    • 数组:
      • JAVA确保数组初始化,并且不能在其范围外访问。
      • 牺牲数组上少量的内存开销及运行时的小标检查以确保安全性和效率的提高

不销毁对象

  • 作用域:Java中作用域定义的变量只可用于作用域结束之前,一组花括号
  • Java对象作用域:Java对象new出来之后可以存活于作用域之外,引用无法使用,但是仍然继续占据内存空间
  • Java的垃圾回收器在辨别出不会再被引用的对象时自动释放内存空间

  • 字段和方法
    • 类中设置两种类型的元素:字段(数据成员),方法(成员函数)
    • 字段:任何类型对象,基本类型或对某个对象的引用(必须初始化引用)
      • 基本数据类型有默认值,防止未初始化导致的错误
      • 初始化不适用于“局部”变量,即不是某个类字段

方法,参数和返回值

  • 方法:
    • 决定了一个对象能够接受什么样的消息
    • 基本组成:名称,参数,返回值和方法体
    • 方法名和参数列表唯一标识一个方法
    • 方法只有通过对象才能被调用,且这个对象必须能执行这个方法调用
  • 参数列表
    • 定义要传递给方法什么信息
    • 必须制定每个所传递对象的类型和名字
    • 传递的实际上是引用

Java程序

  • 名字可见性:防止名字冲突,反转域名,句号是子目录的划分
  • 运用其他构件:import 导入包名;
  • static:
    • 满足方法需求:
      • 只为某特定域分配单一存储空间,不去考虑究竟要创建多少对象,或者创不创建对象
      • 方法与包含它的类不关联在一起。即没有创建对象也能调用方法(类名.方法名可调用)

注释和嵌入式文档

  • 注释文档
    • javadoc:用于提取注释的工具,查找程序内的特殊注释标签
      • 解析标签标记的信息,抽取毗邻注释的类名或方法名
      • 输出是一个HTML文件,可以用wen浏览器查看
    • 语法:
      • /** 内容 */
      • 使用doc的方式:嵌入式HTML,文档标签(@开头,置于注释行的最前面)
      • 行内文档标签:@开头,在花括号内
      • 只能为public和protected成员进行文档注释
  • 嵌入式HTML
    • javadoc通过生成的HTML文档传送HTML命令
    • 文档注释中,位于每一行开头的星号和前导空格都会被丢弃,javadoc会对所有内容重新格式化
  • 标签实例
    • @see 其他名单:引用其他类的文档
    • {@link package.class#member label}:用于行内,并且是用"label"作为超链接文本
    • {@docRoot}:产生到文件根目录的相对路径,用于文档树页面的显示超链接
    • {@inheritDoc}:从当前这个类的最直接的基类中继承相关文档到当前文档注释中
    • @version:@version version-information:获取版本信息
    • @author:@author author-information:作者信息
    • @since:指定本程序代码的早期版本
    • @param:@param parameter-name(参数列表标识符) description(描述信息的文本):
    • @return :@return description:描述返回值含义
    • @throws:@ throws full-qualified-class-name(异常类的无歧义名字) description(描述信息);
    • @deprecated:指出被新特性取代的旧特性

操作符

  • 直接常量:
    • 防止编译器产生歧义,在直接常量后面添加制度增加信息
    • L:long
    • F:float
    • D:double
    • 十六进制适用于所有整数数据类型,前缀0x,后面跟随0-9或小写a-f
    • 当你视图讲一个变量初始化成超出自身范围的值,编译器报错。超出范围,编译器会自动将值转换成int型,并通知进行了窄化转型
    • 八进制由前缀0和后续的0-7数字表示
  • 按位操作符中,布尔类型被作为单比特值对待,不能执行按位"非",对于布尔值,按位操作符合逻辑操作符具有相同效果,不会“短路”
  • 移位操作符:
    • 运算对象是二进制的“位”,针对整数类型
    • 左移位操作符:按照操作符右侧指定的位数将操作符左边的操作数向左移动(低位补0)
    • 有符号右移位操作符:
      • 符号为正,高位补0
      • 符号为负,高位补1
    • 无符号右移位操作符:高位补0
  • 类型转换:
    • 窄化转换:将能容纳更多信息的数据类型转换为容纳量较少的数据类型---->数据丢失—>显式转换
    • 扩展转换:将容纳相对少信息的数据类型转换为容纳量较大的数据类型
    • 对基本数据类型执行算术运算或按位运算,类型比int小,运算之前,会自动转换成int。需要原有数据类型,需要显式转换

控制执行流程

  • foreach:不必创建int变量去读由访问想构成的序列计数:for(数组数据类型 变量名 : 数组名){操作从数组中提取的变量}
  • 顺序的int数组:range(最大值)
  • 将String转换成字符数组:String.toCahrArray()

goto

  • 标签语法格式:lable;
  • java没有goto
  • 标签起作用的唯一地方刚好是在迭代语句之前
  • 示例
    • break:中断内部迭代,回到外循环
    • continue:跳过正在迭代的后续操作,进行接下来的内循环
    • continue label0:中断内部迭代和外部迭代,回到label0,随后继续外部迭代
    • break label0:中断所有迭代,回到label0,不再继续迭代
label0;
外循环{
    内循环{
        ...
        break;  
        ...
        continue;
        ...
        continue label0;
        ....
        break label0;
    }
}

初始化与清理

构造器确保初始化

  • Java中采用构造器名与类名相同
  • 在创建对象时,new 类名();就表示为对象分配存储空间并调用相应的构造器

方法重载

  • 方法重载:确保方法名相同,参数列表不同(参数个数或参数数据类型不同)的构造器同时存在

this关键字

  • this:在方法内使用,表示“调用方法的那个对象”
  • 在方法内部调用本类的另一个方法,可以不加this
  • 需要返回当前对象引用时,return this;
  • this可以作为实参传递给其他方法
  • 实现在一个构造器中调用另一个构造器
    • this(参数列表)—>对符合此参数列表的构造器的调用
    • 除构造器外,编译器禁止在其他方法中调用构造器。

清理

  • 垃圾回收期特殊情况:不是通过new获得的新对象,垃圾回收期不知道如何释放这个特殊的对象的内存
  • finalize()原理:一旦垃圾回收期准备好释放对象占用的存储空间,首先调用该方法,并且在下一次垃圾回收动作发生时,真正回收对象占用的内存
  • 垃圾回收器原理:
    • 对象可能不被垃圾回收
    • 垃圾回收并不等于“析构”
    • 垃圾回收只与内存有关
  • 如果程序结束,垃圾回收器一致没有释放创建的任何对象的存储空间,则随着程序退出,哪些资源全部交给操作系统
  • 垃圾回收器工作:
    • Java的堆指针简单易懂到尚未分配的区域
    • 方法
      • 引用计数:每个对象都含有一个引用计数器,当有引用连接至对象时,引用计数+1,当引用离开作用域或被置为null,引用计数-1==(缺陷:如果对象之间存在循环引用,可能会出现"对象应该被回收,但引用计数不为0的情况")==
      • 引用链条:对任何”活“的对象,一定能最终追溯到其存活在堆栈或静态存储区之中的引用。
        • Java虚拟机有一种“自适应”的垃圾回收机制。
        • 做法:“停止-复制"–先暂停程序的运行,然后将所有存活对象从当前堆赋值到另一个堆,没有被复制的都是垃圾。当对象被复制到新堆,是紧凑排列的,然后就可以直接分配新空间
        • 做法:“标记-清扫”–遍历所有引用,找出存活对象进行标记,不回收任何对象。当标记工作完成,开始清理,但剩下的堆空间不连续

初始化

  • 如果一个域是静态的基本类型域且没有初始化,就会火的基本类型的标准初值。如果是一个对象引用,默认初始化值是null
  • 没有static关键字,构造器实际也是静态方法。静态初始化只在class对象首次加载的时候进行一次
  • 当创建对象时,Java会在堆上分配足够的存储空间。这块存储空间会先清零,,所有基本数据类型设置成默认值,引用设置成null

枚举类型

  • enum关键字:
  • ordinal()方法:显示enum的声明顺序
public enum EnumTest {
	ONE,TWO,THREE,FOUR,FIVE
}

public static void main(String[] args) {
		EnumTest en = EnumTest.ONE;
		System.out.println(en);
		//one
		for(EnumTest e:EnumTest.values()) {
			System.out.println(e+".ordinal"+e.ordinal());
		}
		System.out.println(EnumTest.THREE+".ordinal"+EnumTest.THREE.ordinal());
		
		System.out.println(en.toString());
		
	}
	
结果:
ONE
ONE.ordinal0
TWO.ordinal1
THREE.ordinal2
FOUR.ordinal3
FIVE.ordinal4
THREE.ordinal2
ONE


你可能感兴趣的:(learning,diary,书籍学习,java)