您的位置:首页 > 编程语言 > Java开发

Java学习笔记-4.继承与多态

2015-02-15 18:23 381 查看

一、继承机制


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虚拟机支持自动装箱、拆箱机制

自动装箱:将基本数据类型的数据自动封装为相应的包装类对象

自动拆箱:从包装类对象中自动提取基本数据类型的数据

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: