文章目录
类与对象的关系
初始化 构造器
this 关键字
static 的含义
清理:终结处理和垃圾回收
自适应垃圾回收技术
堆、栈、方法区、常量池、静态区
面向对象
实用类
IO流
多线程
类与对象的关系
类是对象的概括,对象是类的具体体现
根据一类对象进行概括,将对象的特征概括为属性,将对象的行为概括为方法,将这一类对象用一个类表示 — 类是对象的概括/抽取
通过new关键字来创建这个对象,然后可以给对象中的属性赋值,也可以调用方法
初始化 构造器
在Java中,通过提供构造器,类的设计者可以确保每个对象都会得到初始化。创建对象时,如果其类具有构造器,Java就会在用户有能力操作对象之前自动调用相应的构造器,从而保证了初始化的进行。
构造器的名称必须与类名完全相同。不接受任何参数的构造器叫做无参构造,和其他方法一样。构造器也能带有形式参数,以便指定如何创建对象。
构造器有助于减少错误,并使代码更易于阅读。从概念上讲,“初始化”与“创建”是彼此独立的,但在Java中,“初始化”和“创建”捆绑在一起,两者不能分离。
构造器是一个特殊类型的方法,因为它没有返回值。
this 关键字
this关键字只能在方法内部使用,表示对“调用方法的那个对象”的引用。
但要注意的是,如果在方法内部调用同一个类的另一个方法,就不必使用this,直接调用就可以。
可能为一个类写了多个构造器,有时可能想在一个构造器中调用另一个构造器,以避免重复代码。可以用this关键字做到这一点。
static 的含义
static(静态)方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来倒是可以的。
而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。这实际上正是static方法的主要用途。它很像全局方法。Java中禁止使用全局方法,但你在类中置入static方法就可以访问其他static方法和static域。
清理:终结处理和垃圾回收
在Java中,有垃圾回收器负责回收无用对象占据的内存资源。但也有特殊情况:假定你的对象(并非使用new)获得了一块“特殊”的内存区域,由于垃圾回收器只知道释放那些由new分配的内存,所以它不知道该如何释放该对象的这块“特殊”内存。
为了应对这种情况,Java允许在类中定义一个名为finalize()的方法。
它的工作原理“假定”是这样的:一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。
所以要是你打算用finalize(),就能在垃圾回收时刻做一些重要的清理工作,我们需要记住以下三点。
- 对象可能不被垃圾回收
- 垃圾回收并不等于“析构”
- 垃圾回收只与内存有关
从第三点,我们不难看出使用垃圾回收器的唯一原因是为了回收程序不再使用的内存。所以对于垃圾回收有关的任何行为来说(尤其是finalize()方法),它们必须同内存及其回收有关。
自适应垃圾回收技术
垃圾回收器并非基于引用计数计数,它的依据思想是:对任何活的对象,一定能最终追溯到其存活在栈空间或静态存储区之中的引用,这个引用链条可能会穿过数个对象层次,由此,如果从栈和静态存储区开始,遍历所有的引用,就能找到所有活的对象,对于发现的每个引用,必须追踪他所引用的对象,然后是此对象包含的所有引用,直到所形成的网络全部被访问为止
在上述方式下,采用自适应垃圾回收技术,至于如何处理找到的存活对象。取决于不同JVM实现。有一种做法叫
停止-复制
找到的活对象先暂停程序的运行,然后将所有的存活对象从当前堆复制到另一个堆,没有被复制的全部都是垃圾,当对象被复制到新的堆时,他们是一个挨着一个,所以新堆保持进奏排列,直接分配了新空间
但是复制回收器回造成内存浪费为了避免这种情况,JVM就会进行检查:要是没有新垃圾产生,就会转到另一种工作模式
标记-清扫
标记清扫同样是从栈和静态存储区出发,遍历所有的引用,找到所有存活的对象,每当他找到一个存活的对象,就会给对象设一个标记,只有全部标记工作完成的时候,清理才会开始,没有标记的对象将被释放,不会发生复制动作,所以剩下的堆空间是不连续的,垃圾回收器是希望得到连续的空间,就必须重新整理剩下的对象。标记清扫工作也必须在程序暂停的情况下进行
内存分配单位:“块”
如果对象较大,他会占用单独的块,每个块有相应的代数,来记录他是否存活,如果块在某处被引用,其代数回增加,垃圾回收器会定时进行完整的清理动作,大型对象不会被赋值(其代数会增加),内含小型对象的块则被复制并整理。
自适应 分代的 停止-复制 标记-清扫 垃圾回收器
整体工作流程:如果所有对象都很稳定,垃圾回收效率低则切换到标记-清扫方式,要是堆空间出现很多碎片就会切换回停止-复制方式,这就是自适应技术。
gc垃圾回收器:无引用对象,死栈、运行结束的内存回收、线程的内存回收等
堆、栈、方法区、常量池、静态区
面向对象
OOA 分析、OOD 设计、OOP 编程
封装:
- 狭义封装:属性封装(属性私有化,提供getter、setter或者有参构造) - 广义封装:私有化方法、私有化构造(单例模式、工厂模式)、私有化类 - 目的:保护成员 同时提供统一的接口
继承:
extends/implements 前提:满足相互联系(is a)/(has a) 目的:提高代码重用性,减少代码量 接口:满足条件(has a) 目的:约定大于实现,面对修改关闭,面对约定放开
多态:
类型的多态:子类对象引用分类类型
(List list = new ArrayList();) public Pet getPet(int num){ if(num==1) return new Dog(); if(num==2) return new Cat(); }
方法的多态:
重载、重写
实用类
String、StringBuffer、StringBuilder、Math、Random、Date、包装类
String 长度不可变、final char[] ; String s = '' "+基本类型的变量 String s = "dfe"+"abc"; // String s = ''dfeabc"; s+="123"; // StringBuffer.append("123"); StringBuffer 线程安全 ,速度相对慢; StringBuilder 单线程 ,不安全,速度相对快。
IO流
IO流
IO流分类:IO异常 字节流: InputStream: OutputStream: 字符流: Reader: Writer
常用IO流和应用场景 InputStream: FileInputStream: File对象(路径) 创建FileInputStream对象fis的时候(file) fis.read() Object obj = null; while((obj=fis.read())!=null){sout(obj);} BufferedInputStream 与正常的InputStream没有本质的区别,只是提供了缓冲区 DataInputStream 二进制,主要用来读取图片,音频等,速度最慢 ObjectInputStream 需要传输的对象的类型必须要实现Serizlizable接口 OutputStream: Reader: InputStreamReader 转换流,主要用于转换字节流和字符流 BufferReader 一次读一行 FileReader Writer flush(); close;
多线程
几种实现方式:
- 继承Thread类 :重写run()方法
- 实现Runnable接口:重写run()方法
- 实现Callable接口:重写run()方法 // 有返回值,可以获取线程id