Java——多态(Polymorphism)

一、多态

1、什么是多态

多态(Polymorphism)是面向对象编程的三大核心特性之一(另外两个是封装和继承)。多态性允许一个接口或基类的不同实现或子类以统一的方式处理。

二、方法多态

方法的多态性主要通过方法重载(Overload)和方法重写(Override)来实现。

1、方法重载实现方法多态

package com.pack1;

public class Test {
	public static void main(String[] args) {
		Cal cal = new Cal();
		System.out.println(cal.sum(1, 2));
		System.out.println(cal.sum(1.1, 2.2));
	}
}

class Cal {
	public int sum(int n1, int n2) {
		return n1 + n2;
	}

	public double sum(double n1, double n2) {
		return n1 + n2;
	}
}

运行结果:

这个例子中我们使用了方法重载来实现 sum 这个方法的多态,对方法 sum 传入不同的参数,可以看调用不同的 sum 函数,这就是多态的一种体现。

2、方法重写实现方法多态

package com.pack1;

public class Test {
	public static void main(String[] args) {
		Animal animal = new Animal();
		animal.makeSound();

		Dog dog = new Dog();
		dog.makeSound();
	}
}

class Animal {
	public void makeSound() {
		System.out.println("Animal make sound...");
	}
}

class Dog extends Animal {
	public void makeSound() {
		System.out.println("woof...");
	}
}

运行结果:

这一个例子就是通过方法重写实现多态,当我们对不同对象使用 makeSound 方法时,调用的 makeSound 方法也是不同的,这里方法重写也能体现多态。

三、对象多态

1、编译时类型和运行时类型

对象的多态主要体现在是编译时类型运行时类型。编译时类型是声明对象引用变量时使用的类型,也就是引用变量的类型,运行时类型是实际创建的对象的类型,也就是实际指向的对象的类型。

例如下面的一段代码:

package com.pack1;

public class Test {
	public static void main(String[] args) {
		Animal animal = new Dog();
	}
}

class Animal {
	
}

class Dog extends Animal {
	
}

这段代码中 Dog 为 Animal 类的子类,然后我们声明的一个 Animal 类的对象引用变量 animal ,然后创建一个 Dog 类的对象,将这个 Dog 类的对象的引用赋值给这个 Animal 类的对象引用变量 animal 。

这里的 animal 的编译时类型就是 Animal ,运行时类型就是 Dog 。

从这个例子中,我们可以总结出一些结论:

  • 编译时类型在声明对象引用变量时就确定了,不能改变;而运行类型是可以改变的。
  • 编译时类型看声明时的 “=” 左边,运行时类型看 “=” 右边。

2、向上转型(Upcasting)

上面的例子中我们可以看到我们使用一个 Animal 类的对象引用变量存储了一个 Dog 类的对象的引用,也就是使用一个父类引用变量指向了一个子类对象,实际上这个就是向上转型的本质。

所以说,向上转型(Upcasting)是指将子类对象的引用转换为父类类型的引用。在Java中,这是一个隐式的类型转换,因为子类对象本身就具备父类的所有特性和行为。因此,我们可以直接将子类对象赋值给父类引用,而不需要显式的类型转换。

向上转型的语法:

Parent parentRefe = new Child();

在这个例子中,Child 是&nb

### Java 封装、继承和多态的概念 #### 封装 (Encapsulation) 封装是一种面向对象编程的核心概念之一,它指的是隐藏类内部的状态细节并仅通过公共接口访问这些状态。这种机制可以保护数据不被外部直接修改,从而提高程序的安全性和可维护性。在 Java 中实现封装通常涉及以下几个方面: - 使用 `private` 访问修饰符来限制字段的可见性[^4]。 - 提供公有的 getter 和 setter 方法以便于控制对私有字段的访问[^5]。 ```java public class EncapsulationExample { private String data; public String getData() { return data; } public void setData(String data) { this.data = data; } } ``` #### 继承 (Inheritance) 继承允许一个类(子类)获取另一个类(父类)的方法和属性。这有助于重用现有代码并建立层次结构关系。Java 的继承特性可以通过关键字 `extends` 实现[^3]。需要注意的是,在某些情况下可能需要阻止某个类被其他类继承;此时可以使用 `final` 关键字声明该类不可再派生任何子类[^2]。 ```java class ParentClass { protected String attribute; } class ChildClass extends ParentClass { @Override public String toString(){ return super.attribute; } } ``` #### 多态 (Polymorphism) 多态意味着同一种行为具有多种不同表现形式的能力。它可以分为编译期多态(方法重载 Method Overloading)与运行时多态(方法覆盖 Method Overriding)[^1]。前者发生在同一个类中有多个相同名称但参数列表不同的方法定义上;后者则是指子类重新实现了来自其超类的一个具体版本的方法。 ```java // Example of Polymorphism through Method Overriding class Animal{ public void sound(){System.out.println("Animal makes a sound");} } class Dog extends Animal{ @Override public void sound(){System.out.println("Dog barks");} } public static void main(String args[]){ Animal myAnimal = new Dog(); // Upcasting myAnimal.sound(); } ``` 对于面试中的回答技巧来说: 当谈及 **封装** 时,应强调它是如何帮助管理复杂性的——即通过把逻辑分组到单独的对象里,并且只暴露必要的部分给外界交互。这样不仅简化了开发过程还增强了安全性。 关于 **继承**, 可以提到这是为了促进软件组件之间的共享而设计的一种方式, 它使得新类型的创建能够基于已存在的类型之上完成. 最后讨论到 **多态** 这一主题的时候,则要突出它的灵活性优势所在 —— 即使是在不知道确切类型的情况下也能调用适当的功能实现.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值