01
- 定义变量的时候,如果加上final修饰符,这个变量就变成了常量
常量在定义时进行初始化后就不可再次赋值,再次赋值会导致编译错误。
根据习惯,常量名通常全部大写。 - 定义变量时,要遵循作用域最小化原则,尽量将变量定义在尽可能小的作用域,并且,不要重复使用变量名。
- 类型自动提升与强制转型
在运算过程中,如果参与运算的两个数类型不一致,那么计算结果为较大类型的整型。例如,short和int计算,结果总是int,原因是short首先自动被转型为int - 短路运算
布尔运算的一个重要特点是短路运算。如果一个布尔运算的表达式能提前确定结果,则后续的计算不再执行,直接返回结果。
因为false && x的结果总是false,无论x是true还是false,因此,与运算在确定第一个值为false后,不再继续计算,而是直接返回false。 - 定义一个数组类型的变量,使用数组类型“类型[]”,例如,int[]。和单个基本类型变量不同,数组变量初始化必须使用new int[5]表示创建一个可容纳5个int元素的数组。
Java的数组有几个特点:
数组所有元素初始化为默认值,整型都是0,浮点型是0.0,布尔型是false;
数组一旦创建后,大小就不可改变。 - 对于多个==判断的情况,使用switch结构更加清晰。
同时注意,上述“翻译”只有在switch语句中对每个case正确编写了break语句才能对应得上。
使用switch时,注意case语句并没有花括号{}
如果需要复杂的语句,我们也可以写很多语句,放到{…}里,然后,用yield返回一个值作为switch语句的返回值
02
- class是一种对象模版,它定义了如何创建实例,因此,class本身就是一种数据类型
而instance是对象实例,instance是根据class创建的实例,可以创建多个instance,每个instance类型相同,但各自属性可能不相同
根据对象模版创建出真正的对象实例,必须用new操作符。 - 可变参数用类型…定义,可变参数相当于数组类型
- 构造方法的名称就是类名。构造方法的参数没有限制,在方法内部,也可以编写任意语句。但是,和普通方法相比,构造方法没有返回值(也没有void),调用构造方法,必须用new操作符。
- 方法名相同,但各自的参数不同,称为方法重载(Overload)。方法重载的返回值类型通常都是相同的。
方法重载的目的是,功能类似的方法使用同一名字,更容易记住,因此,调用起来更简单。 - 在继承关系中,子类如果定义了一个与父类方法签名完全相同的方法,被称为覆写(Override)。
- 多态是指,针对某个类型的方法调用,其真正执行的方法取决于运行时期实际类型的方法。多态具有一个非常强大的功能,就是允许添加更多类型的子类实现功能扩展,却不需要修改基于父类的代码。
- 继承可以允许子类覆写父类的方法。如果一个父类不允许子类对它的某个方法进行覆写,可以把该方法标记为final。
- 如果父类的方法本身不需要实现任何功能,仅仅是为了定义方法签名,目的是让子类去覆写它,那么,可以把父类的方法声明为抽象方法:把一个方法声明为abstract,表示它是一个抽象方法,本身没有实现任何方法语句。因为这个抽象方法本身是无法执行的,所以,该类也无法被实例化。抽象方法实际上相当于定义了“规范”。
- 在抽象类中,抽象方法本质上是定义接口规范:即规定高层类的接口,从而保证所有子类都有相同的接口实现,这样,多态就能发挥出威力。如果一个抽象类没有字段,所有方法全部都是抽象方法:就可以把该抽象类改写为接口:interface。所谓interface,就是比抽象类还要抽象的纯抽象接口,因为它连字段都不能有。因为接口定义的所有方法默认都是public abstract的,所以这两个修饰符不需要写出来(写不写效果都一样)。当一个具体的class去实现一个interface时,需要使用implements关键字。实现类可以不必覆写default方法。default方法的目的是,当我们需要给接口新增一个方法时,会涉及到修改全部子类。如果新增的是default方法,那么子类就不必全部修改,只需要在需要覆写的地方去覆写新增方法。
- 实例字段在每个实例中都有自己的一个独立“空间”,但是静态字段只有一个共享“空间”,所有实例都会共享该字段。不推荐用实例变量.静态字段去访问静态字段,推荐用类名来访问静态字段。可以把静态字段理解为描述class本身的字段(非实例字段)。
- 用static修饰的方法称为静态方法。
调用实例方法必须通过一个实例变量,而调用静态方法则不需要实例变量,通过类名就可以调用。因为静态方法属于class而不属于实例,因此,静态方法内部,无法访问this变量,也无法访问实例字段,它只能访问静态字段。静态方法经常用于工具类 - 因为interface是一个纯抽象类,所以它不能定义实例字段。但是,interface是可以有静态字段的,并且静态字段必须为final类型
- 在Java中,我们使用package来解决名字冲突。一个类总是属于某个包,类名(比如Person)只是一个简写,真正的完整类名是包名.类名。包可以是多层结构,用.隔开。包没有父子关系。java.util和java.util.zip是不同的包,两者没有任何继承关系。
- JavaBean是一种符合命名规范的class,它通过getter和setter来定义属性;