headfirstjava的笔记讲解学习.docx

上传人:b****9 文档编号:25319490 上传时间:2023-06-07 格式:DOCX 页数:30 大小:4.29MB
下载 相关 举报
headfirstjava的笔记讲解学习.docx_第1页
第1页 / 共30页
headfirstjava的笔记讲解学习.docx_第2页
第2页 / 共30页
headfirstjava的笔记讲解学习.docx_第3页
第3页 / 共30页
headfirstjava的笔记讲解学习.docx_第4页
第4页 / 共30页
headfirstjava的笔记讲解学习.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

headfirstjava的笔记讲解学习.docx

《headfirstjava的笔记讲解学习.docx》由会员分享,可在线阅读,更多相关《headfirstjava的笔记讲解学习.docx(30页珍藏版)》请在冰豆网上搜索。

headfirstjava的笔记讲解学习.docx

headfirstjava的笔记讲解学习

在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认可的称为standardextension,其余实验性质、预览版本或beta版的非标准类不一定会被认可采用。

标准版的扩展都以javax作为包名称的开头。

import不会使程序变大,只是省略了在每个类前面的包名而已

java.lang是预先被引用的包,所以不必import

覆盖的意思是由子类重新定义继承下来的方法以改变或延伸此方法的行为

Public类型的成员会被继承

Private类型的成员不会被继承

继承的意义:

避免了重复的程序代码、定义出共同的协议

继承让你可以确保某个父类型之下的所有类都会有父类型所持有的全部方法(全部可继承的方法)。

多态状态下,引用与对象可以是不同的类型。

即运用多态时,引用类型可以是实际对象类型的父类,参数和返回值也可以是多态。

可用final修饰符防止类被继承,或者让类只拥有private的构造程序

Final也可用于某个方法上表示方法不能被覆盖。

覆盖的规则:

参数一样,返回值类型兼容、不能降低方法的存取权限

方法的重载:

重载的意义是两个方法的名称相同,但参数不同。

重载规则:

返回值类型可以不同、不能只改变返回值类型、可以更改存取权限

接口是纯抽象类(无法初始化的类),有些类不应该被初始化

当你设计好继承结构时,你必须要决定哪些类是抽象的,而哪些事具体的。

具体的类是实际可以被初始化为对象的,设计抽象类很简单,在类的声明前加上抽象类关键字abstract就好。

抽象类代表没有人能够创建出该类的实例。

但还是可以使用抽象类来声明引用类型给多态使用。

抽象类除了被继承外,是没有用途的、没有值、没有目的

抽象的类代表此类必须要被extend过,抽象的方法代表此方法一定要被覆盖过,抽象的方法没有实体。

如果你声明出一个抽象的方法,就必须将类也标记为抽象的。

不能再非抽象类中拥有抽象方法

抽象方法示例:

publicabstractvoidmethod();

Java中的所有类都是从Object这个类继承出来的

ArrayList

ArrayList类可以在其后加上尖括号<>,里面填入类名,限制ArrayList的存储类型。

(Java5.0之前无法限制类型)

当某个对象是以Object类型来引用时,Java会把它当做Object类型的实例,这代表你只能调用由Object类中所声明的方法。

编译器是根据引用类型来判断有哪些method可以调用,而不是根据Object确实的类型

“多态”意味着“很多形式”。

你可以把Snowboard当做Snowboard或者Object

当你把对象装进ArrayList时,不管它原来是什么,你只能把它当做是Object。

从ArrayList取出引用时,引用的类型只会是Object。

这种情况可以用类型转换将引用变量的类型转换为原有的类型,这样就可以访问原有类型的全部方法。

如果不确定原有的类型是什么,可以用instanceof判断

你只能在引用变量的类确实有该方法才能调用它

把类的共有方法当做是合约的内容,合约是你对其他程序的承诺协议

Java中采用接口(interface)来解决多重继承的问题却不会产生致命方块的问题。

接口解决致命方块的办法:

把全部的方法设为抽象的!

Java的接口就是一个纯抽象的类,所有接口的方法都是抽象的,意味着继承它的子类就需要覆盖所有定义的抽象方法

接口的定义:

publicinterfacename{…}

接口的实现:

publicclassGrandChildextendsChildimplementsInterface1,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

Java5.0之前的版本要以对象方式处理primitive主数据类型时,就要把它包装起来,从Java5.0版开始加入的autoboxing功能能够自动地将primitive主数据类型转换成包装的对象

String.format(“%...”,data)格式化指令

Java5.0的新功能,import静态的类、变量或enum。

只是少打了字,但是容易引起程序混淆,在经常使用的场合用这样的方式比较适合

用法:

importstaticpakage;

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.监听获知事件

内部类:

一个类可以嵌套在另一个类的内部

内部类可以使用外部所有的方法与变量,就算是私有的也一样。

内部类能够自由地存取外部类的内容

*内部类的实例一定会绑在外部类的实例上

内部类只能存取它所属的那个类的方法和变量

又来swingGUI程序了…..

组件(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的大部分输入/输出工作并不在乎连接串流的上游实际上是什么。

Socketsoc=newSocket(“127.0.0.1”,port);

InputStreamReaderisr=newInputStreamReader(soc.getInputStream());

BufferedReaderreader=newBufferedReader(isr);

Socketsoc=newSocket(“127.0.0.1”,5000);

PrintWriterwriter=newPrintWriter(soc.getOutputStream());

编写服务器端程序需要一对Socket。

一个等待用户请求的ServerSocket以及一个与用户通信用的Socket

ServerSocketserverSock=newServerSocket(port);

线程是独立的线程,它代表独立的执行空间。

Thread是Java中用来表示线程的类

要建立线程就得创建Thread

线程要记录的一项事物是目前线程执行空间做到哪里

每个Thread需要一个任务来执行,一个可以放在执行空间的任务

Runnable带有会放在执行空间的第一项方法:

run()

Runnable这个接口只有一个方法:

publicvoidrun()

Thread对象需要任务,任务是线程在启动时去执行的工作,该任务是新线程空间上的第一个方法,且一定是这样:

publicvoidrun(){…}

一旦线程进入可执行状态,它会在可执行与执行中两种状态中来来去去,同时也有另外一种状态:

暂时不可执行(又称为被堵塞状态)

线程调度器会决定哪个线程从等待状态中被挑出来运行,以及何时把哪个线程送回等待被执行的状态。

它会决定某个线程要运行多久,当线程被踢出时,调度器也会指定线程要回去等待下一个机会或者是暂时地阻塞。

如果想要确保其他的线程有机会执行,就把线程放进睡眠状态。

调用sleep()方法,传入以毫秒指定的时间,这回让线程在指定时间内不会醒来进入可执行状态,有可能会抛出InterruptedException。

线程醒来后会进入可执行状态等待被调度器跳出来执行

并发性问题:

两个或以上的线程存取单一对象的数据,也即两个不同执行空间上的方法都在堆上对同一个对象执行getter或setter

使用synchronized这个关键字来修饰方法使它每次只能被单一的线程存取。

要保护数据,就把作用在数据上的方法给同步化

同步化的目标是保护重要数据,但锁住的不是数据而是存取数据的方法

每个Java对象都有一个锁,每个锁只有一把钥匙。

通常对象都没上锁,也没有人在乎这件事。

但如果对象有同步化的方法,则线程只能在取得钥匙的情况下进入线程。

也就是说并没有其他线程已经进入的情况下才能进入

一旦线程进入了方法,我们必须去报在其他线程可以进入该方法之前所有的步骤都会完成。

将方法同步化(synchronized)可以解决丢失更新问题

几种集合:

TreeSet(以有序状态保持并可防止重复)、HashMap(可用成对的name/value来保存与取出)、LinkedList(针对经常插入或删除中间元素所涉及的高效率集合)、HashSet(防止重复的集合,可快速地找寻相符的元素)、LinkedHashMap(类似HashMap,但可记住元素插入的顺序,也可以设定成依照元素上次存取的先后来排序)

把字符串放进TreeSet,这些String会自动地按照字母顺序排在正确的位置

在Java程序或文件中看到<>这一组符号,就代表泛型正在作用—它是一种从Java5.0开始加入的特质

泛型意味着更好的类型安全性(大多用在与处理集合有关)

泛型重点:

1)创建被泛型化类的实例;2)声明与指定泛型类型的变量;3)声明(与调用)取用泛型类型的方法

把E想做是“集合所要维护和返回的元素类型”(E代表Element,是类型参数),E部分会用你所声明与创建的真正类型来取代

泛型的类代表类的声明用到类型参数。

泛型的方法代表方法的声明特征用到类型参数

对泛型来说,extends代表extend或implement,适用于类和接口

Collection中的3个主要接口:

LIST:

是一种知道索引的集合。

List知道某物在系列集合中的位置。

可以有多个元素引用相同的对象

SET:

注重独一无二的性质,不允许重复的集合。

它不会有多个元素引用相同对象。

MAP:

用key搜索,使用成对的键值和数据值。

Map会维护与key有关联的值,两个key可以引用相同的对象,但key不能重复。

对象相等:

equals()方法返回true,并且两者的hashCode()返回相同的值

使用TreeSet的条件(有一项必须为真):

集合中的元素必须是有实现Comparable的类型

使用重载、取用Comparator参数的构造函数来创建TreeSet

Map中的元素实际上是两个对象,关键字和值。

值可以重复,但是key不行

展开阅读全文
相关搜索

当前位置:首页 > 高中教育 > 理化生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1