Java4Android之复用类

本节内容是对《Thinking in Java》中第七章 复用类的笔记和总结

1 , 复用现有的代码而不去破坏现有的代码,有两种方法:组合和继承。

2,toString()方法。在类需要转变成String对象的时候,就会调用该函数。例如有个A类的对象a , A a ;然后有语句 ”object:“+a;这时候其实是"object:"+a.toString();

3,惰性初始化。成员的初始化有很多种,我们在之前的学习中知道,如果是基本数据类型没有初始化,则会被初始化一个默认的纸,例如int的会被初始化为0;而如果是对象引用,则会被初始化为null。在定义处的初始化要比构造函数的初始化还要早,但它只能实现千遍一律的初始化。静态成员的初始化是在类加载的时候就初始化了,这个更早。对初始化代码还可以用花括号独立起来,这个和在定义处初始化是一个效果。而惰性初始化是”在你要用到该成员的时候,初始化,然后再使用“。这种延缓的初始化往往可以减少负担。因为需要才初始化嘛。

4,Java中类的继承是通过extends来实现的,继承后的派生类拥有基类的所有成员和方法。

5,每个类都可以配备一个public static void main(String[] args)方法,可方便单元测试。多个类同时拥有main函数也是没有问题的,只有命令行调用的那个main函数才会被执行。还有就算类是四有类,它的main函数也是可以被任意调用的。
6,想调用基类的成员,需要通过super.xxx();否则如果在xxx()中再掉xxx()则是递归,很明显你不是这个意思吧。

7,当创建一个导出类的对象时,该对象包含了一个基类的子对象。这个子对象与你用基类直接创建的对象是一样的。

8,带参数的构造器。

如果没有默认的基类构造器,或者想调用一个带参数的基类构造器,就必须用关键字super显式的编写调用基类构造器的语句,并且配以适当的参数列表。调用基类构造器必须是你导出类构造器要做的第一件事情(除你调用this调用其他自己构造其外)。

9,代理。代理是继承和组合之间的中庸之道。因为我们将一个成员对象置于所要构造的类中(就像组合),但与此同时我们在新类中暴露该类成员对象的所有方法(就像继承)。

10,名称屏蔽。注意区分C++和Java对重载和覆写的不同处理。Java中一般都是重载,如果非得覆写,注意在函数前面加上@Override,则会覆写基类的函数。否则都是重载。

11,在组合和继承之间选择。组合和继承都是在新的类中放置子对象,组合是显式的这么做,而继承是隐式的。如何选择?组合技术常用于在新类中是有现有类的功能而非它的接口。即,在新类中嵌入某个对象,让其实现所需要的功能,但新类的用户看到的只是新类定义的接口,而非嵌入对象的接口。这个时候,一般在新类中嵌入一个现有类的private对象。但有时候也可以是public(很少),public意味这外部可以访问该成员,可能是为了便于理解吧。

在继承的时候,使用某个现有的类,并开发一个它的特殊版本。

12,protected关键字

“就用户而言,这是private的,但对于继承于此类的导出类或者其他任何位于同一个包内的类来说,它却是可以访问的”。

在设计上,最好的方式还是将域保持为private,你应该一直保留“更改底层实现”的权利,然后通过protected方法来控制类的继承者的访问权限。

13,向上转型

“为新的类提供方法”并不是继承技术中最重要的方面,其最重要的方面是用来表现新类和基类之间的关系。这种关系可以用“新类是现有类的一种类型”来概括。为什么叫向上转型,因为之前的类图结构总是把基类放到上面,所以就习惯了。向上转型是将一个较为专用的类型向较为通用的类型转换,所以总是很安全的。导出类是基类的一个超类,因为它总是包含了基类的所有,同时还可能拥有更多的方法和域。

如果某个方法为private,那它就不是类 的接口一部分。也就是向上转型的时候调不到它的。

14,final关键字

final可以修饰数据,修饰方法,类。

1)final数据。final修饰变量是使得其不会改变,类似于C++的常量,static final经常这样用,表示只有一份内存。final修饰的域不一定要在定义处初始化,可以在要用的时候初始化,这种叫“空白 final”有点类似于惰性初始化。初始化之后就改变不了它了。final修饰的引用表示你不能将该引用指向新的对象,但是对象本身的数据却还是可以变化的。final参数是指你不能在这个方法里面更改这个参数(或者引用重指),这种final参数主要是用在向匿名内部类传递数据 的时候用到。

2)final方法。把方法锁定,以防止任何继承类修改它的含义,即不会被覆盖掉。

final 和private关键字。类中所有的private方法都隐式的指定为final的。因为导出类无法取用private方法,所以也就无法覆盖它。

“覆盖”只有在某个方法是基类的接口的一部分时才会出现。如果一个方法是private,那它就不是基类接口的一部分。它仅是隐藏于类中的程序代码,只不过是有相同的名字而已。仅此。

3)final类。一个类被修饰为final,表示你不想任何类继承它。当然final类里面 的final域之类的,跟普通类里面的没有区别。不影响

15,初始化与类的加载

static代码是在类被第一次使用的时候加载的。假如两个类A,B,B extens A .那么当B对象生成的时候,首先运行基类A的static代码,然后是B的static代码,然后当这些类代码都执行完之后,对象就可以创建了。也就是执行对象相关代码。

好,今天到这里。

时间: 2024-07-28 13:12:42

Java4Android之复用类的相关文章

java之旅(7)隐藏实现 & 复用类

隐藏实现 & 复用类 访问控制符, import, 每个编译单元(.java文件)只能有一个public类,如果还有其他类,那这些类就成为这个public类的辅助类,这是因为他们都不是public的,因此对外边世界来说,它们都是看不到的. 编译.java文件的时候,它里面的每个类都会产生输出.其输出的文件名字就是.java里面类的名字,这样写不了几个java文件就会产生一堆.class文件,但是不要奇怪,一个能正常工作的java文件本来就是由一堆.class文件组成的,当然也可以用jar把他们封

C++:通过私有(private)继承复用类实现工厂函数详解

通过接口类(interface class), 实现工厂函数, 可以复用(reuse)已有类, 重写实现接口. 如: 接口类: IPerson; 复用类: PersonInfo; 实现类: CPerson; 工厂函数: DatabaseID askUserForDatabaseID(); std::shared_ptr<IPerson> makePerson(DatabaseID personIndetifier); 可以通过私有继承复用类PersonInfo,公有继承接口类IPerson,

Java编程思想学习笔记——复用类

前言 复用代码是Java众多引人注目的功能之一. 达到复用代码的方法有: 组合:新的类由现有类的对象所组成.(复用现有代码的功能,而非它的形式) 继承:按照现有类的类型组建新类.(不改变现有类的形式,复用现有类的形式并在其中添加新代码).面向对象程序设计的基石 正文 1.组合语法 将对象引用置于新类中即可(非基本类型:在新类中放置引用,基本类型:直接添加就可以了) /** * 引擎 */ class Engine{ /** * 功率 */ double power; /** * 品牌 */ St

JAVA学习之“复用类”

1. toString() 每一个非基本类型都有一个toString()方法:当编译器需要从对象获取一个string时,该对象的toString()方法就会被调用. 示例: class WaterSource { private String s; WaterSource() { s = "WaterSource Constructed"; } public String toString() {return s;} public static void main(String[] a

java 初始化 对象-导出类中默认创建基类的子对象

问题描述 导出类中默认创建基类的子对象 读<Java编程思想第四版>第7章复用类,7.2.1初始化基类中, 描述当创建一个导出类对象的时候会自动创建一个基类子对象. 那如果我继承自一个抽象类,那么编译器会怎么处理呢? 解决方案 抽象类是不能实例化的,基类的构造函数只是设置了这个类的属性等,这个对象是一个子类的对象,只是可以用父类指向它而已. 也就是说创建一个子类的时候,没有创建两个对象,而是一个对象.

循环任务切换器 CircleTaskSwitcher -- ESBasic 可复用的.NET类库(06)

 1.缘起:     假设我的订单处理系统有这样的需求:将一天24小时分为4个时段,凌晨2:15到8:30采用A类型的处理器处理接收到的订单,8:30到14:00采用B类型的处理器,14:00到20:00采用C类型的处理器,20:00到第二天凌晨2:15采用D类型的处理器.     即我们的订单处理器需要在任一天的2:15.8:30.14:00.20:00这四个时刻发生切换,这就是一个循环切换器所要做的工作.     我设计了ESBasic.Threading.Application. ICir

TIJ阅读笔记(第六章)

笔记 6:复用类 合成所使用的语法  如果想对reference进行初始化,那么可以在以下几个时间进行:    1.在定义对象的时候.这就意味着在构造函数调用之前,它们已经初始化完毕了.    2.在这个类的构造函数里.    3.在即将使用那个对象之前.这种做法通常被成为"偷懒初始化(lazy initialization)".如果碰到创建对象的代价很高,或者不是每次都需要创建对象的时候,这种做法就能降低程序的开销了.    继承所使用的语法.    继承设计方面有一条通用准则,那就

IT人的技术哲学书单:谁说写代码、做产品就不需要参禅悟道?

刚刚进入大学校门时老师曾经说过:"无论学习什么专业,只要研究到最后就是哲学."我们笑着问道:"那么,写代码写到最后也是哲学?"老师回答:"是的,那就是技术哲学."现在回想起来,的确如此,我们发现技术中无处存在着哲学.那编写代码来说,对于同样一个功能进行实现,有的同学就会使用了很多的设计思想和设计模式,这样的代码无论是在自己看来还是拿给其他人看都会是赏心悦目的,而且也非常便于后期的重构. 无论是科学家还是工程师,成长不能只局限于技术层面,也要学会如

【谢源评体系结构顶会 MICRO 2016】神经网络加速器仍是热点,但图计算加速器夺最佳论文(下载)

MICRO(The 49th Annual IEEE/ACM International Symposium on Microarchitecture)是计算机体系结构领域的顶级会议,重点关注处理器体系结构的设计等内容.自 1968 年创办以来,迄今已经举办了 49 届,今年的 MICRO 于 10 月 15 日至 19 日在台北召开. 历史上,MICRO 长期被美国顶尖研究机构所占领,例如开会地点,仅有 10 次在美国之外的城市召开,本次是 MICRO 第二次在亚洲召开(第一次是 1999 年