多态
所谓多态就是值程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中是实现的方法,必须在由程序运行期间才能确定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性
多态:就是父类的引用指向子类的对象
多态的条件
- 类与类之间存在继承关系
- 必须要有方法的重写
- 有父类的引用指向子类的对象
类型转换
向上转型 自动完成
向下转型 强制转换(在转换之前需要使用 instanceof 来进行判断)
当多态访问成员变量的时候:
如果子类和父类中都存在,访问是父类
如果要访问子类中特有的成员变量:进行向下转型。
当使用多态访问成员方法的时候:
如果子类重写了父类的方法,访问的是子类的
如果要访问子类中特有的成员方法:进行向下转型。
使用多态访问类中的成员(静态和非静态)
成员变量:编译看左边,运行看左边
成员方法:编译看左边,运行看右边
静态的方法/变量:编译看左边,运行看左边
相关代码示例
public class Animal {
private String name;
int num = 10;
static int a = 50;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public static void feed(){
System.out.println("喂养食物");
}
public void showInfo() {
System.out.println(this.name);
}
}
public class Dog extends Animal{
int num = 100;
int num2 = 200;
static int a = 500;
public static void feed() {
System.out.println("骨头....");
}
public void work() {
System.out.println("狗看家....");
}
}
public class Cat extends Animal {
public static void feed() {
System.out.println("吃鱼.....");
}
}
public class Person {
/*public void feedDog(Dog d) {
d.feed();
}
public void feedCat(Cat c) {
c.feed();
}*/
public void feedAnimal(Animal a) {
a.feed();
}
}
public class Test {
public static void main(String[] args) {
//1 创建一个饲养员
Person p1 = new Person();
// 2 创建一只动物
Dog d = new Dog();
// 3 调用饲养员的喂养的方法 喂养动物
//p1.feedDog(d);
d.setName("旺财");
p1.feedAnimal(d);// Animal a = new Dog()
d.showInfo();
Cat c = new Cat();
//p1.feedCat(c);
c.setName("Tom");
c.showInfo();
p1.feedAnimal(c);// Animal a = new Cat();
}
}
public class Test2 {
public static void main(String[] args) {
//多态,当编译的时候,此时a1 是animal的类型
//只有到运行的时候,才会知道a1是一只Dog
Animal a1 = new Dog();
Animal a2 = new Cat();
a1.feed();
//当我们使用了多态的时候,那么就不能去调用子类特有的方法
//a1.work();
Dog d1 = new Dog();
d1.work();
//类型转换:向上转型/向下转型
/*
* 向上转型可以自动完成
* 向下转型:强制转换
* byt b = (byte)i;
*/
Dog d2 = (Dog)a1;
d2.work();
//Cat c1 = (Cat)a1;
// instanceOf 判断某一个引用是否是一个类的实例对象
if(a1 instanceof Dog) {
Dog d3 = (Dog)a1;
d3.work();
}
if(a1 instanceof Cat) {
Cat c2 = (Cat) a1;
}
System.out.println("--------------------");
System.out.println(a1.num);
System.out.println(d2.num2);
System.out.println(a1.a);
System.out.println(d2.a);
a1.feed();
d2.feed();
}
}