多态
多态的定义:父类的子类对象。
比如:猫可以有很多种类 Cat cat=new Cat();
猫也属于动物 Animal animal=new Cat();多态的前提
1.有继承关系
2.有方法重写
3.有父类引用指向子类对象 就比如Animal animal=new Cat();多态中成员访问特点
定义一个Person类和Student类
Person p = new Student();
//静态方法:编译看左边,运行看左边
p.sleep();//父类的静态sleep方法
//成员方法:编译看左边,运行看右边
p.eat();//学生类重写的eat方法
p.play();//学生类重写的play方法
//p.sleep()和p.hehe()都调不到
//需要向下转型才可以调用学生类的独有方法和静态方法
Student student=(Student) p;
student.sleep();//学生类的sleep静态方法
student.hehe();//学生类独有的方法
//成员变量:编译看左边,运行看左边。 p是person类收的 student是student类收的
int age1 = p.age;
System.out.println(age1);//70 父类的年龄
int age2 = student.age;
System.out.println(age2);//20 子类的年龄
- 多态的好处:
1.提高了代码的维护性
2.提高了代码的扩展性 - 多态的弊端:
1.父类的引用对象不能访问子类独有的方法,若要访问,需要向下转型
抽象类
在父类中不给出具体体现,只在父类中给出一个声明,在Java中,一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类。
抽象类中的特点:
1.抽象类和抽象方法必须用abstract关键字修饰
抽象类格式:abstract class 类名 {};
抽象方法格式: public abstract void eat();
2.抽象类不一定有抽象方法,有抽象方法的类一定是抽象类
3.抽象类不能实例化,也就是不能直接创建对象,只能用多态的方式间接创建
4.抽象类的子类要么是抽象类,要么是重写抽象类中的所有抽象方法抽象类的成员特点
public abstract class Aniaml {
// 成员变量:抽象类中可以定义成员变量,也可以定义成员常量
public int age;
public int NUM = 100;//默认 static final
// 抽象类中构造方法
public Aniaml() {
super();
// TODO Auto-generated constructor stub
}
public Aniaml(int age) {
this.age = age;
}
// 抽象类中可以有抽象方法,也可以有非抽象方法
// 非抽象方法子类继承
public void show() {
System.out.println("非抽象方法");
}
// 抽象方法 强制子类做的事情
public abstract void eat(String name);
}
- abstract不能和哪些关键字共存?
1.不能和private共存:private修饰的方法子类不能继承,因为不能重写,而abstract 又要去重写。
2.不能和 final共存:final 修饰的方法可以继承但是不能重写,abstract 又要去重写
3.不能和static 共存:静态方法不重写
接口
- 接口定义:定义一些扩展功能,如果哪个类需要这个功能就实现此接口
接口特点:
1.接口用关键字interface表示
格式: interface 接口名 {}
2.类实现接口用implements表示
格式:class 类名 implements 接口名 {}
ps:
(1)接口不能直接创建对象,只能通过多态的方式创建其对象
(2)接口可以多实现 一个类可以实现多个接口接口成员特点:
(1)成员变量:只能是常量,并且是静态的。
默认修饰符:public static final
(2)构造方法:接口没有构造方法。
(3)成员方法:只能是抽象方法,默认 public abstract