java编程思想读书笔记2

六:访问权限控制

1.java中的4种访问制权限: 
(1).public:最大访问控制权限,对所有的类都可见。

 (2).protect:同一包可见,不在同一个包的所有子类也可见。 
(3).default:包访问权限,即同一个包中的类可以可见。默认不显式指定访问控制权限时就是default包访问控制权限。 
(4).private:最严格俄访问控制权限,仅该类本身可见,对外一切类都不可以访问(反射机制可以访问)。

 七:复用类

1:用super关键字表示超类。

2:子类会在构造器中自动调用基类的构造器来执行初始化。构建过程是从基类向外扩散的。

3:final:

final数据:一个永不改变的编译时常量。一个在运行时被初始化的值,而你不希望他被改变。

final参数:java容许在参数列表中以声明的方式将参数指明为final。

final方法:保持方法不被修改。所有的private的方法都隐式的指定为final的。

final类:没有子类。组合和继承之间的选择

  • 对final关键字的误解 当final修饰的是基本数据类型时,它指的是数值恒定不变(就是编译期常量,如果是static final修饰,则强调只有一份),而对对象引用而不是基本类型运用final时,其含义会有一点令人迷惑,因为用于对象引用时,final使引用恒定不变,一旦引用被初始化指向一个对象,就无法再把它指向另一个对象。然而,对象其自身却是可以被修改的,Java并未提供使任何对象恒定不变的途径(但可以自己编写类以取得使对象恒定不变的效果),这一限制同样适用数组,它也是对象。
  • 使用final方法真的可以提高程序效率吗? 将一个方法设成final后,编译器就可以把对那个方法的所有调用都置入“嵌入”调用里。只要编译器发现一个final方法调用,就会(根据它自己的判断)忽略为执行方法调用机制而采取的常规代码插入方法(将自变量压入堆栈;跳至方法代码并执行它;跳回来;清除堆栈自变量;最后对返回值进行处理)。相反,它会用方法主体内实际代码的一个副本来替换方法调用。这样做可避免方法调用时的系统开销。当然,若方法体积太大,那么程序也会变得雍肿,可能受到到不到嵌入代码所带来的任何性能提升。因为任何提升都被花在方法内部的时间抵消了。

在最近的Java版本中,虚拟机(特别是hotspot技术)能自动侦测这些情况,并颇为“明智”地决定是否嵌入一个final 方法。然而,最好还是不要完全相信编译器能正确地作出所有判断。通常,只有在方法的代码量非常少,或者想明确禁止方法被覆盖的时候,才应考虑将一个方法设为final。

类内所有private 方法都自动成为final。由于我们不能访问一个private 方法,所以它绝对不会被其他方法覆盖(若强行这样做,编译器会给出错误提示)。可为一个private方法添加final指示符,但却不能为那个方法提供任何额外的含义。

4:继承与组合

  • 组合和继承都允许在新的类中放置子对象,组合是显式的这样做,而继承则是隐式的做。
  • 组合技术通常用于想在新类中使用现有类的功能而非它的接口这种情形。即在新类中嵌入某个对象,让其实现所需要的功能,但新类的用户看到的只是为新类所定义的接口,而非所嵌入对象的接口。为取得此效果,需要在新类中嵌入一个现有类的private对象。但有时,允许类的用户直接访问新类中的组合成分是极具意义的,即将成员对象声明为public。如果成员对象自身都隐藏了具体实现,那么这种做法是安全的。当用户能够了解到你正在组装一组部件时,会使得端口更加易于理解。比如Car对象可由public的Engine对象、Wheel对象、Window对象和Door对象组合。但务必要记得这仅仅是一个特例,一般情况下应该使域成为private
  • 在继承的时候,使用某个现有类,并开发一个它的特殊版本。通常,这意味着你在使用一个通用类,并为了某种特殊需要而将其特殊化。稍微思考一下就会发现,用一个“交通工具”对象来构成一部“车子”是毫无意义的,因为“车子”并不包含“交通工具”,它仅是一种交通工具(is-a关系)。
  • “is-a”(是一个)的关系是用继承来表达的,而“has-a”(有一个)的关系则是用组合来表达的
  • 到底是该用组合还是继承,一个最清晰的判断方法就是问一问自己是否需要从新类向基类进行向上转型,需要的话就用继承,不需要的话就用组合方式。

八:多态

在面向对象的程序设计语言中,多态是继数据抽象和继承之后的第三种基本特性。  多态通过分离“做什么”和“怎么做”,从另一角度将接口和实现分离开来。多态不但能够改善代码的组织结构和可读性,还能够创建“可扩展的”程序,即无论在项目最初创建时,还是在需要添加新功能时,都可以进行扩充。 “封装”通过合并特征和行为来创建新的数据类型,“实现隐藏”则通过细节“私有化(private)”将接口和实现分离开来,而多态的作用则是消除类型之间的耦合关系。继承允许将对象视为自己本身的类型或它的基类型进行处理,这种能力极为重要,因为它可以使多种类型(从同一基类导出而来的)被视为同一类型进行处理,而同一份代码也就可以毫无差别地运行在这些不同类型之上了。多态方法调用允许一种类型表现出与其他相似类型之间的区别,只要它们都是从同一基类导出而来的。这种区别是根据方法行为的不同来而表示出来的,虽然这些方法都可以通过同一个基类来调用。

》Java中除了static方法与final方法,其他所有的方法都是后期绑定。

》只有非private方法才可以被覆盖。

》静态方法是与类,而并非与单个对象相关联的。

》构造器不具有多态性(他们实际上static方法,只不过static声明是隐式的)。

》对象调用构造器的顺序:

   ●调用基类构造器,这个步骤会不断的反复递归下去 。

   ●按声明顺序调用成员的初始化方法。

   ●调用导出类构造器的主体。

九:接口

》接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法。

》如果一个类包含一个或多个抽象方法,该类必须被限定为抽象的。

》接口是实现多重继承的途径。

》总结

1、java提供了实现抽象类的方法,包含仅有声明而没有方法主体的函数的类称之为抽象类,其函数声明如:abstract void f().

2、interface产生的则是完全抽象类。接口的声明形式为:

        interface xx

        {

            //.................

        }

接口中的方法默认都为public

3、Java实现多重继承,可以通过对于多个接口的实现达到这种效果。其实现如:

       class A implements B,C,D

       {

       }

4、经验,优先选择类而不是接口,从类开始,如果接口的必须行变得非常明确,那么就进行重构。接口是一种重要的工具,但是他们容易被滥用。

5、使用接口的两点原因:

a、为了能够向上转型为多个基类,带来灵活性。

        b、防止客户端程序员创建该类的对象,并确保这仅仅是建立一个接口。

6、接口之间也可以互相继承,从而扩展接口方法的种类。

7、在将不同的接口相互组合时,要尽量避免使用相同的方法名,因为这样会导致可读性混乱,以及编译错误。

十:内部类

》可以将一个类的定义放在另一个类的定义内部。这就是内部类(内部类与组合是完全不同的)。

 

posted @ 2016-03-28 13:30  戎码一生  阅读(233)  评论(0编辑  收藏  举报