面向对象:
面向对象设计时一种程序设计技术。它将重点放在数据(即对象)和对象的接口上。就好如一个面向对象的木匠始终关注的是所制作的椅子,不关心使用的工具。
多线程:(并发程序设计)
多线程带来更好的交互响应和实时行为。如今,我们非常关注并发性,因为摩尔定律将完结,我们不在追求更快的处理器,而是着眼于获取更多的处理器,而且一直要保持他们工作。现在需要并发的程序设计来确保用户界面不会“冻住”;
概念:
修饰符:用于控制其他部分对这段代码的访问级别。
关键字class: 表明java程序中的全部内容都包含在类中。这里将类作为一个加载程序逻辑的容器。Java的应用程序的所有内容都必须放置在类中。
java对大小写是敏感的,类一个单词首字母全部大写,多个所有首字母大写,变量,方法第一个首字母小写,常量都是大写,单词之间用下划线隔开。
每个句子必须要用分号结束;
Double 类型用的多。
建议不要在程序中使用char类型。
布尔boolean就是用来做逻辑判断的数据类型。
对于运算符&&的优先级要高于||,作为一个整体的要括起来,a&&b||c和(a&&b)||c是一样的结果。
枚举类型:
有时候,变量的取值只在一个有限的集合内。例如:销售的服装或比萨饼只有小、中、大和超大这四种尺寸。当然,可以将这些尺寸分别编码为1,2,3,4或者S,M,L,X。但是这样存在一定的隐患。在变量中很可能保存的就是一个错误的值(如0或m).
针对这种情况,可以自定义枚举类型。枚举类型包括有限个命名的值。例如,
Enum Size {SMALL,MEDIUM,LARGE,EXTRE_LARGE};
现在,可以声明这种类型的变量:
Size s = Size.MEDIUM;
Size类型的变量只能存储这个歌类型申明汇总给定的某个枚举值,或者null值,null表示这个变量没有设置任何值。
比较两个枚举类的值的时候,永远不要调用equals方法,而是直接使用“==”就可以了。
如果需要的话,可以在枚举类型中添加一些构造器、方法和域。当然,构造器只是在构造枚举常量的时候被调用。
字符串判断是否相等要用equals方法,不要用==
判断字符串要检查一个字符串既不是null也不为空串(对象长度为0):
If(str != null && str.length() != 0)
如果是其他的对象,只需要判断是否为null就可以了。String 是比较特殊的。
查一下关于String的方法
如果需要较短的字符串构建字符串,就用StringBuiler();
BigInteger(任意精度的整数运算)和BigDecimal(任意精度的浮点数运算),通过静态的valueof()方法可以将其他类型的数据转换为大数值:
BigInteger b=BigInteger.valueof(100);
查阅一下基本的使用
数组的长度为0与null不同;
面向对象的程序是由对象组成的,每个对象包含对用户公开的特定功能部分和隐藏的实现部分。程序中的很多对象来自标准库,还有一些是自定义的。究竟是自己构造对象,还是从外界购买对象完全取决于开发项目的预算与时间。但是,从根本上说,只要对象能够满足要求,就不必关心其功能的具体实现过程。在OOP中,不必关心对象的具体实现,只要能够满足用户的需求即可。
OOP关注的是数据(对象数据)放在第一位,然后在考虑算法(方法);
类:
是构造对象的模板。
封装:从形式上看,封装不过是将数据和行为组合在一个包中,并对对象的使用者隐藏了数据的实现方式,。对象中的数据称为实例域,操纵对象的过程称为方法,对于每个特定的类实例(对象)都有一组特定的实例域值。这些值的集合就是这个对象的当前的状态,无论何时,只要向对象发送一个消息,它的状态就有可能改变。
实例封装的关键在于绝对不能让类中的方法直接的访问其他类的实例域。程序仅通过对象的方法与对象的数据进行交互。封装给予对象了黑盒的特征,这是提高重用性和可靠性的关键。这意味着一个类可以全面的改变存储数据的方式,只要使用同样的方法操作数据,其他对象就不会知道或介意所发生的变化。
OOP另一个原则会让用户自定义JAVA类变得轻而易举,这就是:可以通过扩展一个类来建立另一个新的类。事实上,在java中,所有的类都源于一个“神通广大的超类”,就是Object.
继承扩展的新类具有所扩展的类的全部的属性和方法。在新类中,只需要提供适用于这个新类的新方法和数据域就可以了。
对象:
三个特性(重要)
对象的行为 -----可以对对象施加那些操作,或可以对对象施加哪些方法? 方法
对象的状态 ------当施加那些方法时,对象如何响应? 数据
对象的标识 ------ 如何辨别具有相同行为与状态的不同对象?
每个对象都保存着描述当前特征的信息。对象的状态的改变必须通过调用方法实现。如果不经过方法调用就可以改变对象状态,只能说明封装性遭到了破坏。
但是,对象的状态并不能完全描述一个对象。每个对象都有一个唯一的身份。例如,在一个订单处理系统中,任何两个订单都存在着不同之处,即使所订购的货物完全相同也是如此。需要注意的是,作为一个类的实例,每个对象的标识永远是不同的,状态常常也存在差异。
对象的这些关键的特性在彼此之间相互影响着。例如,对象的状态影响它的行为(如果一个订单‘已送货’或‘已付款’,就应该拒绝调用具有增删订单中条目的方法。反过来,如果订单是空的,即还没有加入预定的物品,这个订单就不应该进入‘已送货’状态。)
识别类:
面向对象的程序设计,首先就是从设计类开始,然后在往每个类中添加方法。
识别类的简单的规则就是在分析问题的过程猴子那个寻找名词,而方法对应着动词。
例如,在订单处理系统中,有这样一些名词:
商品(Iteam)
订单(Order)
送货地址(Shipping address)
付款(Payment)
账户(Account)
这些名词很可能成为类Item,Order等。
接下来,查看动词:商品被添加到订单中,订单被发送或取消,订单的货款被支付。对于每一个动词如“添加、发送、取消以及支付”,都要标识出主要负责完成相应动作的对象,例如:当一个新的商品添加到订单中时,那个订单对象就是被指定的对象,因为它知道如何存储商品以及如何对商品进行排序。也就是说,add应该是Order类的一个方法,而Item对象是一个参数。
类之间的关系:
依赖
聚合
继承
依赖:如果一个类的方法操纵另一个类的对象,我们就是一个类依赖于另一个类。
例如Order类使用Account类是因为Order对象需要访问Account对象查看信用状态。但是Item类不依赖于Account类,这是因为Item对象与客户账户无关。
应该尽可能将相互依赖的关系减少。类的耦合度减小。如果类A不知道B的存在,它就不会关心B的存在。
聚合:类A的对象包含类B的对象,例如一个Order对象包含一些Item对象。 关联
对象与对象变量:
要想使用对象,就必须首先构造对象,并指定其初始状态。然后,对对象应用方法。使用构造器构造新实例。构造器是特殊的方法,用来构造并初始化对象。
通常希望构造的对象可以多次使用,因此,需要将对象存放在一个变量中。
一定要认识到:一个对象变量并没有实际包含一个对象,而仅仅引用一个对象。
在java中,任何对象变量的值都是对存储在另外一个地方的一个对象的引用,new操作符的返回值也是一个引用。
如果一个方法用于一个值为null的对象上,那么就会产生运行时错误。局部变量不会自动初始化为null,而必须通过调用new或将他们设置为null进行初始化。
封装的意义在于,重要的是类对外提供的方法。
构造器:创建不同对象的
构造器是特殊的方法,与其他方法的一个重要的不同就是总是伴随着new操作符的执行被调用。
构造器关键一下几点:
构造器与类同名
每个类可以有一个以上的构造器
构造器可以有0个、1个或多个参数
构造器没有返回值
构造器总是伴随着new操作一起调用,不同参数的构造器可以new不同数据(成员变量)的对象。
注意:不要在构造器中定义与实例域重名的局部变量。
封装的优点:
- 一个类中,有时候,需要获取或设置实例域的值,提供以下三点:
- 一个私有的数据域
- 一个公有的域访问器方法
- 一个公有的域更改器的方法
静态域和静态方法:
静态域属于类,而不属于任何独立的对象。
静态常量使用比较多 public static final double PI=3.1415926;
由于每个类都可以对公有域进行修改,所以,最好不要将域设为public,然而,公有常量(即final域)却没有问题。
静态方法:不需要构造对象,直接通过类名就可以调用静态方法。
方法参数:
Java程序设计语言总是采用按值调用。也就是说,方法得到的是所有参数值的一个拷贝,特别是,方法不能修改传递给它的任何参数变量的内容。
比如:
Double precent = 10 ;
Harry.raiseSalary(percent);
不必理睬这个方法的具体实现,在方法调用之后,precent的值还是10.
总结:
- 一个方法不能修改一个基本数据类型的参数
- 一个方法不能改变一个对象参数的状态
- 一个方法不能让对象参数引用一个新的对象。
对象构造:多种构造方式
重载:相同的名字,不同的参数。方法签名(方法名和参数的类型)
默认域初始化:数值为0,布尔值为false,对象引用为null;
无参构造器:
系统会默认提供一个,当你提供构造器时,系统就不会提供无参构造,此时,必须显式的提供无参构造器。
显式域初始化:
在定义类的时候,最好初始化定义的变量。
This代表对象,可以调用实例域(就是成员变量)
包
Java用包将类组织起来。借助于包可以方便的组织自己的代码,并将自己的代码与别人的代码分开管理;
包可以确保类名的唯一性
类的导入:
一个类可以使用所属包里的所有的类,以及其他包里的公有类。Import导入类,也可以使用。
类的设计技巧:
- 一定要保证数据私有,绝对不要破坏封装性
- 一定要对数据初始化,建议显式的初始化
- 不要在类中使用过多的基本类型
- 不是所有的域(成员变量)都需要独立的域访问器和域更改器(get和set方法),有些数据是不需要别人获取和设置的实例域,比如雇员的雇佣日期
- 将职责过多的类进行分解
- 类名和方法名要体现它们的职责
- 优先使用不可变的类:不可变的类就可以安全在多个线程间共享其对象
继承:
不仅可以使用父类的方法和域,还可以添加新的方法和域,以满足新的需求
被final修饰的类不能被继承,被final修饰的方法不能被覆盖
Equals判断两个对象的引用是相等的,这两个对象就是相等的
参数数量可变的方法的应用的场景