一.继承的基本概念
(1)继承是面向对象的三大特征之一,继承可以解决编程中代码冗余的问题,是实现代码重用的重要手段之一。
(2)继承是软件可重用的一种表现,新类可以在不增加自身代码的情况下,通过从现有的类中继承其属性和方法,来充实自身内容,这种现象或行为就称为继承。此时,新类称为子类,现有的类称为父类。
(3)继承最基本的作用就是使得代码可重用,增加软件的可扩充性。
(4)Java中只支持单根继承,即每个类只能有一个直接父类。
(5)继承表达的是“XX is a XX”的关系,或者说是一种特殊和一般的关系。如Dog is a Pet.
(6)继承的语法格式如下:
[访问修饰符] class <SubClass> extends <SuperClass>{
代码
}
在Java中,继承通过extends关键字实现,其中SubClass称为子类,SuperClass称为父类或基类。
访问修饰符如果是public,那么该类在整个项目中可见。
若不写访问修饰符,则该类只在当前包中可见。
在Java中,子类可以从父类中继承以下内容:
1.可以继承public和protected修饰的属性和方法,不论子类和父类是否在同一个包里。
2.可以继承默认访问修饰符修饰的属性和方法,但是子类和父类必须在同一个包里。
无法继承父类的构造方法
二.super关键字和子类对象
1、使用super关键字调用父类成员
(1)super关键字代表父类引用,和this关键字的作用类似,都是将屏蔽了的成员变量、成员方法变得可见、可用,也就是说,用来引用被屏蔽的成员变量或成员方法。
(2)super是用在子类中,目的只有一个,就是访问直接父类中被屏蔽的内容,进一步提高代码的重用性和灵活性。
(3)super关键字可以访问父类的构造方法、属性、一般方法。
(4)通过super访问父类成员的语法格式如下:
访问父类构造方法:super(参数)
访问父类属性/方法:super.<父类属性/方法>
super只能出现在子类(子类的方法和构造方法)中,而不是其他位置。
super用于访问父类的成员,如父类的属性、方法、构造方法。
具有访问权限的限制,如无法通过super访问父类的private成员。
2、实例化子类对象
(1)在Java中,一个类的构造方法在如下两种情况下总是会被执行。
创建该类的对象(实例化)
创建该类的子类的对象(子类的实例化)
(2)当在Java语言中创建一个对象时,Java虚拟机会按照父类—子类的顺序执行一系列的构造方法。
(3)子类继承父类时构造方法的调用规则如下:
1)如果子类的构造方法中没有通过super显示调用父类的有参构造方法,也没有通过this显示调用自身的其他构造方法,则系统会默认先调用父类的无参构造方法。在这种情况下,是否写“super();”语句,效果是一样的。
2)如果子类的构造方法中通过super显示地调用了父类的有参构造方法,那么将执行父类相应的构造方法,而不执行父类无参构造方法。
3)如果子类的构造方法中通过this显示地调用了自身的其他构造方法,在相应构造方法中遵循以上两条规则。
4)如果存在多级继承关系,在创建一个子类对象时,以上规则会多次向更高一级传递,一直执行到顶级父类Object类的无参构造方法为止。
三.方法的重写
(1)如果从父类继承的方法不能满足子类的需求,可以在子类中对父类的同名方法进行重写(覆盖),以符合需求。
(2)方法重写(方法覆盖)必须满足如下要求:
重写方法和被重写方法必须具有相同的方法名
重写方法和被重写方法必须具有相同的参数列表
重写方法的返回值类型必须和被重写方法的返回值类型相同或者是其子类
重写方法不能缩小被重写方法的访问权限。
四.Object类
(1)Object类是所有类的父类。
(2)在Java中,所有的类都直接或者间接地继承了java.lang.Object类。
(3)Object类是所有Java类的祖先。
(4)在定义一个类时,没有使用extend是关键字,也就是没有显示地继承某个类,那么这个类直接继承Object类。
(5)所有对象都继承Object类中的方法。
方法 说明
toString() 返回当前对象本身的有关信息,返回字符串对象
equals() 比较两个对象是否是同一个对象,若是,返回true,反之返回false
clone() 生成当前对象的一个副本,并返回
hashCode() 返回该对象的哈希代码值
getclass() 获取当前对象所属的类信息,返回Class对象
(6)Object类中的equals()方法用来比较两个对象是否是同一对象,若是,返回true,字符串对象的equals()方法用来比较两个字符串的值是否相等,java.lang.String类重写了Object类中的equals()方法。
五.多态
1、 认识多态
(1)多态一词的通常含义是指能够呈现出多种不同的形式或形态。
(2)在程序设计的术语中,它意味着一个特定类型的变量可以引用不同类型的对象,并且自动地调用引用的对象的方法,也就是根据作用到的不同对象类型,响应不同的操作。
(3)方法重写是实现多态的基础。
(4)多态意味着在一次方法调用中根据包含的对象的实际类型(即实际的子类对象)来决定应该调用哪个方法,而不是由用来存储对象引用的变量的类型决定的。
当调用一个方法时,为了实现多态的操作,这个方法既是在父类中声明过的,也必须是在子类中重写过的方法。
2、 向上转型
(1)向上转型:子类向父类的转换称为向上转型。
(2)向上转型的语法格式如下:
<父类型> <引用变量> = new <子类型>();
-->将一个父类的引用指向一个子类对象称为向上转型,系统会自动进行类型转换。
-->此时通过父类引用变量调用的方法是子类覆盖或继承了父类的方法,不是父类的方法。
-->此时通过父类引用变量无法调用子类特有的方法。
3、 向下转型
(1)向上转型中,父类引用变量无法调用子类特有的方法,如果需要调用子类特有的方法,可以通过把父类转换为子类来实现。
(2)向下转型:将一个指向子类对象的父类引用赋给一个子类的引用,即将父类类型转换为子类类型,称为向下转型,此时必须进行强制类型转换。
(3)向下转型的语法格式如下:
<子类型> <引用变量名> = (<子类型>)<父类型的引用变量>;
(4)上述这种向下转型的操作对接口和抽象(普通)父类同样适用。
4、 instanceof运算符
(1)在向下转型的过程中,如果不是转换为真实子类类型,会出现类型转换异常(ClassCastException)。
(2)在Java中提供了instanceof运算符类进行类型的判断。
(3)使用instanceof时,对象的类型必须和instanceof后面的参数所指定的类有继承关系,否则会出现编译错误。
(4)instanceof通常和强制类型转换结合使用。
5、多态的优势主
可替换性:多态对已存在的代码具有可替换性。
可扩充性:多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特征的运行和操作。实际上新加子类更容易获得多态功能。
接口性:多态是父类向子类提供了一个共同接口,由子类来具体实现。
灵活性:多态在应用中体现了灵活多样的操作,提高了使用效率。
简化性:多态简化了应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。
6、多态的两种主要应用形式
1、 使用父类作为方法的形参
2、 使用父类作为方法的返回值