多态:可以理解为事物存在的多种体现形态,比如说人:学生、老师;动物:猫,狗。
看图
此处 College是Student的子类,是具有继承(父子关系)的两个类
s=c//这就是多态
表面理解,大学生可以归属到学生里。(但这里记住,大学生必须继承学生)
按类划分:College是归属Student父类的子类
实际运用时还可写成
Student s=new College();
注意:s=c后,再用s这个父类中的方法,相当于调用c这个子类中从s中继承的方法,如果已被重写,使用重写过后的方法。c中特有的s无法使用。
abstract:只能修饰类和方法
修饰类:表示该类是一个抽象类,必须被继承
修饰方法:如果修饰方法则该方法必须被重写,如果一个类中有一个以上的抽象方法, 则该类必须为抽象类。
使用abstract修饰的方法,只有方法的名称没有方法体。
【抽象类不一定是有抽象方法,但是抽象方法的类必须是抽象类】
抽象类:是把相同功能的信息抽取出来,并作为一个类的继承模板。它本身是一个类,具有除创建对象外的所以类的功能。
具体运用,如我们有一个需求,定义吃方法,它的参量是食物对象,那就需要定义一个食物类,吃食物,这就是一个不够实例化,抽象的过程,我们可以吃?,吃肉,吃鸡,这些类又有自己各自相同或不相同的属性,全部写出来太麻烦,那我们就可以给这些具体的子类和食物这个抽象的父类建立继承关系,将代码简单化
public abstract class Food {//抽象,使其无法实例化
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
///
public class Duck extends Food {
public Duck() {
super.setName("芦花鸭");
}
}
///
public class Cock extends Food {
public Cock() {
super.setName("芦花鸡");
}
}
public abstract class Person {
private String name;
public Person(String name) {
this.name = name;
}
public void eat(Food c) {
System.out.println(this.name+"吃"+c.getName());
}
public abstract void speak(); //抽象方法,必须在抽象类
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
这里我将人抽样,被用于子类更具体的中国人类调用
public class 中国人 extends Person {
public 中国人 (String name){
super(name);
}
public void speak() {//抽象的在子类里要实现
System.out.println("中文");
}
}
注意:在抽象类中的抽象方法,必须要在子类中实现
public class T2 {
public static void main(String[] args) {
//已抽象Person p=new Person("张三");
Person p= new 中国人("张三");//new了一个中国人,确是Person
Cock c=new Cock();
p.eat(c);
Duck d=new Duck();
p.eat(d);
//Food a=new Food();
//p.eat(aa);吃食物是抽象行为,没有具体,不用它
}
}