继承与多态 、抽象类、接口
继承:
- 继承是类与类的一种关系
- java中的继承是单继承
继承的好处:
- 子类拥有父类的所有属性和方法。(修饰符不能是private)
- 实现代码的复用
语法规则:
class 子类 extends 父类 {
......
}
java中的方法重写:
如果子类对继承父类的方法不满意,是可以重写父类的方法的,当调用方法时会优先调用子类的方法。
语法规则:
返回值类型、方法名、参数类型及个数 都要与父类继承的方法相同,才叫方法的重写。java中的继承初始化顺序
初始化父类再初始化子类
先执行初始化对象中的属性,再执行构造方法中的初始化
java中的final的使用
- final关键字做标识有“最终的”含义。
- final可以修饰类、方法、属性、变量
- final修饰类,则该类不能被继承
- final修饰方法,则该方法不允许被覆盖(重写)
- final修饰属性,则该类的属性不会进行隐式的初始化(类的初始化属性必须有值)或在构造方法中赋值(但只能选其一)
final修饰变量,则该变量的值只能赋一次值,即变为常量
java中的super的使用
super关键字:
在对象的内部使用,可以代表父类对象。
1、访问父类的属性
super.age
2、访问父类的方法
super.eat();
- 子类的构造的过程当中必须调用其父类的构造方法。(隐式使用了super)
- 如果子类的构造方法中没有显示调用父类的构造方法,则系统默认调用父类无参的构造方法。
- 如果显示的调用构造方法,必须在子类的构造方法的第一行。
- 如果子类构造方法中既没有显示调用父类的构造方法,而父类又没有无参的构造方法,则编译出错。
java中的object类
object类是所有类的父类,如果一个类没有使用extend是关键字明确标识继承另外一个类, 那么这个类默认继承object类。
object类中的方法,适合所有子类。
-
object类的几个重要方法:
1、toString()方法- 在Object类里面定义toString()方法的时候返回的对象的哈希code码(对象地址字符串)
- 可以通过重写toString()方法表示出对象的属性
2、equals()方法
- 比较的是对象的引用是否指向同一块内存地址。
- Dog dog = new Dog();
- 一般情况下比较两个对象时比较他的值是否一致,所以要进行重写。
Java中的多态
- 继承是多态实现的基础
- 对象的多种形态
- 引用多态:
父类的引用可以指向本类的对象
父类的引用可以指向子类的对象
Animal obj1 = new Animal();
Animal obj2 = new Dog(); - 方法多态:
创建本类对象时,调用的方法为本类方法
创建子类对象时,调用的方法为子类重写的方法或者继承的方法
多态中的引用类型转换:
向上类型转换(隐式/自动类型转换),是小类型到大类型的转换
Dog dog = new dog();
Animal animal = dog;
向下类型转换(强制类型转换),是大类型到小类型(存在风险)
Dog dog2 = animal;(不可以转换);
Dog dog2 = (Dog)animal;(可以,强制内型转换)
instanceof运算符,来解决引用对象的类型,避免类型转换的安全性问题
if(animal instanceof Cat ){
Cat cat = (Cat) animal;
}else{
……
}
java中的抽象类
- 语法定义:
抽象类前使用abstract关键字修饰,则该类为抽象类。 - 应用场景:
a、在某些情况下,某个父类只是知道其子类应该包含怎样的方法,但无法
准确知道这些子类如何实现这些方法。(约束子类有哪些方法,并不关注如何实现的)
b、从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为子类的模板,从而避免了子类设计的随意性 - 作用:
限制规定(约束)子类必须实现某些方法,但不关注实现细节 - 使用规则:
a、abstract定义抽象类
b、abstract定义抽象方法、只有声明,不需要实现
c、包含抽象方法的类是抽象类
d、抽象类中可以包含普通的方法、也可以没有抽象方法
e、抽象类不能直接创建、可以定义引用变量
父类文件
// 抽象类 -- 父类
public abstract class TelPhone {
// abstract定义抽象方法、只有声明,不需要实现
public abstract void call();
public abstract void sendMsg();
}
子类文件
public class CellPhone extends TelPhone {
public void call() {
System.out.println("打电话");
}
public void sendMsg() {
System.out.println("发短信");
}
}
java中的接口
接口的概念:
接口可以理解为一种特殊的类,由全局常量和公共的抽象方法所组成。类是一种具体实现体,而接口定义了某一批类所需要遵守的规范,接口不关心这些类的内部数据,也不关心这些类里方法的实现细节,它只规定这些类里必须提供某些方法。
接口的定义:
和类定义不同,定义接口不再使用class关键字,而是使用interface关键字接口定义的基本语法:
[修饰符] interface 接口名 [extends 父接口1,父接口2...]
{
零个到多个常量定义。。。
零个到多个抽象方法的定义。。。
}
接口就是用来被继承、被实现的、修饰符一般建议使用public
注意:不能使用private和protected修饰接口
接口定义:
1、常量:接口中的属性是常量,即使定义时不添加public static final 修饰符,系统也会自动加上
2、方法:接口中的方法只能是抽象方法,即使定义时不添加public static final 修饰符,系统也会自动加上使用接口:
一个类可以实现一个或多个接口实现接口使用implements关键字,java中一个类只能继承一个父类,是不够灵活的,通过实现多个接口可以补充。继承父类实现接口的语法为:
【修饰符】class 类名 extends 父类 implements 接口1,接口2....
{
类体部分// 如果继承了抽象类,需要实现继承的抽象方法;要实现接口中的抽象方法。
}
//如果要继承父类,继承父类必须在实现接口之前