java--多态4

本文通过一个Java程序示例介绍了如何使用多态性来简化代码。通过父类引用指向不同子类对象的方式,实现了对多种类型实例的统一处理,提高了代码的复用性和扩展性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public class PolyTest {

public void run(QQ qq) {

qq.run();

}

public void run(BMW bmw) {

bmw.run();

}

public static void main(String[] args) {

PolyTest t = new PolyTest();

BMW bmw = new BMW();

t.run(bmw);

QQ qq = new QQ();

t.run(qq);

}

}

class Car {

public void run () {

System.out.println("car");

}

}

class QQ extends Car {

public void run () {

System.out.println("qq");

}

}

class BMW extends Car {

public void run () {

System.out.println("bmw");

}

}


如果还要继续添加很多车辆,那么照上面这个办法来做的话就会很费事,由于这些车辆是继承一个父类Car,所以我们可以直接声明它们的父类,然后再用父类的引用指向增加的车辆:

public class PolyTest {

public void run(Car car) {

car.run();//直接声明一个父类型的参数为car的方法

}

public static void main(String[] args) {

PolyTest t = new PolyTest();

Car car = new BMW();//父类的引用指向子类对象

t.run(car);//把参数car传给父类型方法里的参数car

Car car1 = new QQ();//父类的引用指向子类对象。这里也可以QQ qq = new QQ();这样的话就是把qq这个引用向上转换成父类的引用car,结果是一样的

t.run(car1);把参数car1传给父类型方法里的参数car

//如果还要继续添加车辆的话,

//Car car2 = new ...();或是... ... = new ...();

//.....

}

}

class Car {

public void run () {

System.out.println("car");

}

}

class QQ extends Car {

public void run () {

System.out.println("qq");

}

}

class BMW extends Car {

public void run () {

System.out.println("bmw");

}

}




### Java 面向对象编程中的封装、继承和多态 #### 封装的概念及应用 封装是一种信息隐藏技术,通过这种方式,对象的状态被保护起来不被外部直接访问。在Java中,可以通过设置类成员变量的访问权限来实现这一点。通常情况下,会将字段设为私有(private),并通过公有的(getter/setter)方法提供对外部访问这些字段的方式。 ```java class Person { private String name; public void setName(String newName){ this.name = newName; } public String getName(){ return this.name; } } ``` 这种做法不仅提高了数据的安全性和一致性,还允许开发者控制如何以及何时修改内部状态[^1]。 #### 继承的概念及应用 继承是面向对象编程的一个核心特性之一,在Java里它使得一个新创建出来的子类能够自动获得另一个已存在的父类属性与行为(即方法). 这样做的好处是可以减少重复代码并促进软件组件之间的可重用性. 当定义一个新的类时,如果这个新的类完全或者部分实现了现有某个其他类的功能,则可以让该新类从那个旧类那里“继承”。这表示新类将会拥有原类的所有非私有成员函数及其数据成员,并且还可以添加额外的新特征或改变已有特性的具体实现方式: ```java // 定义基类 Animal class Animal{ protected String sound=""; public void makeSound() { System.out.println(sound); } } // 创建 Dog 类继承自 Animal 并覆写了 makeSound 方法 class Dog extends Animal{ @Override public void makeSound(){sound ="Woof!";super.makeSound();} } ``` 上述例子展示了`Dog`类是如何基于`Animal`的基础上构建而成的同时又保持了自己的独特之处——发出不同的声音. #### 多态的概念及应用 多态指的是同一个操作作用于不同类型的对象上会产生不同类型的行为的现象。对于Java而言,主要体现在两个方面: - **编译期多态 (静态/早期绑定)** : 由方法重载(Method Overloading)所支持. - **运行时期多态 (动态/晚期绑定)** :这是指当调用了某个已被子类重新定义过的超类版本的方法时,实际执行的是最具体的派生类所提供的那一份实现而不是声明处指定的那个类型的方法体; 实现此机制的关键在于使用虚表(Virtual Table). 下面的例子说明了后者的工作原理: ```java class Shape { // 声明了一个名为 draw 的抽象方法 public abstract void draw(); } class Circle extends Shape { @Override public void draw() { System.out.println("Drawing a circle..."); } } class Rectangle extends Shape { @Override public void draw() { System.out.println("Drawing a rectangle..."); } } public class Main { public static void main(String[] args) { Shape s1=new Circle(); Shape s2= new Rectangle(); s1.draw(); // 输出 "Drawing a circle..." s2.draw(); // 输出 "Drawing a rectangle..." } } ``` 在这个案例里面,尽管`s1` 和 `s2` 变量都被声明为了`Shape` 类型,但在它们各自调用各自的`draw()` 函数的时候却展现出了不一样的效果 —— 即使是在相同的语法结构下也能表现出差异化的逻辑处理过程,这就是所谓的“多态”。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值