JAVA多态的实现方式

多态从实现的角度分为:静态多态和动态多态

      静态多态也叫做编译时多态

      动态多态也叫做运行时多态  

1.静态的多态:

函数重载是静态的多态的一种实现形式:

举例说明:

class  MethodOverloading { 
     viod receive(int i) { 
        System.out.println("Received one int data"); 
         System.out.println("i="+i); 
     } 
      viod receive(float f) { 
         System.out.println("Received one float data"); 
          System.out.println("f="+f); 
     } 
     viod receive(String s) { 
          System.out.println("Received a String"); 
          System.out.println("s="+s); 
     } 
    } 

<pre>
方法重载是在编译时就已经确定的,所以属于静态多态

2.动态的多态:

      子类覆盖父类的方法,将子类的实例传与父类的引用调用的是子类的方法;实现接口的实例传与接口的引用调用的实现类的方法。   

举例说明

例一:

public class A{

 public void fun1(){

    System.out.println("I'm A");
}


}

public class B extends A{

  public void fun1(){

    System.out.println("I'm A");
  }

}

public Test{

 public static void main(String[]args){

   A  a1 = new A();
   A  a2 = new B();
   a1.fun1();
   a2.fun1()

}

}

 

输出:I'm A

            I'm B

例二:

public interface A{

 public void fun1(){}


}

public class B implements A{

  public void fun1(){

    System.out.println("I'm B");
  }

}
public class B implements A{

  public void fun1(){

    System.out.println("I'm C");
  }

}

public Test{

 public static void main(String[]args){

   A  a1 = new B();
   A  a2 = new C();
   a1.fun1();
   a2.fun1()

}

}


 

输出:I'm B          

            I'm C


 

<think>我们正在讨论Java中的多态实现方式。根据用户提供的引用内容,我们可以知道Java中的多态主要分为两种:编译时多态(重载)和运行时多态(重写)。下面我将详细解释这两种多态Java中的实现方式。 1. **编译时多态(静态多态)**: - 通过方法重载(Overloading)实现。 - 在同一个类中,有多个同名方法,但它们的参数列表不同(参数类型、个数、顺序至少有一个不同)。 - 编译器在编译时根据方法签名(方法名和参数列表)确定调用哪个方法,因此称为编译时多态。 2. **运行时多态(动态多态)**: - 通过方法重写(Overriding)和继承实现。 - 子类继承父类,并重写父类的方法。 - 在运行时,根据对象的实际类型(而不是引用类型)来决定调用哪个方法。这需要满足以下条件: - 继承关系 - 子类重写父类的方法 - 父类引用指向子类对象(向上转型) 此外,我们还可以提到接口多态(通过接口和实现类)和抽象类多态(通过抽象类和子类),这实际上也是运行时多态的表现形式。 接下来,我们使用用户提供的示例代码[^3]来说明运行时多态: ```java class Animal { String name; int age; public Animal(String name, int age) { this.name = name; this.age = age; } public void eat() { System.out.println(name + "吃饭"); } } class Cat extends Animal { public Cat(String name, int age) { super(name, age); } @Override public void eat() { System.out.println(name + "吃鱼~~~"); } } class Dog extends Animal { public Dog(String name, int age) { super(name, age); } @Override public void eat() { System.out.println(name + "吃骨头~~~"); } } public class Test1 { // 编译器在编译代码时,并不知道要调用Dog 还是 Cat 中eat的方法 // 等程序运行起来后,形参a引用的具体对象确定后,才知道调用那个方法 // 注意:此处的形参类型必须是父类类型才可以 public static void eat(Animal a) { a.eat(); } public static void main(String[] args) { Cat cat = new Cat("小咪", 20); Dog dog = new Dog("旺财", 10); eat(cat); // 输出:小咪吃鱼~~~ eat(dog); // 输出:旺财吃骨头~~~ } } ``` 在这个例子中,`eat`方法的形参类型是父类`Animal`,但实际入的是子类`Cat`和`Dog`的对象。在运行时,JVM根据实际对象的类型调用相应的方法,这就是运行时多态。 另外,我们还可以通过方法重载来展示编译时多态: ```java class Calculator { // 方法重载:同名方法,参数列表不同 public int add(int a, int b) { return a + b; } public double add(double a, double b) { return a + b; } public int add(int a, int b, int c) { return a + b + c; } } public class Test2 { public static void main(String[] args) { Calculator calculator = new Calculator(); System.out.println(calculator.add(1, 2)); // 调用add(int, int) System.out.println(calculator.add(1.5, 2.5)); // 调用add(double, double) System.out.println(calculator.add(1, 2, 3)); // 调用add(int, int, int) } } ``` 总结一下,Java多态实现方式主要有两种: 1. 编译时多态(静态多态):通过方法重载实现。 2. 运行时多态(动态多态):通过方法重写和继承(或接口实现实现。 最后,我们生成一些相关问题: §§相关问题§§ 1. Java中方法重载和方法重写的区别是什么? 2. 为什么Java的运行时多态需要父类引用指向子类对象? 3. 接口多态Java中是如何实现的? 4. Java中的静态方法能实现多态吗?为什么? </think>### Java多态实现方式Java语言中,多态主要通过**运行时多态(动态绑定)** 实现,其核心机制依赖于继承体系、方法重写和JVM的动态绑定能力。以下是具体实现方式: #### 1. **运行时多态(动态绑定)** **实现原理**: - 基于继承关系:子类继承父类 - 方法重写(Override):子类覆盖父类方法 - 向上转型(Upcasting):父类引用指向子类对象 - **动态绑定**:JVM在运行时根据对象的实际类型(而非引用类型)决定调用哪个方法[^1][^2] **必要条件**: ```java class Animal { public void makeSound() { System.out.println("Animal sound"); } } class Cat extends Animal { @Override // 方法重写 public void makeSound() { System.out.println("Meow!"); } } public class Main { public static void main(String[] args) { Animal myPet = new Cat(); // 向上转型:Animal引用指向Cat对象 myPet.makeSound(); // 输出"Meow!"(运行时动态绑定) } } ``` - **关键特性**: - 通过`@Override`注解显式声明重写 - JVM使用**虚方法表(vtable)** 实现动态绑定[^1] - 性能开销极小(现代JVM优化完善) - 支持接口多态(通过`implements`实现) #### 2. **编译时多态(静态绑定)** **实现方式**:方法重载(Overload) ```java class Calculator { // 重载add方法(参数类型不同) public int add(int a, int b) { return a + b; } public double add(double a, double b) { return a + b; } } public class Main { public static void main(String[] args) { Calculator calc = new Calculator(); System.out.println(calc.add(2, 3)); // 调用int版本 System.out.println(calc.add(2.5, 3.7)); // 调用double版本 } } ``` - **特点**: - 编译时根据参数签名确定方法版本 - 零运行时开销 - 需在同一个类中实现[^2] #### 3. **接口多态** **实现方式**:通过接口实现多继承效果 ```java interface Flyable { void fly(); // 抽象方法 } class Bird implements Flyable { @Override public void fly() { System.out.println("Flapping wings"); } } class Airplane implements Flyable { @Override public void fly() { System.out.println("Using jet engines"); } } public class Main { public static void testFlight(Flyable f) { // 接口引用 f.fly(); // 动态绑定到具体实现 } public static void main(String[] args) { testFlight(new Bird()); // 输出"Flapping wings" testFlight(new Airplane()); // 输出"Using jet engines" } } ``` #### 多态实现对比 | 类型 | 实现机制 | 绑定时机 | 依赖关系 | |--------------|------------|----------|----------------| | 运行时多态 | 方法重写 | 运行时 | 继承/接口 | | 编译时多态 | 方法重载 | 编译时 | 参数签名差异 | | 接口多态 | 接口实现 | 运行时 | 接口契约 | **关键优势**: 1. **代码扩展性**:新增子类无需修改现有代码(开闭原则)[^3] 2. **解耦**:调用方只需关注父类/接口规范 3. **可替换性**:同一接口支持不同实现(如不同数据库驱动) > ⚠️ **注意**:Java多态仅适用于**实例方法**,静态方法/私有方法/字段访问均为静态绑定[^1][^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值