重写(Override)和重载(Overload)
重写:子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。
重载:方法名必须相同。形式参数个数不同或者参数类型不同。
构造器
1、方法名和类名相同,且无返回值
2、构造器能重载,不能重写。
成员访问修饰符
多态
BaseClass b = new SubClass(); //父类对象调用子类实例
造成现象的原因:因为子类是一种特殊的父类,因此java允许把一个子类对象直接赋给一个父类引用变量。无须任何类型转换,或者被称为向上转型,向上转型由系统自动完成。
if(b instanceof BaseClass ){
((SubClass) b).bark(); //向上转型后的对象只能访问子类继承父类的方法,非继承方法需要通过向下转型后才能访问。
}
多态:相同类型的变量、调用同一个方法时呈现出多种不同的行为特征,这就是多态。
引用变量的强制类型转换
- 基本类型之间的转换只能在数值类型之间进行,数值类型和布尔类型除外。
- 引用类型之间的转换只能在具有继承关系的两个类型之间进行,如果两个没有任何继承关系的类型进行类型转换。则会引发ClassCastException异常。
instanceof是Java的一个二元操作符(运算符),它的作用是判断其左边对象是否为其右边类的实例,返回的是boolean类型的数据。用它来判断某个对象是否是某个Class类的实例。
用法:boolean result = object instanceof class ; // object是子类,class是父类。
AA a = new BB() ;
if (a instanceof BB){ //判断前面的对象是否是后面的类的子类、实现类的实例。
BB b = (AA)a ; //将AA类强转为BB类
}
b.speak ; //调用的是BB类中的方法
初始化代码块
与构造器不同,初始化块是一段固定的代码,不能接受任何参数。基于这个原理,不难发现初始化块的用法,如果有一段初始化处理的代码对所有对象完全相同,且无须接受任何参数,就可以将这段代码提取到代码块中。
初始化代码块总是在构造器执行之前执行。
初始化块的修饰符只能是static
与构造器类似,创建一个java对象时,不仅会执行该类的普通初始化块和构造器,而且系统会一直上溯到java.lang.Object类。先执行java.lang.Object类的初始化,开始执行java.lang.Object的构造器,依次向下执行其父类的初始化块,开始执行其父类的构造器,最后才执行该类的初始化块和构造器,返回该类的对象。
静态代码块
如果定义初始化块时使用了static修饰符,则这个初始化块就变成了静态初始化块,也被称为类初始化块(普通初始化块负责对对象执行初始化,类初始化则负责对类进行初始化)。静态初始化块是类相关的,系统将在类初始化阶段执行静态初始化块,而不是在创建对象是才执行,因此静态初始化块总是比普通初始化块先执行。
与普通初始化块类似,系统在类初始化阶段执行静态初始化时,不仅会执行本类的静态初始化块,还会一直上溯到Object类,先执行Object类的静态初始化块,然后执行其父类的静态初始块,最后才执行该类的静态初始化块。
JVM会在第一次使用某个类时,执行类初始化代码或者声明类成员变量时指定的初始化,它们的执行顺序与源代码中的排列顺序相同。
总结:静态代码块和静态成员变量是JVM在类加载的时候就运行了,而初始化代码块是在对象实例化时运行,且在构造器前面运行。
NullAccessStatic nas = null;//
nas.test(); //test()方法为类的静态方法。即使nas实例为null,也可以访问。
java四种整数数据类型的取值范围
byte的取值范围为-128~127,占用1个字节(-2的7次方到2的7次方-1)
byte占一个字节空间,最高位是符号位,剩余7位能表示0-127,加上符号位的正负,就是-127至+127,但负0没必要,为充分利用,就用负零表示-128(即原码1000,0000)。(计算机转补码后存储)
short的取值范围为-32768~32767,占用2个字节(-2的15次方到2的15次方-1)
int的取值范围为(-2147483648~2147483647),占用4个字节(-2的31次方到2的31次方-1)
long的取值范围为(-9223372036854774808~9223372036854774807),占用8个字节(-2的63次方到2的63次方-1)
单例(Singleton)类
通过自定义控制,使类只产生一个对象。
final修饰符
final 修饰的实例变量,要么在定义该实例变量时指定初始化,要么在普通初始化块或者构造器中为该实例变量指定初始化。