多态
概念:多态指一个事物在不同情况下的状态
前提:
- 必须有继承
- 同时子类必须对父类的方法进行重写
- 父类的引用必须指向子对象
Father s = new Son();
多态中成员访问的特点
- 如果是成员变量或者静态方法,那么编译和运行都看左边即父类
- 如果是成员方法,那么编译看左边,运行看右边即子类
多态的优点及弊端
- 优点:提高了代码的维护性以及扩展性(下面有例子)
- 弊端:不能使用子类的特有属性和行为
向下转型及向上转型
- 向上转型:将子类的对象指向给父类的引用
Father s = new Son();
- 向下转型:当父类想要使用子类的特有方法或者属性时,需要进行向下转型(强制转换),这时就需要将父类引用指向给子类引用
Son s2 = (Son)s;
public class Polymorphism {
public static void main(String[] args) {
//必须父类引用指向子对象
Father s = new Son();
s.show(); //输出结果为:I'm son
// s.print();这是错的,因为父类没有这个方法,要实行强制转换
System.out.println(s.num); //输出结果为在父类定义的num==10
/*
* 强制转换的方法
* 如果有多个子类,可以用instanceof进行类型判断(可以看菜鸟的多态),这体现了多态的扩展性
*/
Son s2 = (Son)s;
s2.print(); //输出结果为:I'm son,this method only belong to me
}
}
class Father{
int num = 10;
public void show(){
System.out.println("I'm father");
}
}
//多态必须有继承,并且子类必须重写父类的方法
class Son extends Father {
int num = 20;
public void show() {
System.out.println("I'm son");
}
public void print() {
System.out.println("I'm son,this method only belong to me");
}
}
抽象类
特点
- 必须使用abstract关键字进行修饰
- 抽象类不一定有抽象方法,有抽象方法的类一定是抽象类或者是接口
- 抽象类的子类肯定是抽象类或者会重写抽象类中的所有抽象方法
abstract不能以下关键字共存
- static 产生矛盾,static在类加载时就加载了,而abstract是要求必须重写
- private 同样abstract要求必须重写,但是private不行
- final 因为final是个最终的方法 ,不能被重写,也产生了矛盾
public class Abstract {
public static void main(String[] args) {
Zi zi = new Zi();
zi.show(); //输出结果I'm son
zi.print(); //输出结果I'm father
/*
* 抽象类的实例化
* 第一种:Fu f = new Zi;
* 第二种:匿名内部类,会产生一个JVM提供名字的class文件
new Fu() {
public void show() {
System.out.println("I'm father");
}
}.show();
*/
}
}
abstract class Fu {
public abstract void show();
public void print() {
System.out.println("I'm father");
}
}
class Zi extends Fu {
public void show() {
System.out.println("I'm son");
}
}
接口
概念
接口用关键字interface表示,类实现接口用implements表示,接口不能实例化,接口中所有的抽象方法都必须被重写
特点
- 成员变量只能是常量,用public stasic final修饰
- 接口没有构造方法也不能被实例化,因为成员方法全都是抽象的也只能是抽象的
package com.hepu.javawebclass.oop.polymorphism;
public class Interface {
public static void main(String[] args) {
Phone phone = new Phone();
phone.usb();
}
}
interface Computer {
void usb();
}
class Phone implements Computer {
public void usb() {
System.out.println("charging...");
}
}
class Camera implements Computer {
public void usb() {
System.out.println("transmitting...");
}
}
抽象类和接口的区别
- 抽象类可以有普通变量也可以有常量,但是接口只能public static final 类型的常量;
- 一个类只能继承一个抽象类,而一个类却可以实现多个接口