编程语言
首页 > 编程语言> > 学习笔记--Java面向对象的继承

学习笔记--Java面向对象的继承

作者:互联网

Java面向对象的继承

继承

public class ExtendsTest01 {

    public static void main(String[] args) {
        
        C c1 = new C();

        c1.doSome();    // 这里调用的doSome方法是从B类中继承的
    }
}

class A{
    public void doSome() {
        System.out.println("do some !");
    }
}

class B extends A{

}

class C extends B{

}

方法的覆盖

【回顾】Java中的·方法重载:

【正片】方法覆盖

// 创建动物类
public class Animal {
    
    public void move() {
        System.out.println("动物在移动");
    }
}
// 创建猫类
public class Cat extends Animal{
    
    // 重新父类方法
    public void move() {
        System.out.println("猫在走猫步");
    }
}
// 创建鸟类
public class Bird extends Animal{
    
    // 重新父类方法
    public void move() {
        System.out.println("鸟在飞");
    }
}
public class OverrideTest01 {
    
    public static void main(String[] args) {
        
        // 创建动物对象
        Animal a = new Animal();
        a.move();

        // 创建猫对象
        Cat c = new Cat();
        c.move();

        // 创建鸟对象
        Bird b = new Bird();
        b.move();
    }
}

多态

Java中多态机制【基础规则】

多态作用:

降低程序的耦合度【解耦合】,提高程序的可拓展性【尽量使用】

Animal、Cat、Bird三个类之间的关系:

// 创建动物类
public class Animal {
    
    public void move() {
        System.out.println("动物在移动");
    }
}
// 创建猫类
public class Cat extends Animal{
    
    // 重新父类方法
    public void move() {
        System.out.println("猫在走猫步");
    }

    // 不是从父类中继承的方法
    // 这个方法是子类对象特有行为
    public void catchMouse() {
        System.out.println("猫抓老鼠");
    }
}
// 创建鸟类
public class Bird extends Animal{
    
    // 重新父类方法
    public void move() {
        System.out.println("鸟在飞");
    }

    // 子类对象特有行为
    public void fly() {
        System.out.println("Bird fly !");
    }
}
public class Test {
    
    public static void main(String[] args) {
        
        // 以前编写的程序

        // 创建动物对象
        Animal a1 = new Animal();
        a1.move();

        // 创建猫对象
        Cat c1 = new Cat();
        c1.move();
        c1.catchMouse();

        // 创建鸟对象
        Bird b1 = new Bird();
        b1.move();

        // 使用动态机制
        System.out.println("-----以下使用动态机制----");

        Animal a2 = new Cat();  // 想象 long num = 10;
        // Cat is a Animal
        // new Cat()创建的对象类型是Cat,Animal a2中 a2 引用的数据类型是Animal,可见它们进行类型转换
        // 子类型转换父类型,称为向上转型(upcasting),或者自动类型转换

        // Bird b2 = new Cat();     Bird与Cat无继承关系
        

        // 编译器只会把a2类型视作Animal
        // 运行时是看底层的实际内容
        a2.move();  // 猫在走猫步

        // a2.catchMouse();     报错
        // 编译器检查为Animal类型,Animal中没有catchMouse()方法,导致静态绑定失败


        // 需求:需要a2去执行catchMouse()方法
        // 可以通过向下转型(downcasting),强制转换,同样需要两者有继承关系
        Cat c2 = (Cat)a2;
        c2.catchMouse();



        // 父类型引用指向子类型对象【多态】
        // 以下程序编译无错语法允许,但运行阶段报错JVM堆内存实际存在的是Bird对象
        // 类型之间不存在如何继承关系,会发生著名异常:java.lang.ClassCastException
        // 触发一般在向下转型(downcasting),一定注意

        // Animal  a3 = new Bird();
        // Cat c3 = (Cat)a3;

        // c3.catchMouse(); 报错    著名异常:java.lang.ClassCastException

        // 避免ClassCastException
        Animal  a3 = new Bird();

        if(a3 instanceof Cat) {
            Cat c3 = (Cat)a3;
            c3.catchMouse();
        }else if(a3 instanceof Bird){
            Bird b3 = (Bird)a3;
            b3.fly();
        }

    }
}

  1. java程序永远都分为编译阶段和运行阶段
  2. 先分析编译阶段,再分析运行阶段,编译无法通过,根本无法运行
  3. 编译阶段编译器检查a2这个引用的数据类型是Animal,由于Animal.class字节码当中有move()方法,所以编译通过,这个过程我们称为静态绑定,编译阶段绑定。只有静态绑定成功之后才有程序运行
  4. 在程序运行阶段,JVM堆内存中真实创建的对象是Cat对象,那么上述程序中 a2.move(); 一定调用Cat对象的move()方法【方法重写无关】,称为动态绑定,运行阶段绑定
  5. 无论重写与否,运行阶段只与底层实际关联

父类型引用指向子类型对象这种机制导致程序在编译阶段绑定和运行阶段绑定两种不同的形态,这种机制可以成为一种动态语法机制

标签:Java,--,继承,move,Cat,面向对象,Animal,Bird,public
来源: https://www.cnblogs.com/shadow-/p/15864519.html