发表于: 2018-09-18 02:46:08

2 427


任务一:DAY 10



今日计划:

1.了解修饰符、运算符、循环/条件语句、StringBuilder

2.了解POJO、JAVA Bean等JAVA对象概念




今天完成:

1.修饰符


private和protected都不能修饰类(外部类)。

受保护的访问修饰符-protected:

    子类与基类在同一包中:被声明为 protected 的变量、方法和构造器能被同一个包中的任何其他类访问;

    子类与基类不在同一包中:那么在子类中,子类实例可以访问其从基类继承而来的protected方法,而不能访问基类实例的protected方法。

    protected可以修饰类及其方法和成员变量,但是interface及interface的成员变量/方法不能声明为 protected;

    如果我们只想让该方法对其所在类的子类可见,则将该方法声明为protected。

访问控制和继承:

    父类中声明为public的方法在子类中也必须为public;

    父类中声明为protected的方法在子类中要么声明为protected,要么声明为public,不能声明为private;

    父类中声明为private的方法,不能够被继承。


非访问修饰符:static、final、abstract、synchronize、transient 、volatile

1)static

https://www.cnblogs.com/dolphin0520/p/3799052.html

想在不创建对象的情况下调用某个方法,可以将这个方法设置为static;

禁止在静态成员方法中访问非静态成员方法:对象还未创建,无法预知在非静态成员方法中是否访问了非静态成员变量

最常见的static方法就是main方法;

main方法必须是static,因为程序在执行main方法的时候没有创建任何对象,因此只有通过类名来访问;

static变量:

    静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化

    而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。

static代码块

    static关键字还有一个比较关键的作用就是用来形成静态代码块以优化程序性能;

    static块可以置于类中的任何地方,类中可以有多个static块;

    在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。


2)final

http://www.cnblogs.com/dolphin0520/p/3736238.html

https://blog.csdn.net/x_iya/article/details/80015408

使用final修饰方法参数的目的是防止修改这个参数的值,同时也是一种声明和约定,强调这个参数是不可变的;

final变量:

    表示"最后的、最终的"含义,变量一旦赋值后,不能被重新赋值。被final修饰的实例变量必须显式指定初始值;

    final修饰符通常和static修饰符一起使用来创建类常量;

    对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;

    如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。

final类:

    当用final修饰一个类时,表明这个类不能被继承。也就是说,如果一个类你永远不会让他被继承,就可以用final进行修饰。

    final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法。


final方法:

    类中的 final 方法可以被子类继承,但是不能被子类修改。

    声明 final 方法的主要目的是防止该方法的内容被修改。

3)synchronized 

声明的方法同一时间只能被一个线程访问

4)transient 

序列化的对象包含被transient修饰的实例变量时,java 虚拟机(JVM)跳过该特定的变量。

该修饰符包含在定义变量的语句中,用来预处理类和变量的数据类型。

5)volatile 

修饰的成员变量在每次被线程访问时,都强制从共享内存中重新读取该成员变量的值。

而且,当成员变量发生变化时,会强制线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。

一个 volatile 对象引用可能是null。


2.运算符

// 大部分和C相似

异或:同位的值相同,结果为零

  A = 0011 1100

  B = 0000 1101

  A ^ B = 0011 0001

instanceof:属于boolean,用于操作对象实例,检查该对象是否是一个特定类型(类类型或接口类型)


3.循环语句

增强 for 循环:顺次遍历所有元素,无法实现较为复杂的循环

缺点:

  对于数组,不能方便的访问下标值;

  对于集合,与使用Interator相比,不能方便的删除集合中的内容(在内部也是调用Interator).

除了简单遍历并读取其中的内容外,不建议使用增强的for循环。


4.switch...case

语句中的变量类型可以是: byte、short、int、char。

从 Java SE 7 开始,switch支持字符串String类型,同时case标签必须为字符串常量或字面量。


5.Number、Math类

所有的包装类(Integer、Long、Byte、Double、Float、Short)都是抽象类Number的子类。

由编译器特别支持的包装称为装箱,所以当内置数据类型被当作对象使用的时候,编译器会把内置类型装箱为包装类;

相似的,编译器也可以把一个对象拆箱为内置类型;

int和Integer的区别 https://blog.csdn.net/chenliguan/article/details/53888018

Math:包含了用于执行基本数学运算的属性和方法,如初等指数、对数、平方根和三角函数。

Math.floor():返回小于等于(<=)给定参数的最大整数;

Math.cell():返回大于等于( >= )给定参数的的最小整数;

Math.round():表示四舍五入,算法为 Math.floor(x+0.5),将原来的数字加上 0.5 后再向下取整。


6.String类

.length():返回字符串长度

String.format(String format, Object... args):创建格式化字符串

String类是不可改变的,所以一旦创建了 String 对象,那它的值就无法改变。

重新赋值只是创建了新的对象,原对象还存在于内存中。


7.StringBuilder、StringBuffer

StringBuffer 和 StringBuilder 类的对象能够被多次的修改,不产生新的未使用对象。

StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类;

仅有在应用程序要求线程安全的情况下,才必须使用 StringBuffer 类。

String与StringBuilder的区别:https://www.cnblogs.com/lzq198754/p/5788096.html

在大部分情况下,生成对象速度:StringBuilder > StringBuffer > String(操作次数越大,越稳定)

  


8.POJO 和 JAVA Bean

POJO:plain ordinary java object(简单JAVA对象)

指那些没有从任何类继承、也没有实现任何接口,更没有被其它框架侵入的java对象。

https://blog.csdn.net/lushuaiyin/article/details/7436318

有一些private的参数作为对象的属性,然后针对每一个参数定义get和set方法访问的接口。

没有从任何类继承、也没有实现任何接口,更没有被其它框架侵入的java对象。


JAVA Bean:一种可重用组件,一次性编写,任何地方执行,任何地方重用

1)所有属性为private

2)这个类必须有一个公共的缺省构造函数。即是提供无参数的构造器

3)这个类的属性使用getter和setter来访问,其他方法遵从标准命名规范

4)这个类应是可序列化的。实现serializable接口

z


POJO和 JAVA Bean 两者区别:

1)POJO其实是比 Java Bean 更纯净的简单类或接口。POJO严格地遵守简单对象的概念;

     而一些 Java Bean 中往往会封装一些简单逻辑

2)POJO主要用于数据的临时传递,它只能装载数据, 作为数据存储的载体,而不具有业务逻辑处理的能力

3)Java Bean 虽然数据的获取与POJO一样,但是 Java Bean 当中可以有其它的方法。

当一个POJO可序列化,有一个无参的构造函数,使用getter和setter方法来访问属性时,它就是一个Java Bean。


各种对象(PO,BO,VO,DTO,POJO,DAO,Entity,JavaBean,JavaBeans)的区分:

https://www.cnblogs.com/lyjin/p/6389349.html

https://www.cnblogs.com/EasonJim/p/7967949.html

PO:(bean、entity等命名)

持久对象 persistent object ;

一个PO就是数据库中的一条记录;可以把一条记录作为一个对象处理,可以方便的转为其它对象。 

BO:(service、manager、business等命名)

业务对象层 Business Object,封装业务逻辑的java对象,通过调用DAO方法,结合PO,VO进行业务操作;

形象描述为一个对象的形为和动作,当然也有涉及到基它对象的一些形为和动作。

VO:(from也有此写法)

值对象 Value Object,主要体现在视图的对象;

对于一个WEB页面将整个页面的属性封装成一个对象。然后用一个VO对象在控制层与视图层进行传输交换。

DTO:(经过处理后的PO,可能增加或者减少PO的属性

数据传输对象 Data Transfer Object ;

eg.

比如我们一张表有100个字段,那么对应的PO就有100个属性。但是我们界面上只要显示10个字段;

客户端用 WEB service 来获取数据,没有必要把整个PO对象传递到客户端;

这时我们就可以用只有这10个属性的DTO来传递结果到客户端,这样也不会暴露服务端表结构;

到达客户端以后,如果用这个对象来对应界面显示,那此时它的身份就转为VO。

Controller控制层:主要是Action/Servlet等构成(目前Spring MVC则是通过@Controller标签使用)

此层业务层与视图层打交道的中间层,负责传输VO对象和调用BO层的业务方法,负责视图层请求的数据处理后响应给视图层。

View(视图层)主要是指由JSP、HTML等文件形成的显示层。

DAO数据访问对象 Data Access Object,位于业务逻辑和持久化数据之间实现对持久化数据的访问。

它可以把POJO持久化为PO,用PO组装出来VO、DTO。

DAO模式是标准的J2EE设计模式之一;开发人员使用这个模式把底层的数据访问操作和上层的商务逻辑分开;

具体的DAO类包含了从特定的数据源访问数据的逻辑,一般一个DAO类和一张表对应,每个操作要和事务关联。

DAO模式的优势就在于它实现了两次隔离:

1、隔离了数据访问代码和业务逻辑代码。业务逻辑代码直接调用DAO方法即可,完全感觉不到数据库表的存在。分工明确,数据访问层代码变化不影响业务逻辑代码,这符合单一职能原则,降低了藕合性,提高了可复用性。

2、隔离了不同数据库实现。采用面向接口编程,如果底层数据库变化,如由 MySQL 变成 Oracle 只要增加 DAO 接口的新实现类即可,原有 MySQ 实现不用修改。这符合 "开-闭" 原则。该原则降低了代码的藕合性,提高了代码扩展性和系统的可移植性。

一个典型的DAO 模式主要由以下几部分组成。

 1、DAO接口: 把对数据库的所有操作定义成抽象方法,可以提供多种实现。

 2、DAO实现类: 针对不同数据库给出DAO接口定义方法的具体实现。

 3、实体类:用于存放与传输对象数据。

 4、数据库连接和关闭工具类: 避免了数据库连接和关闭代码的重复使用,方便修改。




明天计划:

学习Spring IoC




遇到问题:

各种原因导致停在这好久了,于是继续

学习顺序???:IoC,AOP,xml,JDBCTemplate,Junit、log4j,MyBatis




收获:

1.了解修饰符 static、final

2.了解 StringBuilder 类

3.了解JAVA对象 POJO、JAVA Bean、DAO 


返回列表 返回列表
评论

    分享到