一、继承(Inheritance)
1、概念:生活中儿子继承父亲的资产,而程序中是类与类之间特征和行为的一种赠与或获得。
2、格式:class 子类 extends 父类();
3、作用:提高代码的复用性,还提高了代码的可扩展性。
4、特性
- 子类拥有父类非 private 的属性、方法。
- 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
- 子类可以用自己的方式实现父类的方法。
- Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如 B 类继承 A 类,C 类继承 B 类,所以按照关系就是 B 类是 C 类的父类,A 类是 B 类的父类,这是 Java 继承区别于 C++ 继承的一个特性。
构造器
子类是不继承父类的构造器(构造方法或者构造函数)的,它只是调用(隐式或显式)。如果父类的构造器带有参数,则必须在子类的构造器中显式地通过 super关键字调用父类的构造器并配以适当的参数列表。 如果父类构造器没有参数,则在子类的构造器中不需要使用 super关键字调用父类构造器,系统会自动调用父类的无参构造器。
继承关键字
继承可以使用 extends 和 implements 这两个关键字来实现继承,而且所有的类都是继承于 java.lang.Object,当一个类没有继承的两个关键字,则默认继承object(这个类在 java.lang 包中,所以不需要 import)祖先类。
注:(1)类中的构造方法,只负责创建本类对象,不可继承。private修饰的属性和方法,只有本类可见。父类与子类不在同一个package中时,default修饰的属性和方法,仅同包可见。如果定义一个类是没有调用extends,那么它的父类是java.lang.Object
5、方法的重写(Override)
方法重写又称 方法覆盖 。 方法的重写是指两个方法的返回值、方法名、参数的类型和个数相同 (子类重写父类的方法)。 方法的重写,不能发生在同类中,只能发生在子类中。 若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。
6、关键字
(1)super
概念:当在子类对象中,子类想访问父类的东西,可以使用“super.”的方式访问。父子类的同名属性不存在覆盖关系,两块空间同时存在(子类覆盖父类属性),需使用不同的前缀进行访问。
用法;(1)子类方法中 super.父类属性,super.父类方法();(2)子类构造方法中 super(), super(参数)
this与super的区别:
(1)代表的事物不同
super代表的是⽗类空间的引⽤
this 代表的是所属函数的调⽤者对象
(2)使⽤前提不同
super 必须要有继承关系才能使⽤
this 不需要继承关系也能使⽤
(3)调⽤的构造函数不同
super :调⽤⽗类的构造函数
this :调⽤所属类的构造函数
注:当子类构造中使用了this()或this(实参),不可再同时书写super()或super(实参),会由this()指向的构造方法完成super()的调用。
(2)final
①final修饰变量不能被重新赋值。
class Math{
public final double PI=3.1415926;
}
② final 修饰方法不可被子类重写,但可以被重载。
final void student (){
}
③ final修饰类,修饰的类不能被继承
final class FontDialog{
}
④ 可以修饰 类,方法,属性,变量。
二、多态
概念:父类引用指向子类对象,从而产生多种形态。二者具有直接或间接的继承关系时,父类引用可指向对象,即形成多态。多态与方法有关,与属性无关。
格式:父类类型 变量名=new 子类类型();
条件:继承,方法重写,父类引用指向子类对象
父类引用指向子类对象后用该父类引用调用子类重写的方法。
作用:屏蔽子类间的差距,灵活,耦合度低。
应用:1)使用父类作为方法形参实现多态,使方法参数的类型更为宽泛 调用方法时,可传递的实参类型包括:本类型对象+其所有的子类对象
2) 使用父类作为方法返回值实现多态,使方法可以返回子类对象 调用方法后,可得到的结果类型包括:本类型对象+其所有的子类对象。
对象的类型转换:
1)向上转型:父类的引用指向子类的对象。
Father f=new Son():
Son son=new Son();
Father f=(Father)son;
以上两种方法创建上转型对象,其中San是Father的子类,f就是上转型对象。
注:仅可调用父类所声明的属性和方法。
向下转型:子类对象指向父类引用。
注:只有转换回子类真实类型,才可调用子类独有的属性和方法。
三、抽象类
抽象类的成员变量,成员方法,构造方法与普通类一致。抽象类有 abstract 修饰。抽象类不可以实例化对象。抽象类可以有抽象方法。抽象方法不能有方法体,只能在非抽象子类中实现。
抽象方法:abstract 修饰的方法是抽象方法。抽象方法没有实现,需要在子类中实现。
public abstract void test();
抽象类可以没有抽象方法,但是有抽象方法的一定是抽象类。一个类只能继承一个抽象类
四、接口
接口是一种抽象类型,是抽象方法的集合,以 interface 声明。一个类可以实现多个接口。
接口不是类。类描述对象的属性和行为,接口包含类需要实现的方法。接口方法默认是 public abstract,变量默认是 public static final。
特点:接口不能实例化对象。接口没有构造函数。接口中都是抽象方法。接口不能包含成员变量,除了被 static final 修饰的变量。接口被类 实现(implement),一个类可以实现多个接口。
语法:
class 子类 extends 父类 implements 接口1,接口2,...()
接口与抽象类的区别:
基本语法区别
Java中接口和抽象类的定义语法分别为interface与abstract关键字。
抽象类:在Java中被abstract关键字修饰的类称为抽象类,被abstract关键字修饰的方法称为抽象方法,抽象方法只有方法的声明,没有方法体。抽象类的特点:
a、抽象类不能被实例化只能被继承;
b、包含抽象方法的一定是抽象类,但是抽象类不一定含有抽象方法;
c、抽象类中的抽象方法的修饰符只能为public或者protected,默认为public;
d、一个子类继承一个抽象类,则子类必须实现父类抽象方法,否则子类也必须定义为抽象类;
e、抽象类可以包含属性、方法、构造方法,但是构造方法不能用于实例化,主要用途是被子类调用。
接口:Java中接口使用interface关键字修饰,特点为:
a、接口可以包含变量、方法;变量被隐士指定为public static final,方法被隐士指定为public abstract(JDK1.8之前);
b、接口支持多继承,即一个接口可以extends多个接口,间接的解决了Java中类的单继承问题;
c、一个类可以实现多个接口;
d、JDK1.8中对接口增加了新的特性:(1)、默认方法(default method):JDK 1.8允许给接口添加非抽象的方法实现,但必须使用default关键字修饰;定义了default的方法可以不被实现子类所实现,但只能被实现子类的对象调用;如果子类实现了多个接口,并且这些接口包含一样的默认方法,则子类必须重写默认方法;(2)、静态方法(static method):JDK 1.8中允许使用static关键字修饰一个方法,并提供实现,称为接口静态方法。接口静态方法只能通过接口调用(接口名.静态方法名)。
如下例子所示:
public interface Person{
public static final int a=10;
//JDK1.8
default void sayHello(){
System.out.println("Hello World");
}
public void say();
}
public abstract class Person{
public abstract void say();
public void eat(){};
}
如上述代码所示:
接口只能是功能的定义,而抽象类既可以为功能的定义也可以为功能的实现。