一、继承机制
1.继承:允许一个类作为另一个类的扩充版本
2.单继承:一个类只继承了一个父类 多继承:一个类继承了多个父类
Java只支持单继承,C++支持多继承
二、类的继承
1.形式:
class SubClass extends BaseClass {
//子类类体,定义子类的新成员
}
Java中所有的类都直接或间接地继承类 java.lang.Object
2.构造方法
(1)显式构造方法 形式:super(参数表);
系统执行到这条语句时,会根据参数表判断调用父类中哪个构造方法(参数表可以为空)
注意:使用super调用父类构造方法时,必须放在子类构造方法中的第一句
super的参数不可以是this或当前对象的对象成员,因为构造方法还没完成
(2)隐式构造方法:若子类没有显式构造方法,系统会依次调用父类的默认构造方法和子类的默认构造方法
3.子类对象的初始化
顺序:(1)载入类的类文件 (2)从父类到子类,依次初始化静态成员变量
(3)从父类到子类,依次初始化对象的成员变量 (4)调用类构造方法(首先调用父类)
(5)从Object类开始初始化块和构造方法,然后回归执行其子类的初始化块和构造方法,依次类推,直至当前类的初始化块和构造方法
4.子类的对象拥有父类中定义的所有成员,但不能访问父类中的私有成员(private)
5.覆写:在子类中定义一个与父类中方法名和参数表完全相同的方法
注意:若子类中方法func()覆写了父类中的方法,则相对于父类的func()方法,子类中方法func()的访问控制不能缩小
子类中func()方法声明抛出的异常不能超过父类中func()方法声明的
例:父类中:
double getIncome() {
return wage + bonus; //wage和bonus均为private修饰的
}
子类中:
double getIncome() {
return super.getIncome() + dividend; //super表示调用父类的getIncome方法
}
三、对象类型转换和多态
1.多态:同一个实体同时具有多种形式,这样可以提高代码的可重用性
2.对象类型转换分为向上转型和向下转型
向上转型:子类的对象被看做父类的对象来使用
这样的类型转换是安全的,但会丢失子类中新定义的那些信息
向下转型:父类的对象被看做子类的对象来使用(需要使用强制转换)
这种类型转换时不安全的,有可能造成信息的缺失
3.Java中通过覆写机制可以在继承关系的若干类中定义方法名、参数表、返回值相同但方法体不同的方法,在程序运行时,根据所引用对象的类型来判断执行哪个方法,这称为动态绑定(即运行时确定执行哪个方法)
Java中只有私有方法、final修饰的方法、静态方法是静态绑定(即编译时绑定)的
四、关键词final
1.final可以用于修饰变量、方法和类,表示被修饰的东西只能做一次初始化,之后不能发生改变
当final修饰方法参变量时,表示方法中不会对参变量的值做修改
final修饰的静态成员变量必须在声明时或在静态初始化块中初始化
final修饰的方法在继承过程中不能被覆写
final修饰的类不能被其他类继承
2.final类没有子类,final类的成员方法不会被覆写,final类的成员变量却不一定是常变量
五、抽象方法与抽象类
1.抽象方法:只有方法名、参数表、返回值,没有方法体(不能被执行)
声明语法: abstract returnType function(parameters list); //没有大括号
在方法声明前用关键字abstract修饰
抽象方法可以被覆写
静态方法、私有方法和final修饰的方法不能被覆写,因此不能定义为抽象方法
2.抽象类:没有具体对象的类,语法:在类定义前用关键词abstract修饰
3.注意:
(1)如果某个类含有抽象方法,那么这个类必须定义为抽象类,但抽象类可以没有抽象方法
(2)抽象类不可以创建对象
4.若抽象类的一个子类未实现父类的抽象方法,这个子类也是抽象类,必须用关键字abstract修饰
作用:抽象类保证了其所有子类若可以实例化,则必须实现抽象类中声明的抽象方法
六、接口
1.定义形式:interface interfaceName {…}
成员方法默认为抽象的、公有的,成员属性默认为静态的、final修饰的
接口只是提供一种形式,具体的实现细节交由它的类完成
由于接口不涉及具体的实现,因此在接口中的成员变量是静态常变量,默认为static和final修饰
2.类实现一个接口:class MyClass implements A, B, C {…}
一个类可以实现多各个接口
注意:虽然在接口中没有显式声明方法是公有的,但接口中默认的访问控制是公有的,而类中默认的访问控制是包内友好,所以必须在类中将这个方法用public修饰
3.接口和抽象类的选择:
Java中类之间不支持多继承,但类可以实现多个接口
若类需要包含一些方法的实现,必须实现为抽象类,其他情况两者皆可,优先选择使用接口,使程序更加易于扩展
七、内部类和匿名内部类
1.Java允许在类的内部定义另一个类,称这个在类体内部的类为内部类,包含内部类的类为外部类
内部类中可以访问外部类的方法、属性
与一般类的不同:外部类可以访问其内部类的私有成员
2.在其他类中只可以访问public或默认访问控制的内部类,不能创建私有的内部类对象
且创建内部类对象时必须有相应的外部类对象,但创建静态内部类的对象时可以通过外部类类名
3.在其他类中创建内部类对象
例:
class OuterClass { class InnerClassA{} //创建内部类对象时需要外部类对象 private class InnerClassB{} //不能创建私有内部类对象 static class InnerStaticClass{} //可通过类名创建静态内部类对象 } class InnerClassDemo { public static void main(String[] args) { OuterClass out = new OuterClass(); OuterClass.InnerClassA inner = out.new InnerClassA(); OuterClass.InnerStaticClass a = new OuterClass.InnerStaticClass(); } }4.匿名内部类:没有类名的内部类
匿名内部类无法定义构造方法
八、Object类
1.类java.lang.Object是所有Java类的父类
设计Object类的作用:(1)可以声明Object类型的对象引用指向任何类型的对象
(2)在Object类中定义的一些方法,自动地继承给所有的类
2.Object类的常用方法:
(1)boolean equals(Object oth) 作用:比较两对象引用是否相等
(2)String toString() 作用:将对象转换为字符串
(3)finalize() 作用:释放对象
(4)wait() 作用:线程等待
(5)notify() 作用:唤醒线程
注:方法(1)在使用时必须覆写
方法(2)返回的字符串是由对象引用的类型、字符@、对象哈希码的无符号十六进制数三部分组成的,一般没什么价值,也须覆写
九、包装类
1.8种基本数据类型:byte short int long float double char boolean
对应的包装类:Byte Short Integer Long Float Double Character Boolean Void
2.基本数据类型的数据与包装类对象的转换:typeValue()方法
例:
int a = 10; Integer obj = new Integer(a); System.out.println(obj.intValue());3.包装类对象或基本数据类型的数据与字符串的转换:toString方法
形式:public String toString();
将字符串转换为包装类的对象:
例:public Integer(String s);
将字符串转换为基本数据类型的数据:valueof(String)方法 或 parseType()静态方法
4.在JDK5.0版本之后,Java虚拟机支持自动装箱、拆箱机制
自动装箱:将基本数据类型的数据自动封装为相应的包装类对象
自动拆箱:从包装类对象中自动提取基本数据类型的数据