抽象类的格式 abstract class 父类名(Animal){ } 抽象方法的格式: public abstract(必须写) 方法名() ; 注意: 1)如果一个类中有抽象方法,那么这个类一定抽象类 2)抽象类中一定有抽象方法吗? 还可以非抽象的 抽象类的特点: 1)抽象类不能直接实例化(不能直接创建对象) 2)子类必须重写父类的抽象功能 抽象类的子类: 1)抽象类的子类如果是抽象类呢? 没有任何意义,因为使用的就是通过具体类创建对象,具体类都抽象类,没意义!
2)子类是具体类的话,对象的创建工作,由子类完成--->父类名 对象名 = new 子类名() ; 抽象类多态
实际工作中: 1)接口多态(用的最多) 2)抽象类多态 3)具体类对象的创建 抽象类成员的特点: 成员变量: 可以是变量,也可以是一个常量(自定义常量) 构造方法: 所有的构造方法都是给对象进行初始话:1)默认初始化 2)显示初始化 成员方法: 可以是抽象的方法,也可以非抽象的方法
多态:某个事物在不同时刻体现出来的不同状态!
水: 事物
液态 气态 固态
多态的前提条件:
1)必须有继承关系
2)必须方法重写
猫狗案例:每个动物具体的吃的功能是不一样,必须有方法重写,将父类的功能覆盖掉!
3)必须有父类引用指向子类对象 :向上转型
格式:
父类名 对象名 = new 子类名() ;
多态中的成员访问特点 1)成员变量的访问特点: 编译看左,运行看左 (左:父类) 2)成员方法(一般没有强调静态方法都是非静态的)的访问特点: 编译看左,运行看右 3)构造方法:作用:就是给对象进行初始化的 4)静态的成员方法的访问特点: 多态的好处: 1)提高代码的扩展性(由多态保证) 2)提高代码的维护性(由继承关系) 编译看左,运行看左(静态的成员方法算不上方法重写,因为静态的都和类有直接关系!) 多态的弊端: 不能访问子类的特有功能. 最优秀的方式:使用向下转型:将父类对象强制转换为子类的引用 格式: 子类名 子类对象名 = (子类名)父类的对象; 注意: 向下转型使用不当的时候,会出现一个异常:ClassCastExceptino:类转换异常 类的初始化 继承过程中,分层初始化;首先父类初始化,然后是子类 创建一个类的对象的时候,是通过构造方法创建对象,构造方法的作用:给对象进行初始化话的 继承中的成员方法访问特点: 子类继承父类,当成员方法名称不一致的时候,分别调用 当成员方法名称一致的情况,首先在子类中有么有该方法,如果有,就调用;如果没有,就调用父类的成员方法; 方法重写:override:继承里面的技术 当子类出现了和父类一模一样的方法的时候,子类的方法会重写(覆盖,复写)父类的方法,调用的子类的功能 方法重载:overload:方法里面的 在方法中,多个方法名相同,并且他的参数列表不同,与返回值无关 参数列表不同: 1)参数个数不同 2)参数类型不同 接口:(开发过程中要遵循面向接口编程!) 将一些额外(扩展)功能,暴露出来,只要哪些类实现了这个接口,就一定要取实现接口中的功能! 格式: interface 接口名{ } 接口的实现类和接口之间是一种实现关系 class 类名 implements(实现) 接口名{ } 接口的子实现类: 1)如果接口的实现类是一个抽象类;没有意义,接口本身不能实例化,需要通过子实现类来进行实例化,如果子实现类 都被抽象了,不能创建对象了,这种没意义! 2)接口的实现类是具体类,接口名 对象名 = new 子实现类名() ; 接口多态(推荐方式:开发中这种方式最多) 接口不能实例化(不能创建对象) 实际开发中命名规则: 实现类命名规则:接口名+impl :实现类 接口的成员特点: 成员变量: 存在默认的修饰符: public static finla 构造方法:接口中没有构造方法 成员方法: 默认的修饰符:public abstract 关系的区别: 类与类的关系 extends:继承关系 单继承,不能多继承,但是可以多层继承 类与接口的关系:implements :实现关系 ,并且一个类继承另一个类的同时还能实现多个接口 接口与接口的关系: extends关系:可以是单继承,可以是多继承的! 任何类都需要继承自Object类,代表所有类的根类.