面向对象④
抽象类
-
抽象方法
-
抽象方法是一种特殊的方法:它只有方法的声明(定义public void text( )),而没有具体的实现. 抽象方法必须用abstract关键字进行修饰.
Animal
eat( ){
动物吃东西
}
动物类型很大,在类体结构位于上层,里面实现与大多数子类实现都可能不一样
在上层类中实现功能,就没有必要了,但是程序设计时,应该在上层定义这一类型应该有什么功能.然后让子类继承父类,在子类中对抽象方法进行重写.
抽象类:被abstract 关键字修饰的类,里面可能包含抽象方法,当类中没有足够的信息(抽象方法)来描述一个具体的对象时
抽象类除了不能创建对象,类的其他功能都正常(成员变量,成员方法,构造方法)
当一个具体的类继承抽象类后,要么重写抽象类中抽象方法;要么将此类声明为抽象类,这个具体的类重写父类方法时,只能调用无参方法.
多态(多种状态)
同一个父类,可以表示不同的子类对象,状态就不同了
父类引用指向子类对象,从而产生多种形态
Animal dog = new Dog();
Animal cat = new Cat();
同一种事物,在不同时刻表现不同状态
二者存在直接或者间接的继承关系时,父类引用指向子类的对象,即形成多态。
多态的好处:
提高程序的扩展性
多态注意事项
注意成员调用时,分为编译期间和运行期间
编译期间:写代码时 由于类型上升为父类类型,所以只能调用到父类中定义的成员.
运行期间:运行代码时,实际调用的是子类中重写的方法
对应非静态成员方法:编译看左边,运行看右边
多态的缺点
对应静态成员方法和成员变量都是编译看左边,运行看左边
为了实现多态性,我们将子类类型向上转为了父类类型,但是一旦类型上升为父类类型,那么就调用不到子类中特有的方法,这就是多态在某种情况下的缺点。
解决办法:向下转型,把父类类型转为子类类型.
Dog d = (Dog)dog;
d.lookHome();//强制转型
final关键字
final 用于修饰类,方法,参数,和成员变量
final不能修饰抽象类和接口,因为final修饰的类不能被继承final修饰方法,修饰后方法不能被子类重写
final修饰方法的参数,在方法内部,就不能修改参数值
final修饰成员变量,
情况①:在编码时,值就确定了,就直接进行赋值,此种情况最好加上static关键字,让其在内存中只有一份.
情况②:每一个情况中都有一个常量,必须在构造方法中为常量进行初始化,一旦初始化后,值都不能修改
不能被定义为抽象类或是接口,因为final修饰的类不可被继承
接口
接口:是一种更为彻底的抽象,主要来定义功能
接口是不能被创建对象的
jdk8以后接口可以定义四种内容:
1.静态常量
2.抽象方法
3.静态方法
4.默认方法:需要类继承,然后通过子类调用
类实现接口,一个类可实现多个接口
MyInterfaceImpl类就是MyInterface接口的实现类
一个类只能直接继承一个类,问接多层继承多个类
一个类可以实现多个接口
一个接口可以继承多个接口
接口和实现类之间也是可以有多态关系的
用一个接口,表示一类拥有此功能的类
接口的特性
接口是隐式抽象的,主要用来定义功能.
接口中可以定义静态常量,抽象方法,静态方法,默认方法
一个接口能继承其它多个接口.
接口不能实例化对象
接口是要被类实现,一个接口可以被多个实现
当类实现接口的时候,类要实现接口中所有的抽象方法,否则,该类必须声明为抽象的类.
接口与实现类之间存在多态性