CH8 深入多态(接口与抽象类)
1.继承只是开始,要使用多态,还需要接口,接口是多态和Java的重点。
2.当设计好继承结构时,必须要决定哪些类是抽象的哪些类是具体的;具体的类是可以被初始化为对象的;抽象的类不能创建任何类型的实例不被初始化,设计抽象的类—在类的声明前面加上抽象类关键词abstract。
3.抽象类除了被继承过之外,是没有用途、没有值、没有目的。不是抽象的类就被称为具体类。
4.抽象的方法:除了类之外,也可将方法标记为abstract,抽象的方法没有实体。抽象的类代表此类必须要被extend过,抽象的方法代表此方法一定要被覆盖过。
如果声明出一个抽象的方法,就必须将类也标记为抽象的。不能在非抽象类中有抽象方法。
抽象方法的意义:就算无法实现出方法的内容,但还是可以定义出一组子型共同的协议。
5.Object的这个类是所有类的源头,它是所有类的父类,它不是抽象类。没有直接继承过其他类的类会是隐含的继承对象。
Object类主要目的:A.作为多态让方法可以应付多种类型的机制;B.提供Java在执行期对任何对象都有需要的方法的实现程序代码(让所有的类都会继承到 )。
6.使用Object类型的多态引用时是会付出代价的,任何从ArrayList<Object>取出的东西都会被当作Object类型的引用而不管它原来是什么。把所有东西都以多态来当作是Object会让对象看起来失去了真正的本质。
当一个对象被声明为Object类型的对象所引用时,它无法在赋值给原来类型的变量。
7.编译器是根据引用类型来判断有哪些method可以调用,而不是根据Object确定的类型。
8.对象会带有从父类继承下来的所有东西。
9.
10.Java注重引用变量的类型。只能在引用变量的类确实有该方法才能调用它。把类的公有方法当作是合约的内容,合约是你对其他程序的承诺协议。
11.接口可以用来解决多重继承问题却又不会产生致命方块这种问题。
接口解决致命方块的办法:把全部的方法设为抽象的,所以任何类都必须实现这些方法。
12.接口的定义及实现:
注意:A.接口的方法一定是抽象的,所以必须以分号结束,同时他们没有内容。B.implements后面跟着接口的名称。
13.为什么要用接口:接口有无比适应性,以接口取代具体的子类或抽象的父类作为参数或返回类型,就可以传入任何有实现该接口的东西。使用接口可以继承超过一个以上的来源,可以为不同需求组合出不同的继承层次。
14.不同继承树的类也可以实现相同的接口;用接口来作为多态类型时,对象就可以来自任何地方了。类可以实现多个接口。
15.extend只能有一个,implement可以有好多个。类来自单亲家庭,但可以扮演多重角色。
16.如何判断应该是设计类、子类、抽象类或接口:
17.调用父类的方法:super关键词是用来引用父类对象。
18.要点总结:
对象如何创建、存在于何处、保存和抛弃
堆、栈、范围、构造器、超级构造器、空引用等
1.内存中的两种区域:堆与栈。
对象的生存空间→堆(可垃圾回收的堆);变量→看是哪种变量(不是看类型,看是实例变量还是局部变量),a.局部变量和方法调用→栈;b.实例变量→对象所属的堆空间上。
2.方法会被堆在一起,栈顶上方法是目前正在执行中的。
3.不论对象是在哪里声明的,它总是运行在堆上。
4.要点总结:
5.对象的实例变量的值是存放于该对象中,Java会留下引用量而不是对象本身所用到的空间。
6.创建对象时,
有一个构造函数,它不是方法,它与方法的区别在于方法有返回类型,而构造函数没有返回类型。构造函数不会被继承。
构造函数是你在初始化对象时会执行的程序代码。也就是新建一个对象时就会被执行。就算自己没写构造函数,编译器也会帮你写一个;但如果你已经写了一个有参数的构造函数,且你需要一个没有参数的构造函数,那么必须自己手写完。
唯一能调用构造函数的办法就是新建一个类。
构造函数有一关键特征:它会在对象能够被赋值给引用之前就执行,让你有机会可以介入new的过程。
7.使用构造函数来初始化Duck的状态的方法:把初始化的程序代码放在构造函数中,然后把构造函数设定成需要参数的。一定要有不需要参数的构造函数。
8.如果类有一个以上的构造函数,则参数一定要不一样,参数的顺序和类型不一样就可以,这叫作重载过的构造函数。
9.要点总结:
10.调用父类构造函数的唯一方法是调用super(),如果没有调用,编译器会自动加上super()的调用。
父类的构造函数必须在子类的构造函数之前结束,对象的父类部分必须先完备子类才能创建。对super()的调用必须是构造函数的第一个语句。
11.从某个构造函数调用重载版的另一个构造函数,每个构造函数可以选择调用super()或this(),但不能同时调用。
12.对象的存活时间:A.局部变量只会存活在声明该变量的方法;B.实例变量的寿命与对象相同,若对象还活着,则实例变量也会活着。
13.局部变量只能在声明它的方法在执行中才能被使用。引用变量只能在处于它的范围中才能被引用;只要有活着的引用,对象也就会活着。
14.3种释放对象的引用的方法:
CH10 数字很重要(数字与静态)
1.在Math这个类中的所有方法都不需要实例变量值。因为这些方法都是静态的,所以你无需Math的实例。你会用到的只有它的类本身。
Math防止被初始化的方法:让构造函数标记为私有,所以就无法创建Math的实例。
2.只要有main()的类都算有静态的方法。静态的方法不能调用非静态的变量,静态的方法是在无关特定类的实例情况下执行的。如果在静态的方法内使用实例变量,静态的方法无法看到实例变量的状态。静态的方法也不能调用非静态的方法,非静态的方法通常是以实例变量的状态来影响该方法的行为。
3.静态变量的值对所有的实例来说都相同。
4.静态变量是共享的,同一类所有的实例共享一份静态变量。
实例变量:每个实例一个
静态变量:每个类一个
5.静态变量是在类被加载时初始化的,它会在该类的任何对象创建之前、任何静态方法执行之前就初始化。
6.静态的final变量是常数,常数变量的名称应该要都是大写字母。
7.静态final变量的初始化:
8.final不只用在静态变量,也可修饰非静态变量(实例变量、局部变量、方法的参数)。
9.要点总结:
10.数字的格式化结构:a.格式指令;b.要格式化的值。
“格式化说明”的格式:(数字、日期)
在格式化指令中一定要给类型,如果还要指定其他项目的话,要把类型摆在最后。
多个参数时:
11.运用Calendar对象:a.字段会保存状态;b.日期和时间可以运算;c.日期与时间可以用millisecond来表示。
Calendar API的精华
CH11 有风险的行为(异常处理)
1.
2.要点总结:
3.异常处理规则:
4.JavaSound
MidiEvent ,Message是执行的内容,MidiEvent是执行的时机。
CH14 保存对象(序列化和文件的输入/输出)
1.对象可以被序列化也可以展开。行为存在于类中,而状态存在于个别的对象中。
2.存储状态的选择看如何使用存储下来的状态而决定。A.用序列化;B.写一个纯文本文件。
3.将对象序列化存储的方法步骤:
4.数据在串流(Stream)中移动。串流必须要连接到某处才能算是个串流,Stream是连接串流或是链接用的串流。
连接串流用来表示源或目的地、文件、网络套接字连接。
链接用串流用来衔接连接串流。
带有连接类型的串流,它代表来源与目的地之间的连接,连接串流将串流与其他串流连接起来。
5.序列化程序会将对象版图上的所有东西存储起来。被对象的实例变量所引用的所有对象都会被序列化。
整个对象版图都必须正确序列化,不然就得全部失败。
如果某实例变量不能或不应该被序列化,就把它标记为transient(瞬时)的。
6.Serializable接口又称marker或tag类的标记用接口,此接口并没有方法需要被实现,只是用来声明有实现它的类是可以被序列化的。如果某类是可序列化的,则它的子类也可以自动地可以序列化。
7.一个不能序列化的类,如果该类是可以被继承(没有被标记为final),就可以制作出可被序列化的子类。
8.解序列化:还原对象。
9.静态变量不会被序列化,因为static代表“每个类一个”而不是“每个对象一个”。当对象被还原时,静态变量会维持类中原本的样子,而不是存储时的样子。xia
10.对象的序列化要点总结:
11.写入文本数据(字符串)与写入对象很类似。
文本文件范例:e-Flashcard
12.Quiz Card Builder(程序代码大纲)
13.File这个类代表磁盘上的文件,但并不是文件中的内容。它并没有读写文件的方法。其功能是提供一种比使用字符串文件名来表示文件更安全的方式。
14.
连接到外面的世界,向外扩展并触及其他计算机上的程序。
1.Socket是个代表两台机器之间网络连接的对象。要创建Socket连接得知道IP地址与端口号。
2.TCP端口只是一个16位宽、用来识别服务器上特定程序的数字。
3.不同程序不可以共享一个端口。
4.用BufferedReader从Socket上读取数据,用串流来通过Socket连接来沟通:
5.用PrintWriter写数据到Socket:
6.要点总结:
7.如何让服务器能够同时处理多个用户:使用不同的线程并让新的客户端取得新的线程。
Java有多个线程但只有一种Thread类。
线程是独立的线程,它代表独立的执行空间。Thread是Java中用来表示线程的类。要建立线程就得创建Thread。