head-first-java的笔记.docx_第1页
head-first-java的笔记.docx_第2页
head-first-java的笔记.docx_第3页
head-first-java的笔记.docx_第4页
head-first-java的笔记.docx_第5页
免费预览已结束,剩余9页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

在Java中不能讲integer与boolean类型相容 Java是面向对象编程语言,学会用面向对象的思考方式设计Java程序 类是对象的蓝图 main的用途:1)测试真正的类;2)启动Java应用程序; (不要用main来做面向过程的事了,这不是Java的原意) 任何变量只要加上public、static和final,基本上都会变成全局变量取用的常数 变量有两种:primitive主数据类型(保存基本数据类型的值)和引用(保存对象的引用) 变量声明的要点:变量名、变量类型 变量就像是杯子,是一种容器,承装某些事物,它有大小与类型 Primitive主数据类型: byte、short、int、long 和 float、double 对引用变量来说,变量值是取得特定对象的位表示法 对Java虚拟机来说,所有的引用大小都一样 不管数组带有什么,数组一定是对象 一旦数组被声明出来,你就只能装入所声明类型的元素 Java传参是通过值传递的 Java中要注意对类的成员变量进行封装,并使用Getter和Setter来操作。 Getter的目的只有一个,就是返回实例变量的值。Setter的目的就是要取用一个参数来设定实例变量的值 封装的基本原则:将实例变量标记为私有的(private),并提供公有的(public)getter和setter来控制存取动作 局部变量没有默认值,如果在变量被初始化前就要使用的话,编译器会显示错误。 局部变量与实例变量的差别:1)实例变量是声明在类内而不是在方法中;2)局部变量是声明在方法中的;3)局部变量在使用前必须初始化 伪码大致包括3部分:实例变量的声明、方法的声明和方法的逻辑。伪码最重要的部分是方法的逻辑 在Java的API中,类是被包装在包中的,要使用API中的类,你必须知道它被放在哪个包中。在程序的某个地方你必须要指明函数库类的完整名称,也就是包的名称加上类的名称 包的重要性:包可以帮助组织项目或函数库 、 包可以制造出名称空间,以便错开相同名称的类 、 包可以通过限制同一包之间的类才能相互存取以维护安全性 所有随附于Java的类都是放在java开头的包中,没有在标准函数库中的包,这些被称为扩展的类有两种类型:标准的和非标准的。Sun认可的称为standard extension,其余实验性质、预览版本或beta版的非标准类不一定会被认可采用。标准版的扩展都以javax作为包名称的开头。 import不会使程序变大,只是省略了在每个类前面的包名而已 java.lang是预先被引用的包,所以不必import 覆盖的意思是由子类重新定义继承下来的方法以改变或延伸此方法的行为 Public类型的成员会被继承 Private类型的成员不会被继承 继承的意义:避免了重复的程序代码 、 定义出共同的协议 继承让你可以确保某个父类型之下的所有类都会有父类型所持有的全部方法(全部可继承的方法)。 多态状态下,引用与对象可以是不同的类型。即运用多态时,引用类型可以是实际对象类型的父类,参数和返回值也可以是多态。 可用final修饰符防止类被继承,或者让类只拥有private的构造程序 Final也可用于某个方法上表示方法不能被覆盖。覆盖的规则:参数一样,返回值类型兼容 、 不能降低方法的存取权限 方法的重载:重载的意义是两个方法的名称相同,但参数不同。 重载规则:返回值类型可以不同 、 不能只改变返回值类型 、可以更改存取权限 接口是纯抽象类(无法初始化的类) , 有些类不应该被初始化 当你设计好继承结构时,你必须要决定哪些类是抽象的,而哪些事具体的。具体的类是实际可以被初始化为对象的,设计抽象类很简单,在类的声明前加上抽象类关键字abstract就好。 抽象类代表没有人能够创建出该类的实例。但还是可以使用抽象类来声明引用类型给多态使用。 抽象类除了被继承外,是没有用途的、没有值、没有目的 抽象的类代表此类必须要被extend过,抽象的方法代表此方法一定要被覆盖过,抽象的方法没有实体。 如果你声明出一个抽象的方法,就必须将类也标记为抽象的。不能再非抽象类中拥有抽象方法 抽象方法示例: public abstract void method(); Java中的所有类都是从Object这个类继承出来的 ArrayList : ArrayList类可以在其后加上尖括号,里面填入类名,限制ArrayList的存储类型。(Java 5.0 之前无法限制类型) 当某个对象是以Object类型来引用时,Java会把它当做Object类型的实例,这代表你只能调用由Object类中所声明的方法。 编译器是根据引用类型来判断有哪些method可以调用,而不是根据Object确实的类型 “多态”意味着“很多形式” 。你可以把Snowboard当做Snowboard或者Object 当你把对象装进ArrayList时,不管它原来是什么,你只能把它当做是Object。从ArrayList取出引用时,引用的类型只会是Object 。这种情况可以用类型转换将引用变量的类型转换为原有的类型,这样就可以访问原有类型的全部方法。如果不确定原有的类型是什么,可以用instanceof 判断 你只能在引用变量的类确实有该方法才能调用它 把类的共有方法当做是合约的内容,合约是你对其他程序的承诺协议 Java中采用接口(interface)来解决多重继承的问题却不会产生致命方块的问题。 接口解决致命方块的办法:把全部的方法设为抽象的! Java的接口就是一个纯抽象的类,所有接口的方法都是抽象的,意味着继承它的子类就需要覆盖所有定义的抽象方法 接口的定义:public interface name 接口的实现:public class GrandChild extends Child implements Interface1,Interface2,Interface3, 在Java中,存在对象的生存空间堆(heap)和方法调用及变量的生存空间栈(stack) 栈顶的方法是目前正在执行的方法 如果局部变量是对某一对象的引用,只有变量本身会放在栈上,对象本身只会存在堆上。 实例变量存在于对象所属的堆空间上,局部变量存在于栈空间上 构造函数带有你在初始化对象时执行的程序代码,也就是新建一个对象时就会被执行,就是你自己没有写构造函数,编译器也会帮你写一个 创建对象这一过程其实是在类外调用其构造函数,从而创建一个对象,初始化类。 构造函数名一定要与类名相同,构造函数没有返回类型 构造函数使得可以介入new方法创建对象的过程 构造函数不会被继承 一定要有不需要参数的构造方法 如果已经写了一个带参数的构造方法,则编译器不会自动帮你编写无参构造方法。只有在类中一个构造函数都不存在的情况下,编译器才会自动生成构造方法 在创建新对象时,所有继承下来的构造函数都会执行。抽象类也可以有构造函数 构造函数链:构造函数在执行的时候,第一件事就是去执行它的父类的构造函数,这会连锁反应到Object这个类 父类的部分必须在子类创建完成之前就完整地成型。子类对象可能需要用到父类继承下来的东西。所以,父类构造函数必须在子类的构造函数之前结束,对super()的调用必须是构造函数第一个语句 使用this()从某个构造函数调用同一个类的另外一个构造函数 this()只能在构造函数中,且必须是第一行语句。所以每个构造函数可以调用super()或this(),但不能同时调用 对象声明周期由其引用变量的生命周期决定 、局部变量只会存活在声明变量的方法中 、 实例变量的寿命与对象相同 引用变量只能在处于它的范围中才能被引用 当最后一个引用消失时,对象就会变成可回收的 Null是代表“空”的字节组合 Static标记出不需要类实例的方法。也即静态方法。 静态方法可以用类的名称来调用,或者创建类的实例调用。 静态方法不能调用非静态的变量:因为静态的方法是通过类的名称调用,所以静态的方法无法引用到该类的任何实例变量,在此情况下,静态的方法也不会知道可以使用哪个实例变量值。 静态方法也不能调用非静态方法 静态变量:它的值对所有的实例来说都相同(被同类的所有实例共享的变量) 静态变量会在该类的任何对象创建之前就完成初始化; 静态变量会在该类的任何静态方法执行之前就初始化 静态的final变量是常数,一个被标记为final的变量代表它一旦被初始化之后就不会改动,也就是说类加载后静态final变量就一直会维持原值(静态变量的名称大写,以下划线分隔) Final的变量代表你不能改变它的值,final的method代表你不能覆盖掉该method,final的类代表你不能继承该类 Final也可用于修饰非静态变量,都代表其值不能改动 认识Math类的一些静态方法:Math.random() 返回介于0.0 1.0之间的双精度浮点数(0 = x 1)Math.abs() 返回双精度浮点数类型参数的绝对值。这个方法有覆盖版本,传入整型会返回整型。Math.round() 根据参数是浮点或双精度浮点数返回四舍五入后的整型或长整型值Math.min() 返回两参数中较小的。有int、long、float和double的覆盖版本Math.max() 返回两参数中较大的哪一个。与min一样有覆盖版本 每一个primitive主数据类型都有个包装用的类 : Boolean , Character , Byte , Short , Integer , Long , Float , Double Java 5.0 之前的版本要以对象方式处理primitive主数据类型时,就要把它包装起来,从Java 5.0 版开始加入的autoboxing功能能够自动地将primitive主数据类型转换成包装的对象 String.format(“%. ”, data) 格式化指令 Java 5.0的新功能, import静态的类、变量或enum 。只是少打了字,但是容易引起程序混淆,在经常使用的场合用这样的方式比较适合用法 : import static pakage; try/catch块会告诉编译器你确实知道所调用的方法会有风险,并且已经准备好要处理它,它只会注意你有没有表示你会注意到异常 异常是一种Exception类型的对象 编译器会核对每件事,除了RuntimeException之外,编译器保证:1)如果你有抛出异常,则你一定要使用throw来声明这件事;2)如果你调用会抛出异常的方法,你必须得确认你知道异常的可能性。将调用包在try/catch块中是一种满足编译器的方法 不是由编译器检查的RuntimeException的子类,被称为检查异常。RuntimeException及其子类被称为不检查异常(免检异常) Finally块用来存放不管有没有异常都得执行的程序 如果有必要的话,方法可以抛出多个异常。但该方法的声明必须要有含有全部可能的检查异常(若两个或两个以上的异常有共同的父类时,可以只声明该父类就行) 为每个需要单独处理的异常编写不同的catch块 有多个catch块时要从小排到大 使用catch块时,java虚拟机只会从头开始往下找到第一个符合范围的异常处理快。如果大容量的块放在小容量的块上,那么小容量块将不会执行 不想处理异常时,把它duck掉以让调用你的方法的程序来catch该异常,只要表示出你会再throw此异常就好 方法抛出异常时,方法会从栈上立即被取出,而异常会再度丢给栈上的方法,也就是调用方,如果调用方式个ducker,这此ducker也会从栈被取出,异常再度抛给此栈上方的方法 异常处理规则:catch与finally不能没有try 、 try一定要有catch或finally 、 try与catch之间不能有程序 、 只带有finally的try必须要声明异常GUI编程开始. JFrame是个代表屏幕上window的对象,一旦创建出JFrame之后,你就可以把组件(widget)加到上面 在Java上,取得与处理用户操作事件的过程称为even-handling 监听接口是介于监听与事件源之间的桥梁 Swing的GUI组件是事件的来源,事件来源是个可以将用户操作(点击鼠标、按键、关闭窗口等)转换成事件的对象。对Java而言,事件几乎都是以对象来表示。它会是某种事件类的对象 事件源会在用户做出相关动作时产生事件对象 每个事件类型都有相应的监听者接口,想要接收MouseEvent就得实现MouseListener接口,想接收WindowEvent就得实现WindowListener。接口的规则:要实现接口就得声明这件事,这代表必须得把接口中所有的方法都实现出来(重写实现接口里的方法) 1.事件源发出事件 2.事件对象携带事件信息 3.监听获知事件 内部类:一个类可以嵌套在另一个类的内部 内部类可以使用外部所有的方法与变量,就算是私有的也一样。内部类能够自由地存取外部类的内容 *内部类的实例一定会绑在外部类的实例上 内部类只能存取它所属的那个类的方法和变量又来swing GUI程序了. 组件(component,或称元件)继承自javax.swing.JComponent 几乎所有组件都能够安置其他的组件 三大布局管理器:BorderLayout : 这个管理器会把背景组件分割成5个区域,每个被管理的区域只能放上一个组件,这是框架的默认管理器。BorderLayout布局的5个区域:东南西北中FlowLayout : 每个组件都会依照理想的大小呈现,并且会从左到右依照加入的顺序以可能会换行的方式排列。这是面板默认的布局管理器BoxLayout : 像FlowLayout一样让每个组件使用默认的大小,并且按照加入的顺序来排列,但BoxLayout是以垂直的方向来排列,不像FlowLayout会自动地换行 Java的输入/输出API带有连接类型的串流,它代表来源与目的地之间的连接,连接串流将串流与其他串流连接起来 一般来说,串流要两两连接才能做出有意义的事其中一个表示连接,另一个则是要被调用方法的。 当对象被序列化时,被该对象引用的实例变量也会被序列化。且所有被引用的对象也会被序列化 要让类能被序列化,就实现Serializable。这个接口又被称为marker或tag类的标记用接口,因为此接口并没有任何方法需要实现,唯一的目的就是声明有实现它的类是可以被序列化的。 如果某实例变量不能或不应该序列化,就把它标记为transient(瞬时)的 对象被解序列化是,Java虚拟机会通过尝试在堆上创建新的对象,让它维持与被序列化时有相同的状态来恢复对象的原对状 缓冲区能让你暂时摆放一对东西知道满为止,比不用缓冲区更有效率 BufferedWriter , BufferedReader 如果想要强制缓冲区立即写入,调用writer.flush(); 每当对象被序列化的同时,该对象(以及所有在其版图上的对象)都会被“盖”上一个类的版本识别ID,这个ID被称为serialVersionUID,它是根据类的结构信息计算出来的。有网络了. 要建立socket连接,你得知道两项关于服务器的信息:它在哪里以及用哪个端口来收发数据 。 也就是说IP地址与端口号 要连接到其他机器上,我们会需要socket的连接。Socket是个代表两台机器之间网络连接的对象(.Socket)。连接最重要的是两者知道如何与对方通信。 Socket连接的建立代表两台机器之间存有对方的信息,包括网络地址和TCP的端口号 TCP端口号只是一个16位宽,用来识别服务器上特定程序的数字 从0 1023的TCP端口号是保留给已知的特定服务使用的, 1024 65535可以自由分配使用 Java的大部分输入/输出工作并不在乎连接串流的上游实际上是什么。 Socket soc = new Socket(“”,port); InputStreamReader isr = new InputStreamReader(soc.getInputStream(); BufferedReader reader = new BufferedReader(isr); Socket soc = new Socket(“”, 5000); PrintWriter writer = new PrintWriter(soc.getOutputStream(); 编写服务器端程序需要一对Socket。一个等待用户请求的ServerSocket以及一个与用户通信用的Socket ServerSocket serverSock = new ServerSocket(port);线程是独立的线程,它代表独立的执行空间。Thread是Java中用来表示线程的类要建立线程就得创建Thread线程要记录的一项事物是目前线程执行空间做到哪里 每个Thread需要一个任务来执行,一个可以放在执行空间的任务 Runnable带有会放在执行空间的第一项方法:run() Runnable这个接口只有一个方法:public void run() Thread对象需要任务,任务是线程在启动时去执行的工作,该任务是新线程空间上的第一个方法,且一定是这样:public void run() 一旦线程进入可执行状态,它会在可执行与执行中两种状态中来来去去,同时也有另外一种状态:暂时不可执行(又称为被堵塞状态) 线程调度器会决定哪个线程从等待状态中被挑出来运行,以及何时把哪个线程送回等待被执行的状态。它会决定某个线程要运行多久,当线程被踢出时,调度器也会指定线程要回去等待下一个机会或者是暂时地阻塞。 如果想要确保其他的线程有机会执行,就把线程放进睡眠状态。调用sleep()方法,传入以毫秒指定的时间,这回让线程在指定时间内不会醒来进入可执行状态,有可能会抛出InterruptedException。线程醒来后会进入可执行状态等待被调度器跳出来执行 并发性问题: 两个或以上的线程存取单一对象的数据,也即两个不同执行空间上 的方法都在堆上对同一个对象执行getter或setter 使用synchronized这个关键字来修饰方法使它每次只能被单一的线程存取。要保护数据,就把作用在数据上的方法给同步化 同步化的目标是保护重要数据,但锁住的不是数据而是存取数据的方法 每个Java对象都有一个锁,每个锁只有一把钥匙。通常对象都没上锁,也没有人在乎这件事。但如果对象有同步化的方法,则线程只能在取得钥匙的情况下进入线程。也就是说并没有其他线程已经进入的情况下才能进入 一旦线程进入了方法,我们必须去报在其他线程可以进入该方

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论