类的继承:
在Java中,类的继承是指在一个现有类的基础上去构建一个新的类,构建出来的新类被称作子类,现有类被称作父类。子类继承父类的属性和方法,使得子类对象(实例)具有父类的特征和行为。
在程序中,如果想声明一个类继承另一个类,需要使用extends关键字,语法格式如下所示。
class 父类{
……
}
class 子类 extends 父类{
……
}
举例:学习子类是如何继承父类
代码解析:上述代码中,第2~17行代码定义了一个Animal类,第19~21行代码定义了一个Dog类,Dog类中并没有定义任何操作,而是通过extends关键字继承了Animal类,成为了Animal类的子类。从运行结果可以看出,子类虽然没有定义任何属性和方法,但是却能调用父类的方法。这就说明,子类在继承父类的时候,会自动继承父类的成员。
例2:子类也可以定义自己的属性和方法
代码解析:在上述代码中,Dog类扩充了Animal类,增加了color属性及getColor()和setColor()方法。此时的Dog类已经存在了3个属性和6个方法。在main()方法中,第31行代码创建并实例化dog对象;第32~34行代码通过dog对象调用Animal类和Dog类的setter方法,设置名称、年龄和颜色;第35行代码通过dog对象调用Animal类和Dog类的getter方法获取名称、年龄和颜色。由运行结果可知,程序成功设置并获取了dog对象的名称、年龄和和颜色。
继承中需要注意的问题:
(1)在Java中,类只支持单继承,不允许多重继承。也就是说一个类只能有一个直接父类,例如下面这种情况是不合法的。 class A{} class B{} class C extends A,B{} // C类不可以同时继承A类和B类
(2)多个类可以继承一个父类,例如下面这种情况是允许的。 class A{} class B extends A{} class C extends A{} // 类B和类C都可以继承类A
(3)在Java中,多层继承也是可以的,即一个类的父类可以再继承另外的父类。例如,C类继承自B类,而B类又可以继承自A类,这时,C类也可称作A类的子类。例如下面这种情况是允许的。 class A{} class B extends A{} // 类B继承类A,类B是类A的子类 class C extends B{} // 类C继承类B,类C是类B的子类,同时也是类A的子类
(4)在Java中,子类和父类是一种相对概念,一个类可以是某个类的父类,也可以是另一个类的子类。例如,在第(3)种情况中,B类是A类的子类,同时又是C类的父类。 在继承中,子类不能直接访问父类中的私有成员,子类可以调用父类的非私有方法,但是不能调用父类的私有成员。
方法的重写:
在继承关系中,子类会自动继承父类中定义的方法,但有时在子类中需要对继承的方法进行一些修改,即对父类的方法进行重写。在子类中重写的方法需要和父类被重写的方法具有相同的方法名、参数列表以及返回值类型,且在子类重写的方法不能拥有比父类方法更加严格的访问权限。
super关键字:
当子类重写父类的方法后,子类对象将无法访问父类被重写的方法,为了解决这个问题,Java提供了super关键字,super关键字可以在子类中调用父类的普通属性、方法以及构造方法。
super关键字的具体用法:
(1)使用super关键字访问父类的成员变量和成员方法,具体格式如下:
super.成员变量
super.成员方法(参数1,参数2…)
(2)使用super关键字访问父类中指定的构造方法,具体格式如下:
super(参数1,参数2…)
注意:
通过super()调用父类构造方法的代码必须位于子类构造方法的第一行,并且只能出现一次。
super与this的区别:
注意:
this和super两者不可以同时出现,因为this和super在调用构造方法时都要求必须放在构造方法的首行。
final关键字:
final的英文意思是“最终”。在Java中,可以使用final关键字声明类、属性、方法,在声明时需要注意以下几点:
(1)使用final修饰的类不能有子类。
(2)使用final修饰的方法不能被子类重写。
(3)使用final修饰的变量(成员变量和局部变量)是常量,常量不可修改。
抽象类:
抽象方法的定义格式如下: abstract void 方法名称(参数);
抽象类的定义格式如下:
abstract class 抽象类名称{
访问权限 返回值类型 方法名称(参数)
{
return [返回值];
}
访问权限 abstract 返回值类型 抽象方法名称(参数); //抽象方法,无方法体 }
抽象类的定义规则如下:
(1)包含一个以上抽象方法的类必须是抽象类。
(2)抽象类和抽象方法都要使用abstract关键字声明。
(3)抽象方法只需声明而不需要实现。
(4)如果一个类继承了抽象类,那么该子类必须实现抽象类中的全部抽象方法。
接口:
修饰符class 类名 extends 父类名implements 接口1,接口2,... { ... }
多态:
Java中多态主要有以下两种形式:
(1)方法的重载。 (2)对象的多态性(方法重写)。
对象类型的转换:
分为以下两种情况:
(1)向上转型:子类对象→父类对象。
(2)向下转型:父类对象→子类对象。 对于向上转型,程序会自动完成,而向下转型时,必须指明要转型的子类类型。
对象类型的转换格式如下所示:
对象向上转型:父类类型 父类对象 = 子类实例; 对象向下转型: 父类类型 父类对象 = 子类实例; 子类类型 子类对象 = (子类)父类对象;
内部类:
内部类可分为4种
分别是成员内部类、局部内部类、静态内部类、匿名内部类。