多态前提:
1.需要有继承/实现的关系
2.方法重写
3.父类的引用指向了子类对象/接口的应用指向了实现类的对象
多态成员的访问:
1.成员变量:编译看左边(父类),执行看左边(父类)
2.成员方法:编译看左边(父类),执行看右边(子类),如果右边没有,会继承父类
3.构造方法:和继承一样,每个构造方法默认第一行都会有super() 去访问父类的无参构造
public class Test {
public static void main(String[] args) {
//父类的引用指向了子类的对象
Animal animal = new Dog();
animal.eat();
//狗吃肉
System.out.println(animal.a);
//10
animal.show();
//子类的show方法
animal.show2();
//不打印,在父类中有show2,但在子类中没有show2,继承父类
}
}
abstract class Animal{
int a = 10;
public abstract void eat();
public void show(){
System.out.println("父类的show方法");
}
public void show2(){
}
}
class Dog extends Animal{
int a = 30;
@Override
public void eat() {
System.out.println("狗吃肉!");
}
public void show(){
System.out.println("子类的show方法");
}
}
多态的优缺点
优点:
提高代码的扩展性。
缺点:
不能访问子类的特优功能。
instanceof
格式 对象名 instanceof 应用数据类型
Animal.java
public abstract class Animal {
public abstract void eat();
}
class Dog extends Animal{
@Override
public void eat() {
System.out.println("狗吃肉");
}
public void lookHome(){
System.out.println("狗看家");
}
}
class Cat extends Animal{
@Override
public void eat() {
System.out.println("猫吃鱼");
}
public void CatchMouse(){
System.out.println("猫捉老鼠");
}
}
class Pig extends Animal{
@Override
public void eat() {
System.out.println("猪吃白菜");
}
public void sleep(){
System.out.println("🐖特变能睡");
}
}
Test.java
public class Test {
public static void main(String[] args) {
useAnimal(new Dog());
useAnimal(new Cat());
useAnimal(new Pig());
}
public static void useAnimal(Animal animal){
animal.eat();
if(animal instanceof Dog){
Dog dog = (Dog) animal;
dog.lookHome();
}
//狗转猫报错
if (animal instanceof Cat) {
Cat cat = (Cat) animal;
cat.CatchMouse();
}
if (animal instanceof Pig) {
((Pig)animal).sleep();
}
}
}
学的不是技术,更是梦想!!!