多态:
指的是同一个方法可以根据不同的对象调用出不同的行为;简单来说;多态允许我们使用一个父类类型的引用来指向子类对象;并在运行时根据实际对象的类型来调用相应的方法;这样可以提高代码的灵活性和可扩展性。
- 多态是方法的多态;不是属性的多态(多态与属性无关)
- 多态的存在要有3个必要条件:继承;方法重写;父类引用指向子类对象。
- 父类引用指向子类对象后;用该父类引用调用子类重写的方法;此时多态就出现了。
- 使用父类做方法的形参和返回值;是多态使用最多的场合;即使增加了新的子类;方法也无需改变;符合开闭原则。
1.向上转型:
将子类对象赋给父类引用;称为向上转型;自动进行类型转换;向上转型可以调用的子类继承的方法;但不能调用子类特有的方法;需要特别理解的是如果子类重写了父类的方法;向上转型后通过父类引用调用的却是真实子类重写的方法。
优点: 直接转换
缺点: 不能调用子类中的独有的方法
·代码演示:
Animal类:
package ZX;
public class Animal {
public void eat() {
System.out.println("动物吃东西");
}
}
Cat类:
package ZX;
public class Cat extends Animal {
public void eat() {
System.out.println("猫在吃鱼!!");
}
public void catAction() {
System.out.println("猫给你干仗!!");
}
}
Test类:
package ZX;
public class Test {
public static void main(String[] args) {
Animal cat=new Cat();
cat.eat();
}
}
2.向下转型:
将父类的引用变量转换为子类类型;称为向下转型;向下转型后就可以调用子类特有的方法了。
优点:可以使用子类中的独有的方法
缺点: 类型转换异常
·代码演示:
Animal类:
package ZX;
public class Animal {
public void eat() {
System.out.println("动物吃东西");
}
}
Cat类:
package ZX;
public class Cat extends Animal {
public void eat() {
System.out.println("猫在吃鱼!!");
}
public void catAction() {
System.out.println("猫给你干仗!!");
}
}
Test类:
package ZX;
public class Test {
public static void main(String[] args) {
Animal cat = new Cat();
//向下转型
Cat animal = (Cat)cat;
animal.catAction();
}
}
抽象类:
- 没有方法体的方法就是抽象方法
- 抽象方法由abstract关键字修饰
- 抽象方法必须在抽象类中
- 抽象类由abstract修饰
- 抽象方法必须被子类重写 被重写成非抽象方法
- 抽象类不能被实例化 可以实例化其子类声明抽象类
- 抽象方法其实就是对子类的一种要求,抽象方法必须被重写
- 抽象类其实就是对子类众多要求的一个集合 抽象类就是多个要求的集中体现
- 如果子类不想重写父类的抽象方法,子类必须也是抽象类
- 子类要重写其所有层级父类中定义的抽象方法
- 抽象类中可以有非抽象方法 非抽象方法可以被子类继承 子类可以重写,也可以不去重写
- 抽象类的存在就是在可以在为众多子类提出要求的情况下,实现多态
- 抽象类虽然不能被实例化,但是仍然有构造方法,其实就是为满足继承中,子类的构造方法调用而准备的
接口:
接口是一个抽象类型;是抽象方法的集合;接口通常以interface来声明;一个类通过继承接口的方式;从而来继承接口的抽象方法。
语法:
[修饰符列表] interface 接口名{
}
特点:
- 接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)。
- 接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误)。
- 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。
权限修饰符:
- default (即默认;什么也不写): 在同一包内可见;不使用任何修饰符;使用对象:类;接口;变量;方法。
private : 在同一类内可见。使用对象:变量;方法; 注意:不能修饰类(外部类)。
public : 对所有类可见;使用对象:类;接口;变量;方法。
protected : 对同一包内的类和所有子类可见;使用对象:变量;方法; 注意:不能修饰类(外部类)。
同一类中 | 同一包中 | 不同包中子类 | 其他 | |
public | √ | × | × | × |
protected | √ | √ | × | × |
default | √ | √ | √ | × |
private | √ | √ | √ | √ |