对象与类
- LocalDate类;
- static LocalTime now()
构造一个表示当前日期的对象 - static LocalTime of(int year,int month,int day)
构造一个表示给定日期的对象 - int getYear()
- int getMonthValue()
- int getDayOfMonth()
得到当前日期的年、月和日 - DayOfWeek getDayOfWeek()
得到当前日期是星期几,作为DayOfWeek类的一个实例返回。调用getValue来得到1~7之间的一个数,表示这是星期几,1表示星期一 - LocalDate plusDays(int n)
- LocalDate minusDays(int n)
生成当前日期之后或之前n天的日期。
- static LocalTime now()
在一个源文件中,只能有一个公有类,可以有任意数量的非公有类
注意不要编写返回引用可变对象的访问器方法。这样可以调用访问器改变对象的私有成员。如果需要返回一个可变对象的引用,应该首先对它进行克隆(clone)。对象clone是指存放在另一个位置上的对象副本。
- final实例域:可以将实例域定义为final,构建对象是必须初始化这样的域。必须确保在每一个构造器执行之后,这个域的值被设置,并且在后面的操作中,不能再修改。final修饰符大都用于基本类型域,或不可变类的域,对于可变的类,表示变量中的对象引用不会再指向其他的对象,但是对象可以更改。
- 静态域与静态方法:
- 静态域:属于类,不属于任何独立的对象,实例共享
- 静态常量:static final
- 静态方法:静态方法是没有this参数的方法,静态方法只能访问自身类中的静态域。两种使用情况:
1.一个方法不需要访问对象状态,其所需参数都是通过显示参数提供
2.一个方法只需要访问类的静态域
- 工厂方法:类似LocalDate的LocalDate.now和LocalDate.of方法
- 重载:返回类型不是方法签名的一部分,不能有两个名字相同、参数类型也相同却返回不同类型值的方法。
- this()调用同一个类的另一个构造器。
- 文档注释:
- 类注释
- 方法注释
- 域注释
- 通用注释
- 包与概述注释
- 类设计技巧:
- 一定要保证数据私有
- 一定要对数据初始化
- 不要在类中使用过多的基本类型
- 不是所有的域都需要独立的域访问器和域更改器
- 将职责过多的类进行分解
- 类名和方法名要能够体现它们的职责
- 优先使用不可变的类
继承
- super() 调用父类构造器 super调用构造器的语句必须是子类构造器的第一条语句
- Java单继承
- 允许子类将覆盖方法的返回类型定义为原返回类型的子类型 可协变的返回类型
- 在覆盖一个方法的时候,子类方法不能低于超类方法的可见性,特别是,如果超类方法是public,子类方法一定要声明为public
- 阻止继承:final类和方法。不允许扩展的类被成为final类,final方法不允许重写。对于final域来说构造对象之后就不允许改变它们的值,如果将一个类声明为final,只有其中的方法自动成为final,而不包括域。
- 在将超类转换成子类之前,应该使用instanceof进行检查
- 抽象类:1.包含一个或多个抽象方法的类本身必须被声明为抽象的。2.抽象类可以包含具体数据和具体方法。3.抽象类不能被实例化。4.可以定义一个抽象类的对象变量,但是它只能引用非抽象子类的对象。
- private本类可见,public所有类,protected本包和所有子类,默认本包可见
- 所有的数组类型,不管是对象数组还是基本类型的数组都i扩展了object类
- Objects.equals(a,b)方法:如果两个参数都为null,调用将返回true;其中一个不为null,返回false,都不为null,调用a.equals(b)。
- 编写equals方法:
1.显示参数命名为otherObject,稍后需要将它转换成另一个叫做other的变量。
2.检测this与otherObject是否引用同一个对象。 这条语句只是一个优化,实际上,这是一种经常采用的形式。因为计算这个等式要比一个一个地比较类中的域所付出的代价小很多。
if(this==otherObject) return true;
3.检测otherObject是否为null,如果为null,返回false。这项检测是很必要的。
if(otherObject==null) return false;
4.比较this与otherObject是否属于同一个类。如果equals的语义在每个子类中有所改变,就是用getClass检测:
if(getClass()!=otherObject.getClass()) return false;
如果所有的子类都拥有统一的语义,就使用instanceof检测:
if(!(otherObject instanceof ClassName)) return false;
getClass()限制了对象只能是同一个类,而instanceof却允许对象是同一个类或其子类,
5.将otherObject转换为相应的类类型变量:
ClassName other=(ClassName)otherObject;
6.现在开始对所有需要比较的域进行比较了。使用==比较基本类型域,使用equals比较对象域,如果所有的域都匹配,返回true,否则返回false
return field1==other.field1&&Objects.equals(field2,other.field2)&&....
- 编写构造器有一条良好规范:做尽量少的事让对象进入良好状态。如果有可能的话,尽量不要调用类中的任何方法。在基类的构造器中能安全调用的只有基类的 final 方法(这也适用于可被看作是 final 的 private 方法)。这些方法不能被重写,因此不会产生意想不到的结果。你可能无法永远遵循这条规范,但应该朝着它努力。
- 构造器调用顺序:
- 1.在所有事发生前,分配给对象的存储空间会被初始化为二进制 0。
2.如前所述调用基类构造器。如果构造函数中调用了类中的方法,而且这个方法又被子类重写了,此时调用重写后的 方法
3.按声明顺序初始化成员。
4.最终调用派生类的构造器。
这么做有个优点:所有事物至少初始化为 0(或某些特殊数据类型与 0 等价的值),而不是仅仅留作垃圾。这包括了通过组合嵌入类中的对象引用,被赋予 null。如果忘记初始化该引用,就会在运行时出现异常。观察输出结果,就会发现所有事物都是 0。
- 1.在所有事发生前,分配给对象的存储空间会被初始化为二进制 0。