定义继承关系的语法结构
[修饰符] class 子类名 extends 父类名 {
//类体定义
}
属性的继承
1.当父子类定义在同一个包中中时,父类的所有非私有属性可以被子类继承。
2.当父子类定义在不同包中时(父类被public修饰),父类的被public和protected修饰的属性可以被子类继承。
属性的隐藏
子类中出现和父类中同名的属性的现象称为属性的隐藏。
方法的继承与覆盖
继承:
1.当父子类定义在同一个包中时,父类的所有非私有方法可以被子类继承。
2.当父子类定义在不同包中时(父类被public修饰),父类的被public和protected修饰的方法可以被子类继承。
覆盖:
子类中定义了和父类中具有相同的方法头方法的现象称为方法的覆盖。
父子类对象的使用与转化
Java的动态方法调用机制遵循一个原则:当父类引用指向子类对象时,是最终指向类型而不是声明类型决定调用谁的方法,但是,这个方法必须是在子类中定义过的,也就是说被子类覆盖的方法。
父类对象的转化遵循如下原则
1.子类对象可以被视为是其父类的一个对象
2.父类对象不能被当作其子类的一个对象
3.如果父类引用实际指向的是子类的对象,那么该父类引用可以经过强制类型转换成子类对象使用。
通过将子类对象赋值给父类来实现动态方法调用,在运行时期,将根据父类对象实际指向的实际类型来获取对应的方法所以才有多态性,即:一个父类对象的引用被赋予不同子类对象引用,执行该方法时根据其指向的不同的子类对象将表现出不同的行为。多态性在实现时通常将被覆盖的方法定义成抽象方法或将其定义在接口中。
关于多态的几点说明:
多态是针对方法调用而不是变量访问的
多态是针对继承体系结构而言的
运行时多态对一个方法的调用是基于具体调用对象而不是引用来确定具体调用哪个方法
final修饰符
1.final可以修饰属性和局部变量,称为常量,一旦赋值便不能修改。
2.如果final修饰的数据是其他类的对象,可以认为是该数据和其所指向的对象之间的绑定关系不可更改,而此数据所指向的对象的属性是可以被更改的。
3.因为被final修饰的属性要么取之不可更改,要么绑定关系不可更改,所以你常常节省内存空间将被final修饰的属性再同时被static修饰,习惯上两个修饰符出现的顺序static final。
4.被final修饰符所修饰的方法是不能被子类覆盖。注意,final修饰的方法可以被重载。
5.final修饰的类不能被继承。
final是唯一一个既可修饰属性又可以修饰局部变量的修饰符。
抽象类
当一个类被关键字abstract修饰时,称这个类是抽象类,所谓抽象类就是没有具体实例对象的类。
当一个方法被abstract修饰时,称这个方法为抽象方法,抽象方法是没有具体方法体,需要在子类重新被定义的方法,需要注意的是抽象方法必须定义在抽象类中,而抽象类中可以定义非抽象方法。
数组
数组定义可以使用两种格式:
类型[ ] 数组名;
类型 数组名[ ] ;
定义数组的时候不需要确定数组元素的个数。
数组对象的实例化
数组的初始化包括两个过程:
1.数组对象的实例化
2.数组元素的实例化
数组对象初始化主要确定数组中元素的个数,如果元素类型不是基本数据类型,元素的值都是null,如果是基本数据类型,系统会给出默认值。格式如下:
数组名 = new 类型[元素个数]
数组元素的实例化(赋值)
要对元素进行赋值需要使用new关键字(元素类型为基本数据类型的时候不需要使用new关键字)。
赋值也可以在定义数组的时候进行。 eg:int[ ] i2 = {2,3,3,4}