java基础(总结Head First Java一书)
java程序代码运行过程:
源代码.java——》编译器——》输出.class字节码文件——》java虚拟机读取与执行
类与对象
类是创建对象的模型,所有的java程序都定义在类中
对象包括变量和方法
变量有两种:主数据类型和引用(遥控器)
方法:可以传实参,传入后变为形参,可以在方法内运用但方法无法改变调用方所传入的参数(java是通过值传递的,即拷贝)
面向对象
封装 :将实例变量私有化,并提供公开的getter和setter来控制存取动作
实例变量:声明在类中 永远都会有默认值
局部变量:声明在方法中 没有默认值(所以使用之前必须要初始化,否则无法编译)
变量的比较:==比较两个主数据类型或者两个引用是否引用同一个对象;equals判断两个对象是否在意义上相等
多态 (继承的基础上) :
Animal mydog = new Dog(); 对象多态,参数和返回类型也可以多态
方法的重写(覆盖),方法的覆盖
接口是多态和Java的重点(类似100%纯天然抽象类)
先叙述下抽象类为什么出现:当有些类不应该被初始化(不让这个类被new出来),通过标记为抽象类
eg:Animal a = new Animal() 错误,没有animal这个动物
抽象类:abstract class Animals{ } 必须要被继承过
抽象方法:public abstract void eat(); 必须要被覆盖过 只能在抽象类中
接口出现:java不允许多继承,会有致命方块问题(若一个类同时继承两个父类,到底实现谁的方法)用接口解决多重继承
public class Dog extends Animal implements Pet{ } (宠物)
内存 (程序运行空间)
当java虚拟机启动时,他会从底层的操作系统取得一块内存,并以此区段来执行Java程序
栈:方法调用和局部变量
堆:所有的对象(包括实例变量)
修饰符 static与final
静态变量是共享的(每个类一个),类加载时初始化
静态方法直接用类名称调用,不能存取非静态的方法
静态的final变量是常数
final的变量代表不能改变它的值;final的方法代表不能覆盖掉改method;final的类代表不能被继承
对象序列化与解序列化(即存储与读取对象的状态)
用相关流以及连接流写与读,涉及到的流:FileOutputStream,ObjectOutputStream(中间件过渡作用)
——》文本数据的写入与读取类似,涉及到的流:FileWriter(省去了中间件),BufferedWriter(增加缓存功能,提高效率)
Buffered 缓存区,可以暂存一堆数据,满时再实际写入磁盘,如果强制缓冲区立即写入,调用writer.flush()
——》网络socket连接与文本数据的读写类似,涉及到的流:BufferedReader,printWriter
网络联机 从服务器读取server—socket输入流—》InputStreamReader——》BufferedReader——》client
向服务器上写client——》printWriter——》socket输出——》server
流的功能:socket(从socket取得低层串流)——》InputStreamReader——》BufferedReader(高层串流)
printWriter相当于后两者合并,转换字节为字符
网络联机后的多线程 eg:发送聊天信息的同时也能收到信息(及时)
Thread是java.lang.Thread这个类,它的对象是用来表示一个线程
——》同时Thread需要一个任务,即实现过Runnable的实例(Runnable接口只有一个方法run())
——》要把runnable传给Thread的构造函数才能启动新的线程
调度器将线程关进去一段时间的情况:线程本身要求sleep();线程调用某个被锁住的对象的方法(clocked);线程执行到等 待socket输入串流的程序段,但没有数据可供读取
并发性问题:
两个或以上的线程存取单一对象的数据(取钱)
解决方法:synchronized关键词代表线程需要一把钥匙来存取被同步化的线程,要保护数据,就把作用在数据上的方法给同步化
数组与集合
数组也是对象(可以被声明来承载主数据类型或对象引用(遥控器))
在int类型的数组中,每个元素可以装载一个int;而引用类型的数组中,只会保存引用而不是对象本身,,,一旦数组被声明出来,你就只能装入所声明类型的元素
缺点:数组无法改变大小,无法删除元素,无法调用方法等,最多只能存取他的length实例变量
引出集合ArrayList 扩大了数组的功能,也是一个对象,只有在运用主数据类型时数组比集合快
ArrayList只能携带对象而不能带主数据类型,但编译器可以自动将主数据类型包装成object以存放在ArrayList中
List:对付顺序的好帮手 ArrayList LinkedList
Set:注重独一无二的性质 TreeSet(以有序状态保持并可防止重复):
HashSet(防止重复的集合,可快速找寻相符的元素):通过hashCode()与equals()检查重复
Map:用key来搜索的专家 HashMap(可用成对的name/value来保存和取出)
LinkedHashMap(类似HashMap,但可记住元素插入顺序,也可设定成按照元素上次存取的先后来排序)